# HG changeset patch # User Jaroslav Tulach # Date 1356035956 -3600 # Node ID f6a165f7f00f6330a256201130c9a76804838a85 # Parent dc375a56fd15a2b51be3dad75ccb94bf087e8c69 Loaded classes need to have their static initializes invoked. Before accessing static field of a class, initializers need to be executed as well. diff -r dc375a56fd15 -r f6a165f7f00f javaquery/demo-calculator/src/main/resources/org/apidesign/bck2brwsr/mavenhtml/Calculator.xhtml --- a/javaquery/demo-calculator/src/main/resources/org/apidesign/bck2brwsr/mavenhtml/Calculator.xhtml Thu Dec 20 16:17:31 2012 +0100 +++ b/javaquery/demo-calculator/src/main/resources/org/apidesign/bck2brwsr/mavenhtml/Calculator.xhtml Thu Dec 20 21:39:16 2012 +0100 @@ -80,7 +80,7 @@
diff -r dc375a56fd15 -r f6a165f7f00f vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Dec 20 16:17:31 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Dec 20 21:39:16 2012 +0100 @@ -1029,7 +1029,7 @@ int indx = readIntArg(byteCodes, i); String[] fi = jc.getFieldInfoName(indx); final int type = VarType.fromFieldType(fi[2].charAt(0)); - emit(out, "@1 = @2.@3;", + emit(out, "@1 = @2(false).constructor.@3;", smapper.pushT(type), accessClass(fi[0].replace('/', '_')), fi[1]); i += 2; @@ -1049,7 +1049,7 @@ int indx = readIntArg(byteCodes, i); String[] fi = jc.getFieldInfoName(indx); final int type = VarType.fromFieldType(fi[2].charAt(0)); - emit(out, "@1.@2 = @3;", + emit(out, "@1(false).constructor.@2 = @3;", accessClass(fi[0].replace('/', '_')), fi[1], smapper.popT(type)); i += 2; diff -r dc375a56fd15 -r f6a165f7f00f vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Thu Dec 20 16:17:31 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Thu Dec 20 21:39:16 2012 +0100 @@ -61,10 +61,27 @@ StringBuilder out = new StringBuilder(); out.append("var loader = arguments[0];\n"); out.append("var vm = loader.vm;\n"); - new Gen(this, out).compile(new ByteArrayInputStream(arr)); + int prelude = out.length(); + String initCode = new Gen(this, out).compile(new ByteArrayInputStream(arr)); String code = out.toString().toString(); +// dump("Loading " + name); + dump(code); String under = name.replace('.', '_'); - return applyCode(loader, under, code, instance); + Object fn = applyCode(loader, under, code, instance); + + if (!initCode.isEmpty()) { + out.setLength(prelude); + out.append(initCode); + code = out.toString().toString(); + dump(code); + applyCode(loader, null, code, false); + } + + return fn; + } + +// @JavaScriptBody(args = "s", body = "java.lang.System.out.println(s.toString());") + static void dump(String s) { } /* possibly not needed: @@ -82,7 +99,7 @@ "} catch (ex) {\n" + " throw 'Cannot compile ' + ex + ' line: ' + ex.lineNumber + ' script:\\n' + script;\n" + "}\n" + - "return vm[name](instance);\n" + "return name != null ? vm[name](instance) : null;\n" ) private static native Object applyCode(Object loader, String name, String script, boolean instance); diff -r dc375a56fd15 -r f6a165f7f00f vmtest/src/test/java/org/apidesign/bck2brwsr/tck/CompareHashTest.java --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/CompareHashTest.java Thu Dec 20 16:17:31 2012 +0100 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/CompareHashTest.java Thu Dec 20 21:39:16 2012 +0100 @@ -35,6 +35,10 @@ return o.hashCode() - o.hashCode(); } + @Compare public int initializeInStatic() { + return StaticUse.NON_NULL.hashCode() - StaticUse.NON_NULL.hashCode(); + } + @Factory public static Object[] create() { return VMTest.create(CompareHashTest.class); diff -r dc375a56fd15 -r f6a165f7f00f vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUse.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUse.java Thu Dec 20 21:39:16 2012 +0100 @@ -0,0 +1,22 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.bck2brwsr.tck; + +class StaticUse { + public static final Object NON_NULL = new Object(); +}