# HG changeset patch # User Jaroslav Tulach # Date 1401350221 -7200 # Node ID 81926ff1158751045c8bdf83b1367a33c94edcca # Parent 9979d55fe942c4cf2c36bc20678b08a69a17898b Lowering number of actions in invoker by half diff -r 9979d55fe942 -r 81926ff11587 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed May 28 15:18:23 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu May 29 09:57:01 2014 +0200 @@ -96,10 +96,12 @@ } protected String accessVirtualMethod( - String object, - String mangledName, - String[] fieldInfoName) throws IOException { - return object + "." + mangledName; + String object, + String mangledName, + String[] fieldInfoName, + int params + ) throws IOException { + return object + "." + mangledName + '('; } protected void declaredClass(ClassData classData, String mangledName) @@ -1654,8 +1656,7 @@ .append(" = "); } - append(accessVirtualMethod(vars[0].toString(), mn, mi)); - append('('); + append(accessVirtualMethod(vars[0].toString(), mn, mi, numArguments)); String sep = ""; for (int j = 1; j < numArguments; ++j) { append(sep); diff -r 9979d55fe942 -r 81926ff11587 rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Wed May 28 15:18:23 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Thu May 29 09:57:01 2014 +0200 @@ -98,10 +98,9 @@ "\n var invoker = {};"); generateBody(names); for (String invokerMethod: invokerMethods.toArray()) { - append("\n invoker." + invokerMethod + " = function(target) {" - + "\n return function() {" - + "\n return target['" + invokerMethod + "'].apply(target, arguments);" - + "\n };" + append("\n invoker." + invokerMethod + " = function() {" + + "\n var target = arguments[0];" + + "\n return target['" + invokerMethod + "'].apply(target, Array.prototype.slice.call(arguments, 1));" + "\n };" ); } @@ -366,9 +365,11 @@ @Override protected String accessVirtualMethod( - String object, - String mangledName, - String[] fieldInfoName) throws IOException { + String object, + String mangledName, + String[] fieldInfoName, + int params + ) throws IOException { final ClassData referencedClass = classDataCache.getClassData(fieldInfoName[0]); final MethodData method = @@ -382,17 +383,17 @@ || ((referencedClass.getAccessFlags() & ByteCodeParser.ACC_FINAL) != 0) || !isHierarchyExported(method))) { - return object + "." + mangledName; + return object + "." + mangledName + '('; } - return accessThroughInvoker(object, mangledName); + return accessThroughInvoker(object, mangledName, params > 1 ? "," : ""); } - private String accessThroughInvoker(String object, String mangledName) { + private String accessThroughInvoker(String object, String mangledName, String sep) { if (!invokerMethods.contains(mangledName)) { invokerMethods.add(mangledName); } - return "invoker." + mangledName + '(' + object + ')'; + return "invoker." + mangledName + '(' + object + sep; } private boolean isHierarchyExported(final MethodData methodData)