rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
changeset 1797 e109b671a19e
parent 1787 ea12a3bb4b33
child 1798 18b3a9a85716
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Tue Feb 24 11:12:53 2015 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Fri Feb 27 13:50:37 2015 +0100
     1.3 @@ -33,7 +33,7 @@
     1.4  
     1.5      private final Bck2Brwsr.Resources resources;
     1.6      private final ExportedSymbols exportedSymbols;
     1.7 -    private final StringArray invokerMethods;
     1.8 +    private final StringBuilder invokerMethods;
     1.9      private final StringArray asBinary;
    1.10      int exportedCount;
    1.11  
    1.12 @@ -45,7 +45,7 @@
    1.13          this.resources = resources;
    1.14          this.classDataCache = new ClassDataCache(resources);
    1.15          this.exportedSymbols = new ExportedSymbols(resources, explicitlyExported);
    1.16 -        this.invokerMethods = new StringArray();
    1.17 +        this.invokerMethods = new StringBuilder();
    1.18          this.asBinary = asBinary;
    1.19      }
    1.20  
    1.21 @@ -98,13 +98,7 @@
    1.22          append(
    1.23                  "\n  var invoker = {};");
    1.24          generateBody(names);
    1.25 -        for (String invokerMethod: invokerMethods.toArray()) {
    1.26 -            append("\n  invoker." + invokerMethod + " = function() {"
    1.27 -                + "\n    var target = arguments[0];"
    1.28 -                + "\n    return target['" + invokerMethod + "'].apply(target, Array.prototype.slice.call(arguments, 1));"
    1.29 -                + "\n  };"
    1.30 -            );
    1.31 -        }
    1.32 +        append(invokerMethods);
    1.33          
    1.34          for (String r : asBinary.toArray()) {
    1.35              append("\n  ").append(getExportsObject()).append("['registerResource']('");
    1.36 @@ -366,14 +360,28 @@
    1.37              return object + "." + mangledName + '(';
    1.38          }
    1.39  
    1.40 -        return accessThroughInvoker(object, mangledName, params > 1 ? "," : "");
    1.41 +        return accessThroughInvoker(object, mangledName, params);
    1.42      }
    1.43  
    1.44 -    private String accessThroughInvoker(String object, String mangledName, String sep) {
    1.45 -        if (!invokerMethods.contains(mangledName)) {
    1.46 -            invokerMethods.add(mangledName);
    1.47 +    private String accessThroughInvoker(String object, String mangledName, int params) 
    1.48 +    throws IOException {
    1.49 +        String def = "\n  invoker." + mangledName + " = function(target";
    1.50 +        if (invokerMethods.indexOf(def) == -1) {
    1.51 +            invokerMethods.append(def);
    1.52 +            for (int j = 0; j < params; j++) {
    1.53 +                invokerMethods.append(", p").append(j);
    1.54 +            }
    1.55 +            invokerMethods.append(") {\n    return target['").
    1.56 +                append(mangledName).append("'](");
    1.57 +            for (int j = 0; j < params; j++) {
    1.58 +                if (j > 0) {
    1.59 +                    invokerMethods.append(",");
    1.60 +                }
    1.61 +                invokerMethods.append("p").append(j);
    1.62 +            }
    1.63 +            invokerMethods.append(");\n  };");
    1.64          }
    1.65 -        return "invoker." + mangledName + '(' + object + sep;
    1.66 +        return "invoker." + mangledName + '(' + object + (params > 1 ? "," : "");
    1.67      }
    1.68  
    1.69      private boolean isHierarchyExported(final MethodData methodData)