# HG changeset patch # User Jaroslav Tulach # Date 1425041437 -3600 # Node ID e109b671a19e0d3eb7f98153eedc35b244cb311d # Parent 136787ac00d3a33e0526846ccabc5f292eaf8dac V8 has occational problems with Array.prototype.slice.call. Replacing it with directly enumerated parameters. diff -r 136787ac00d3 -r e109b671a19e rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Fri Feb 27 12:06:58 2015 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Fri Feb 27 13:50:37 2015 +0100 @@ -33,7 +33,7 @@ private final Bck2Brwsr.Resources resources; private final ExportedSymbols exportedSymbols; - private final StringArray invokerMethods; + private final StringBuilder invokerMethods; private final StringArray asBinary; int exportedCount; @@ -45,7 +45,7 @@ this.resources = resources; this.classDataCache = new ClassDataCache(resources); this.exportedSymbols = new ExportedSymbols(resources, explicitlyExported); - this.invokerMethods = new StringArray(); + this.invokerMethods = new StringBuilder(); this.asBinary = asBinary; } @@ -98,13 +98,7 @@ append( "\n var invoker = {};"); generateBody(names); - for (String invokerMethod: invokerMethods.toArray()) { - append("\n invoker." + invokerMethod + " = function() {" - + "\n var target = arguments[0];" - + "\n return target['" + invokerMethod + "'].apply(target, Array.prototype.slice.call(arguments, 1));" - + "\n };" - ); - } + append(invokerMethods); for (String r : asBinary.toArray()) { append("\n ").append(getExportsObject()).append("['registerResource']('"); @@ -366,14 +360,28 @@ return object + "." + mangledName + '('; } - return accessThroughInvoker(object, mangledName, params > 1 ? "," : ""); + return accessThroughInvoker(object, mangledName, params); } - private String accessThroughInvoker(String object, String mangledName, String sep) { - if (!invokerMethods.contains(mangledName)) { - invokerMethods.add(mangledName); + private String accessThroughInvoker(String object, String mangledName, int params) + throws IOException { + String def = "\n invoker." + mangledName + " = function(target"; + if (invokerMethods.indexOf(def) == -1) { + invokerMethods.append(def); + for (int j = 0; j < params; j++) { + invokerMethods.append(", p").append(j); + } + invokerMethods.append(") {\n return target['"). + append(mangledName).append("']("); + for (int j = 0; j < params; j++) { + if (j > 0) { + invokerMethods.append(","); + } + invokerMethods.append("p").append(j); + } + invokerMethods.append(");\n };"); } - return "invoker." + mangledName + '(' + object + sep; + return "invoker." + mangledName + '(' + object + (params > 1 ? "," : ""); } private boolean isHierarchyExported(final MethodData methodData)