loadClass is loadBytes+reload closure
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 14 May 2014 21:49:44 +0200
branchclosure
changeset 15789e6b613a00ed
parent 1577 042d0f256e95
child 1579 d009c6ca8ce1
loadClass is loadBytes+reload
rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 14 21:24:24 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 14 21:49:44 2014 +0200
     1.3 @@ -249,47 +249,6 @@
     1.4                  }
     1.5              }
     1.6          }
     1.7 -/*
     1.8 -        append(
     1.9 -              "  return vm;\n"
    1.10 -            + "  };\n"
    1.11 -            + "  function mangleClass(name) {\n"
    1.12 -            + "    return name.replace__Ljava_lang_String_2Ljava_lang_CharSequence_2Ljava_lang_CharSequence_2(\n"
    1.13 -            + "      '_', '_1').replace__Ljava_lang_String_2CC('.','_');\n"
    1.14 -            + "  };\n"
    1.15 -            + "  global.bck2brwsr = function() {\n"
    1.16 -            + "    var args = Array.prototype.slice.apply(arguments);\n"
    1.17 -            + "    var vm = fillInVMSkeleton({});\n"
    1.18 -            + "    var loader = {};\n"
    1.19 -            + "    loader.vm = vm;\n"
    1.20 -            + "    loader.loadClass = function(name) {\n"
    1.21 -            + "      var attr = mangleClass(name);\n"
    1.22 -            + "      var fn = vm[attr];\n"
    1.23 -            + "      if (fn) return fn(false);\n"
    1.24 -            + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.25 -            + "        load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
    1.26 -            + "    }\n"
    1.27 -            + "    if (vm.loadClass) {\n"
    1.28 -            + "      throw 'Cannot initialize the bck2brwsr VM twice!';\n"
    1.29 -            + "    }\n"
    1.30 -            + "    vm.loadClass = loader.loadClass;\n"
    1.31 -            + "    vm._reload = function(name, byteCode) {;\n"
    1.32 -            + "      var attr = mangleClass(name);\n"
    1.33 -            + "      delete vm[attr];\n"
    1.34 -            + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.35 -            + "        reload__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2_3B(loader, name, args, byteCode);\n"
    1.36 -            + "    };\n"
    1.37 -            + "    vm.loadBytes = function(name, skip) {\n"
    1.38 -            + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.39 -            + "        loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2I(loader, name, args, typeof skip == 'number' ? skip : 0);\n"
    1.40 -            + "    }\n"
    1.41 -            + "    vm.java_lang_reflect_Array(false);\n"
    1.42 -            + "    vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.43 -            + "      loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2I(loader, null, args, 0);\n"
    1.44 -            + "    return loader;\n"
    1.45 -            + "  };\n");
    1.46 -        append("}(this));");
    1.47 -*/
    1.48      }
    1.49  
    1.50      private static void readResource(InputStream emul, Appendable out) throws IOException {
    1.51 @@ -547,37 +506,35 @@
    1.52                  + "      var arr = resources[name];\n"
    1.53                  + "      return (arr && arr.length > arrSize) ? arr[arrSize] : null;\n"
    1.54                  + "    }\n"
    1.55 +                + "    var reload = function(name, arr, keep) {;\n"
    1.56 +                + "      if (!keep) {\n"
    1.57 +                + "        var attr = mangleClass(name);\n"
    1.58 +                + "        delete vm[attr];\n"
    1.59 +                + "      }\n"
    1.60 +                + "      return vm['org_apidesign_vm4brwsr_VMLazy'](false)\n"
    1.61 +                + "        ['load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2_3B']\n"
    1.62 +                + "        (loader, name, args, arr);\n"
    1.63 +                + "    };\n"
    1.64                  + "    loader.loadClass = function(name) {\n"
    1.65                  + "      var attr = mangleClass(name);\n"
    1.66                  + "      var fn = vm[attr];\n"
    1.67                  + "      if (fn) return fn(false);\n"
    1.68                  + "      try {\n"
    1.69                  + "        var arr = loadBytes(name.replace__Ljava_lang_String_2CC('.', '/') + '.class');\n"
    1.70 -                + "        return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.71 -                + "          load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2_3B(loader, name, args, arr);\n"
    1.72 +                + "        return reload(name, arr, true);\n"
    1.73                  + "      } catch (err) {\n"
    1.74 -                + "        while (knownExtensions < extensions.length) {\n"
    1.75 -                + "          vm['registerResource'] = registerResource;\n"
    1.76 -                + "          extensions[knownExtensions++](vm);\n"
    1.77 -                + "          vm['registerResource'] = null;\n"
    1.78 -                + "        }\n"
    1.79                  + "        fn = vm[attr];\n"
    1.80                  + "        if (fn) return fn(false);\n"
    1.81                  + "        throw err;\n"
    1.82                  + "      }\n"
    1.83                  + "    }\n"
    1.84 -                + "    if (vm.loadClass) {\n"
    1.85 +                + "    if (vm['loadClass']) {\n"
    1.86                  + "      throw 'Cannot initialize the bck2brwsr VM twice!';\n"
    1.87                  + "    }\n"
    1.88 -                + "    vm.loadClass = loader.loadClass;\n"
    1.89 -                + "    vm._reload = function(name, byteCode) {;\n"
    1.90 -                + "      var attr = mangleClass(name);\n"
    1.91 -                + "      delete vm[attr];\n"
    1.92 -                + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.93 -                + "        reload__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2_3B(loader, name, args, byteCode);\n"
    1.94 -                + "    };\n"
    1.95 -                + "    vm.loadBytes = loadBytes;\n"
    1.96 -                + "    vm.java_lang_reflect_Array(false);\n"
    1.97 +                + "    vm['loadClass'] = loader.loadClass;\n"
    1.98 +                + "    vm['_reload'] = reload;\n"
    1.99 +                + "    vm['loadBytes'] = loadBytes;\n"
   1.100 +                + "    vm['java_lang_reflect_Array'](false);\n"
   1.101                  + "    return loader;\n"
   1.102                  + "  };\n");
   1.103              append(
     2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Wed May 14 21:24:24 2014 +0200
     2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Wed May 14 21:49:44 2014 +0200
     2.3 @@ -20,6 +20,7 @@
     2.4  import java.io.ByteArrayInputStream;
     2.5  import java.io.IOException;
     2.6  import java.io.InputStream;
     2.7 +import org.apidesign.bck2brwsr.core.Exported;
     2.8  import org.apidesign.bck2brwsr.core.JavaScriptBody;
     2.9  
    2.10  /**
    2.11 @@ -38,6 +39,7 @@
    2.12      static void init() {
    2.13      }
    2.14      
    2.15 +    @Exported
    2.16      static Object load(Object loader, String name, Object[] arguments, byte[] arr) 
    2.17      throws IOException, ClassNotFoundException {
    2.18          if (arr == null) {
    2.19 @@ -46,12 +48,8 @@
    2.20          return new VMLazy(loader, arguments).defineClass(arr, name, false);
    2.21      }
    2.22  
    2.23 -    static Object reload(Object loader, String name, Object[] arguments, byte[] arr) 
    2.24 -    throws IOException, ClassNotFoundException {
    2.25 -        return new VMLazy(loader, arguments).defineClass(arr, name, false);
    2.26 -    }
    2.27 -    
    2.28 -    private Object load(String name, boolean instance)
    2.29 +    @Exported
    2.30 +    Object load(String name, boolean instance)
    2.31      throws IOException, ClassNotFoundException {
    2.32          String res = name.replace('.', '/') + ".class";
    2.33          byte[] arr = ClassPath.loadBytes(res, args, 0);