Merge in proper initialization of instance fields of just loaded classes
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 17 Dec 2012 09:48:42 +0100
changeset 338d377291de3bc
parent 337 adbf21ccc315
parent 328 086121d2690a
child 339 7579a0ee92fb
Merge in proper initialization of instance fields of just loaded classes
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Mon Dec 17 09:47:08 2012 +0100
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Mon Dec 17 09:48:42 2012 +0100
     1.3 @@ -47,10 +47,10 @@
     1.4      
     1.5      static Object load(Object loader, String name, Object[] arguments) 
     1.6      throws IOException, ClassNotFoundException {
     1.7 -        return new VMLazy(loader, arguments).load(name);
     1.8 +        return new VMLazy(loader, arguments).load(name, false);
     1.9      }
    1.10      
    1.11 -    private Object load(String name)
    1.12 +    private Object load(String name, boolean instance)
    1.13      throws IOException, ClassNotFoundException {
    1.14          String res = name.replace('.', '/') + ".class";
    1.15          byte[] arr = read(loader, res, args);
    1.16 @@ -64,7 +64,7 @@
    1.17          new Gen(this, out).compile(new ByteArrayInputStream(arr));
    1.18          String code = out.toString().toString();
    1.19          String under = name.replace('.', '_');
    1.20 -        return applyCode(loader, under, code);
    1.21 +        return applyCode(loader, under, code, instance);
    1.22      }
    1.23  
    1.24  /* possibly not needed:
    1.25 @@ -76,15 +76,15 @@
    1.26  */
    1.27      
    1.28  
    1.29 -    @JavaScriptBody(args = {"loader", "name", "script" }, body =
    1.30 +    @JavaScriptBody(args = {"loader", "name", "script", "instance" }, body =
    1.31          "try {\n" +
    1.32          "  new Function(script)(loader, name);\n" +
    1.33          "} catch (ex) {\n" +
    1.34          "  throw 'Cannot compile ' + ex + ' line: ' + ex.lineNumber + ' script:\\n' + script;\n" +
    1.35          "}\n" +
    1.36 -        "return vm[name](false);\n"
    1.37 +        "return vm[name](instance);\n"
    1.38      )
    1.39 -    private static native Object applyCode(Object loader, String name, String script);
    1.40 +    private static native Object applyCode(Object loader, String name, String script, boolean instance);
    1.41      
    1.42      
    1.43      private static final class Gen extends ByteCodeToJavaScript {
    1.44 @@ -104,7 +104,8 @@
    1.45          + "\nvar vm = loader.vm;"
    1.46          + "\nif (vm[cls]) return false;"
    1.47          + "\nvm[cls] = function() {"
    1.48 -        + "\n  return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2(lazy, dot);"
    1.49 +        + "\n  var instance = arguments.length == 0 || arguments[0] === true;"
    1.50 +        + "\n  return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(lazy, dot, instance);"
    1.51          + "\n};"
    1.52          + "\nreturn true;")
    1.53          @Override
     2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java	Mon Dec 17 09:47:08 2012 +0100
     2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java	Mon Dec 17 09:48:42 2012 +0100
     2.3 @@ -86,8 +86,19 @@
     2.4          return sb.toString().toString();
     2.5      }
     2.6          
     2.7 +    @Compare
     2.8 +    public String nullFieldInitialized() {
     2.9 +        NullField nf = new NullField();
    2.10 +        return ("" + nf.name).toString();
    2.11 +    }
    2.12 +
    2.13      @Factory
    2.14      public static Object[] create() {
    2.15          return CompareVMs.create(CompareStringsTest.class);
    2.16      }
    2.17 +
    2.18 +    private static final class NullField {
    2.19 +
    2.20 +        String name;
    2.21 +    }
    2.22  }