# HG changeset patch # User Jaroslav Tulach # Date 1355732515 -3600 # Node ID 086121d2690a5c183794e93e96f87c49cbf25ee0 # Parent 23b4a344fe0287f29d5a501778d0fa8e6b0a7344 Lazy functions need to remember whether they need to create instance or not diff -r 23b4a344fe02 -r 086121d2690a vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Sun Dec 16 18:49:35 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Mon Dec 17 09:21:55 2012 +0100 @@ -47,10 +47,10 @@ static Object load(Object loader, String name, Object[] arguments) throws IOException, ClassNotFoundException { - return new VMLazy(loader, arguments).load(name); + return new VMLazy(loader, arguments).load(name, false); } - private Object load(String name) + private Object load(String name, boolean instance) throws IOException, ClassNotFoundException { String res = name.replace('.', '/') + ".class"; byte[] arr = read(loader, res, args); @@ -64,7 +64,7 @@ new Gen(this, out).compile(new ByteArrayInputStream(arr)); String code = out.toString().toString(); String under = name.replace('.', '_'); - return applyCode(loader, under, code); + return applyCode(loader, under, code, instance); } /* possibly not needed: @@ -76,15 +76,15 @@ */ - @JavaScriptBody(args = {"loader", "name", "script" }, body = + @JavaScriptBody(args = {"loader", "name", "script", "instance" }, body = "try {\n" + " new Function(script)(loader, name);\n" + "} catch (ex) {\n" + " throw 'Cannot compile ' + ex + ' line: ' + ex.lineNumber + ' script:\\n' + script;\n" + "}\n" + - "return vm[name](false);\n" + "return vm[name](instance);\n" ) - private static native Object applyCode(Object loader, String name, String script); + private static native Object applyCode(Object loader, String name, String script, boolean instance); private static final class Gen extends ByteCodeToJavaScript { @@ -104,7 +104,8 @@ + "\nvar vm = loader.vm;" + "\nif (vm[cls]) return false;" + "\nvm[cls] = function() {" - + "\n return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2(lazy, dot);" + + "\n var instance = arguments.length == 0 || arguments[0] === true;" + + "\n return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(lazy, dot, instance);" + "\n};" + "\nreturn true;") @Override diff -r 23b4a344fe02 -r 086121d2690a vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java Sun Dec 16 18:49:35 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java Mon Dec 17 09:21:55 2012 +0100 @@ -86,8 +86,19 @@ return sb.toString().toString(); } + @Compare + public String nullFieldInitialized() { + NullField nf = new NullField(); + return ("" + nf.name).toString(); + } + @Factory public static Object[] create() { return CompareVMs.create(CompareStringsTest.class); } + + private static final class NullField { + + String name; + } }