# HG changeset patch # User Jaroslav Tulach # Date 1354106493 -3600 # Node ID 9dc53108d3df27a02352e5f5bed57eba000d1513 # Parent 597f96a8e99894a75d9db9a7ab47a55c99246ace Using named function expression allows an easy self reference from inside the function. Plus giving byte code tranlators a chance to customize the field to store the method into diff -r 597f96a8e998 -r 9dc53108d3df vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed Nov 28 00:29:00 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed Nov 28 13:41:33 2012 +0100 @@ -49,6 +49,16 @@ * @param resourcePath name of resources to read */ protected abstract void requireScript(String resourcePath); + + /** Allows subclasses to redefine what field a function representing a + * class gets assigned. By default it returns the suggested name followed + * by " = "; + * + * @param className suggested name of the class + */ + protected String assignClass(String className) { + return className + " = "; + } /** * Converts a given class file to a JavaScript version. @@ -74,23 +84,21 @@ } StringArray toInitilize = new StringArray(); final String className = className(jc); - out.append("\n\n").append(className); - out.append(" = function() {"); - out.append("\n if (!").append(className). - append(".prototype.$instOf_").append(className).append(") {"); + out.append("\n\n").append(assignClass(className)); + out.append("function CLS() {"); + out.append("\n if (!CLS.prototype.$instOf_").append(className).append(") {"); for (FieldData v : jc.getFields()) { if (v.isStatic()) { - generateStaticField(v); + out.append("\n CLS.").append(v.getName()).append(initField(v)); } } // ClassName sc = jc.getSuperClass(); String sc = jc.getSuperClassName(); // with _ if (sc != null) { - out.append("\n var p = ").append(className) - .append(".prototype = "). + out.append("\n var p = CLS.prototype = "). append(sc.replace('/', '_')).append("(true);"); } else { - out.append("\n var p = ").append(className).append(".prototype;"); + out.append("\n var p = CLS.prototype;"); } for (MethodData m : jc.getMethods()) { if (m.isStatic()) { @@ -104,7 +112,7 @@ out.append("\n p.$instOf_").append(superInterface.replace('/', '_')).append(" = true;"); } out.append("\n if (arguments.length === 0) {"); - out.append("\n return new ").append(className).append("();"); + out.append("\n return new CLS();"); out.append("\n }"); out.append("\n }"); out.append("\n if (arguments.length === 0) {"); @@ -116,7 +124,7 @@ } out.append("\n return this;"); out.append("\n }"); - out.append("\n return new ").append(className).append(";"); + out.append("\n return new CLS;"); out.append("\n}"); StringBuilder sb = new StringBuilder(); for (String init : toInitilize.toArray()) { @@ -833,12 +841,6 @@ } } - private void generateStaticField(FieldData v) throws IOException { - out.append("\n ") - .append(className(jc)) - .append('.').append(v.getName()).append(initField(v)); - } - private String findMethodName(MethodData m, StringBuilder cnt) { StringBuilder name = new StringBuilder(); if ("".equals(m.getName())) { // NOI18N diff -r 597f96a8e998 -r 9dc53108d3df vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java Wed Nov 28 00:29:00 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java Wed Nov 28 13:41:33 2012 +0100 @@ -43,4 +43,9 @@ @Override protected void requireScript(String resourcePath) { } + + @Override + protected String assignClass(String className) { + return "arguments[0][arguments[1]]="; + } } diff -r 597f96a8e998 -r 9dc53108d3df vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java Wed Nov 28 00:29:00 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java Wed Nov 28 13:41:33 2012 +0100 @@ -53,9 +53,7 @@ sb.append("\n this.constructor.prototype.loadClass = function(res, name) {"); sb.append("\n var script = org_apidesign_vm4brwsr_VMLazy(true).toJavaScriptLjava_lang_StringAB(loader.get(res + '.class'));"); sb.append("\n try {"); - sb.append("\n new Function("); - sb.append("\n 'arguments[0][arguments[1]]=' + script + ';'"); - sb.append("\n )(self, name);"); + sb.append("\n new Function(script)(self, name);"); sb.append("\n } catch (ex) {"); sb.append("\n throw 'Cannot compile ' + res + ' error: ' + ex + ' script:\\n' + script;"); sb.append("\n };");