V8 has problems optimizing try/catch. Putting such construct into methods that is always called was certainly not the brightest idea.
1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Feb 27 10:52:26 2015 +0100
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Feb 27 12:06:58 2015 +0100
1.3 @@ -279,10 +279,7 @@
1.4 && (m.getAccess() & ACC_STATIC) == 0
1.5 && (m.getAccess() & ACC_PRIVATE) == 0) {
1.6 final String mn = findMethodName(m, new StringBuilder());
1.7 - append("\n try {");
1.8 - append("\n if (!x['").append(mn).append("']) Object.defineProperty(x, '").append(mn).append("', { value : c['").append(mn).append("']});");
1.9 - append("\n } catch (ignore) {");
1.10 - append("\n }");
1.11 + append("\n if (!x['").append(mn).append("']) Object.defineProperty(x, '").append(mn).append("', { value : c['").append(mn).append("']});");
1.12 }
1.13 }
1.14 }
1.15 @@ -292,11 +289,8 @@
1.16 requireReference(superInterface);
1.17 }
1.18 append("\n }");
1.19 - append("\n try {");
1.20 - append("\n Object.defineProperty(c, 'fillInstOf', { value: ").append(className).append("fillInstOf });");
1.21 - append("\n ").append(className).append("fillInstOf(c);");
1.22 - append("\n } catch (ignore) {");
1.23 - append("\n }");
1.24 + append("\n if (!c.hasOwnProperty('fillInstOf')) Object.defineProperty(c, 'fillInstOf', { value: ").append(className).append("fillInstOf });");
1.25 + append("\n ").append(className).append("fillInstOf(c);");
1.26 // obfuscationDelegate.exportJSProperty(this, "c", instOfName);
1.27 append("\n CLS.$class = 'temp';");
1.28 append("\n CLS.$class = ");