Lowering number of actions in invoker by half closure
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 29 May 2014 09:57:01 +0200
branchclosure
changeset 161381926ff11587
parent 1612 9979d55fe942
child 1614 8eba262bd8cd
Lowering number of actions in invoker by half
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Wed May 28 15:18:23 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu May 29 09:57:01 2014 +0200
     1.3 @@ -96,10 +96,12 @@
     1.4      }
     1.5  
     1.6      protected String accessVirtualMethod(
     1.7 -                             String object,
     1.8 -                             String mangledName,
     1.9 -                             String[] fieldInfoName) throws IOException {
    1.10 -        return object + "." + mangledName;
    1.11 +            String object, 
    1.12 +            String mangledName, 
    1.13 +            String[] fieldInfoName, 
    1.14 +            int params
    1.15 +    ) throws IOException {
    1.16 +        return object + "." + mangledName + '(';
    1.17      }
    1.18  
    1.19      protected void declaredClass(ClassData classData, String mangledName)
    1.20 @@ -1654,8 +1656,7 @@
    1.21                 .append(" = ");
    1.22          }
    1.23  
    1.24 -        append(accessVirtualMethod(vars[0].toString(), mn, mi));
    1.25 -        append('(');
    1.26 +        append(accessVirtualMethod(vars[0].toString(), mn, mi, numArguments));
    1.27          String sep = "";
    1.28          for (int j = 1; j < numArguments; ++j) {
    1.29              append(sep);
     2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 28 15:18:23 2014 +0200
     2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu May 29 09:57:01 2014 +0200
     2.3 @@ -98,10 +98,9 @@
     2.4                  "\n  var invoker = {};");
     2.5          generateBody(names);
     2.6          for (String invokerMethod: invokerMethods.toArray()) {
     2.7 -            append("\n  invoker." + invokerMethod + " = function(target) {"
     2.8 -                + "\n    return function() {"
     2.9 -                + "\n      return target['" + invokerMethod + "'].apply(target, arguments);"
    2.10 -                + "\n    };"
    2.11 +            append("\n  invoker." + invokerMethod + " = function() {"
    2.12 +                + "\n    var target = arguments[0];"
    2.13 +                + "\n    return target['" + invokerMethod + "'].apply(target, Array.prototype.slice.call(arguments, 1));"
    2.14                  + "\n  };"
    2.15              );
    2.16          }
    2.17 @@ -366,9 +365,11 @@
    2.18  
    2.19      @Override
    2.20      protected String accessVirtualMethod(
    2.21 -                             String object,
    2.22 -                             String mangledName,
    2.23 -                             String[] fieldInfoName) throws IOException {
    2.24 +            String object, 
    2.25 +            String mangledName, 
    2.26 +            String[] fieldInfoName, 
    2.27 +            int params
    2.28 +    ) throws IOException {
    2.29          final ClassData referencedClass =
    2.30                  classDataCache.getClassData(fieldInfoName[0]);
    2.31          final MethodData method =
    2.32 @@ -382,17 +383,17 @@
    2.33                          || ((referencedClass.getAccessFlags()
    2.34                                   & ByteCodeParser.ACC_FINAL) != 0)
    2.35                          || !isHierarchyExported(method))) {
    2.36 -            return object + "." + mangledName;
    2.37 +            return object + "." + mangledName + '(';
    2.38          }
    2.39  
    2.40 -        return accessThroughInvoker(object, mangledName);
    2.41 +        return accessThroughInvoker(object, mangledName, params > 1 ? "," : "");
    2.42      }
    2.43  
    2.44 -    private String accessThroughInvoker(String object, String mangledName) {
    2.45 +    private String accessThroughInvoker(String object, String mangledName, String sep) {
    2.46          if (!invokerMethods.contains(mangledName)) {
    2.47              invokerMethods.add(mangledName);
    2.48          }
    2.49 -        return "invoker." + mangledName + '(' + object + ')';
    2.50 +        return "invoker." + mangledName + '(' + object + sep;
    2.51      }
    2.52  
    2.53      private boolean isHierarchyExported(final MethodData methodData)