We can load in dependant classes lazy
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 28 Nov 2012 14:51:52 +0100
branchlazy
changeset 214a0f4460130b9
parent 213 9dc53108d3df
child 215 cdd00892d06e
We can load in dependant classes
emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js
vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java
vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java
     1.1 --- a/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js	Wed Nov 28 13:41:33 2012 +0100
     1.2 +++ b/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js	Wed Nov 28 14:51:52 2012 +0100
     1.3 @@ -409,6 +409,7 @@
     1.4  }
     1.5  java_lang_String.prototype = new String;
     1.6  java_lang_String.prototype.toString = function() { return this.r; };;
     1.7 +java_lang_String.prototype.valueOf = function() { return this.toString().valueOf(); };;
     1.8  //java_lang_String_classV();
     1.9  
    1.10  /* new method for JavaScript String */
     2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java	Wed Nov 28 13:41:33 2012 +0100
     2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java	Wed Nov 28 14:51:52 2012 +0100
     2.3 @@ -19,25 +19,42 @@
     2.4  
     2.5  import java.io.ByteArrayInputStream;
     2.6  import java.io.IOException;
     2.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
     2.8  
     2.9  /**
    2.10   *
    2.11   * @author Jaroslav Tulach <jtulach@netbeans.org>
    2.12   */
    2.13  class VMLazy extends ByteCodeToJavaScript {
    2.14 -    private VMLazy(Appendable out) {
    2.15 +    private final Object vm;
    2.16 +    private final Object global;
    2.17 +    
    2.18 +    private VMLazy(Object global, Object vm, Appendable out) {
    2.19          super(out);
    2.20 +        this.vm = vm;
    2.21 +        this.global = global;
    2.22      }
    2.23      
    2.24 -    static String toJavaScript(byte[] is) throws IOException {
    2.25 +    static String toJavaScript(Object global, Object vm, byte[] is) throws IOException {
    2.26          StringBuilder sb = new StringBuilder();
    2.27 -        new VMLazy(sb).compile(new ByteArrayInputStream(is));
    2.28 +        new VMLazy(global, vm, sb).compile(new ByteArrayInputStream(is));
    2.29          return sb.toString().toString();
    2.30      }
    2.31  
    2.32 +    @JavaScriptBody(args = { "self", "n" }, 
    2.33 +        body=
    2.34 +          "var cls = n.replaceLjava_lang_StringCC(n,'/','_').toString();"
    2.35 +        + "var glb = self.fld_global;"
    2.36 +        + "var vm = self.fld_vm;"
    2.37 +        + "if (glb[cls]) return false;"
    2.38 +        + "glb[cls] = function() {"
    2.39 +        + "  return vm.loadClass(n,cls);"
    2.40 +        + "};"
    2.41 +        + "return true;"
    2.42 +    )
    2.43      @Override
    2.44      protected boolean requireReference(String internalClassName) {
    2.45 -        return false;
    2.46 +        throw new UnsupportedOperationException();
    2.47      }
    2.48  
    2.49      @Override
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java	Wed Nov 28 13:41:33 2012 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java	Wed Nov 28 14:51:52 2012 +0100
     3.3 @@ -42,16 +42,21 @@
     3.4          StringBuilder sb = new StringBuilder();
     3.5          
     3.6          sb.append("\nfunction test(clazz, as, method) {");
     3.7 -        sb.append("\n  var l = new lazyVM();");
     3.8 +        sb.append("\n  var l = new lazyVM(this);");
     3.9          sb.append("\n  var c = l.loadClass(clazz, as);");
    3.10          sb.append("\n  return c[method]();");
    3.11          sb.append("\n}");
    3.12          
    3.13          
    3.14 -        sb.append("\nfunction lazyVM() {");
    3.15 +        sb.append("\nfunction lazyVM(global) {");
    3.16          sb.append("\n  var self = this;");
    3.17 -        sb.append("\n  this.constructor.prototype.loadClass = function(res, name) {");
    3.18 -        sb.append("\n    var script = org_apidesign_vm4brwsr_VMLazy(true).toJavaScriptLjava_lang_StringAB(loader.get(res + '.class'));");
    3.19 +        sb.append("\n  var glb = global;");
    3.20 +        sb.append("\n  lazyVM.prototype.loadClass = function(res, name) {");
    3.21 +        sb.append("\n    var script = org_apidesign_vm4brwsr_VMLazy(true)."
    3.22 +            + "toJavaScriptLjava_lang_StringLjava_lang_ObjectLjava_lang_ObjectAB("
    3.23 +            + "  glb, self,"
    3.24 +            + "  loader.get(res + '.class')"
    3.25 +            + ");");
    3.26          sb.append("\n    try {");
    3.27          sb.append("\n      new Function(script)(self, name);");
    3.28          sb.append("\n    } catch (ex) {");
    3.29 @@ -75,7 +80,12 @@
    3.30              "org/apidesign/vm4brwsr/StaticMethod", "org_apidesign_vm4brwsr_StaticMethod", "minusOneI"
    3.31          );
    3.32      }
    3.33 -    
    3.34 +
    3.35 +    @Test public void loadDependantClass() throws Exception {
    3.36 +        assertExec("Trying to get zero", "test", Double.valueOf(0),
    3.37 +            "org/apidesign/vm4brwsr/InstanceSub", "org_apidesign_vm4brwsr_InstanceSub", "recallDblD"
    3.38 +        );
    3.39 +    }
    3.40  
    3.41      private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
    3.42          Object ret = null;