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)