Trying to make the static compilation mode as close to lazy one as possible: Class initializer method are not executed until the class is really referenced.
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 10 Mar 2013 21:28:00 +0100
changeset 834b0b23e5ebf9d
parent 833 32de22658040
child 835 24096bd2b38a
Trying to make the static compilation mode as close to lazy one as possible: Class initializer method are not executed until the class is really referenced.
javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ProcessPageTest.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUse.java
     1.1 --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ProcessPageTest.java	Sun Mar 10 21:27:06 2013 +0100
     1.2 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ProcessPageTest.java	Sun Mar 10 21:28:00 2013 +0100
     1.3 @@ -180,6 +180,9 @@
     1.4          }
     1.5          Bck2Brwsr.generate(sb, ProcessPageTest.class.getClassLoader(), names);
     1.6          sb.append("var vm = this.bck2brwsr();\n");
     1.7 +        for (String c : names) {
     1.8 +            sb.append("vm.loadClass('").append(c.replace('/', '.')).append("');\n");
     1.9 +        }
    1.10          
    1.11          ScriptEngineManager sem = new ScriptEngineManager();
    1.12          ScriptEngine js = sem.getEngineByExtension("js");
     2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Mar 10 21:27:06 2013 +0100
     2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Mar 10 21:28:00 2013 +0100
     2.3 @@ -191,6 +191,9 @@
     2.4              generateAnno(jc, out, classAnno);
     2.5              out.append("\n    };");
     2.6          }
     2.7 +        for (String init : toInitilize.toArray()) {
     2.8 +            out.append("\n    ").append(init).append("();");
     2.9 +        }
    2.10          out.append("\n  }");
    2.11          out.append("\n  if (arguments.length === 0) {");
    2.12          out.append("\n    if (!(this instanceof CLS)) {");
    2.13 @@ -219,11 +222,11 @@
    2.14          out.append("\n  }");
    2.15          out.append("\n  return arguments[0] ? new CLS() : CLS.prototype;");
    2.16          out.append("\n};");
    2.17 -        StringBuilder sb = new StringBuilder();
    2.18 -        for (String init : toInitilize.toArray()) {
    2.19 -            sb.append("\n").append(init).append("();");
    2.20 -        }
    2.21 -        return sb.toString();
    2.22 +//        StringBuilder sb = new StringBuilder();
    2.23 +//        for (String init : toInitilize.toArray()) {
    2.24 +//            sb.append("\n").append(init).append("();");
    2.25 +//        }
    2.26 +        return "";
    2.27      }
    2.28      private String generateStaticMethod(String prefix, MethodData m, StringArray toInitilize) throws IOException {
    2.29          String jsb = javaScriptBody(prefix, m, true);
     3.1 --- a/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUse.java	Sun Mar 10 21:27:06 2013 +0100
     3.2 +++ b/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUse.java	Sun Mar 10 21:28:00 2013 +0100
     3.3 @@ -19,6 +19,13 @@
     3.4  
     3.5  class StaticUse {
     3.6      public static final Object NON_NULL = new Object();
     3.7 +    public static int cnt;
     3.8 +    static {
     3.9 +        if (cnt++ != 0) {
    3.10 +            throw new IllegalStateException("Multiple initialization of a <cinit>");
    3.11 +        }
    3.12 +    }
    3.13 +    
    3.14      StaticUse() {
    3.15      }
    3.16