Read the byte array via loadBytes call closure
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 14 May 2014 21:24:24 +0200
branchclosure
changeset 1577042d0f256e95
parent 1576 3e9bfed0d88e
child 1578 9e6b613a00ed
Read the byte array via loadBytes call
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 16:09:03 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 14 21:24:24 2014 +0200
     1.3 @@ -526,13 +526,35 @@
     1.4                  + "    var knownExtensions = extensions.length;\n"
     1.5                  + "    var loader = {};\n"
     1.6                  + "    loader.vm = vm;\n"
     1.7 +                + "    var loadBytes = function(name, skip) {\n"
     1.8 +                + "      skip = typeof skip == 'number' ? skip : 0;\n"
     1.9 +                + "      var arr = resources[name];\n"
    1.10 +                + "      if (arr) {\n"
    1.11 +                + "        var arrSize = arr.length;\n"
    1.12 +                + "        if (skip < arrSize) return arr[skip];\n"
    1.13 +                + "        skip -= arrSize;\n"
    1.14 +                + "      } else {\n"
    1.15 +                + "        var arrSize = 0;\n"
    1.16 +                + "      };\n"
    1.17 +                + "      var ret = vm['org_apidesign_vm4brwsr_ClassPath'](false).\n"
    1.18 +                + "        loadBytes___3BLjava_lang_String_2Ljava_lang_Object_2I(name, args, skip);\n"
    1.19 +                + "      if (ret !== null) return ret;\n"
    1.20 +                + "      while (knownExtensions < extensions.length) {\n"
    1.21 +                + "        vm['registerResource'] = registerResource;\n"
    1.22 +                + "        extensions[knownExtensions++](vm);\n"
    1.23 +                + "        vm['registerResource'] = null;\n"
    1.24 +                + "      }\n"
    1.25 +                + "      var arr = resources[name];\n"
    1.26 +                + "      return (arr && arr.length > arrSize) ? arr[arrSize] : null;\n"
    1.27 +                + "    }\n"
    1.28                  + "    loader.loadClass = function(name) {\n"
    1.29                  + "      var attr = mangleClass(name);\n"
    1.30                  + "      var fn = vm[attr];\n"
    1.31                  + "      if (fn) return fn(false);\n"
    1.32                  + "      try {\n"
    1.33 +                + "        var arr = loadBytes(name.replace__Ljava_lang_String_2CC('.', '/') + '.class');\n"
    1.34                  + "        return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.35 -                + "          load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
    1.36 +                + "          load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2_3B(loader, name, args, arr);\n"
    1.37                  + "      } catch (err) {\n"
    1.38                  + "        while (knownExtensions < extensions.length) {\n"
    1.39                  + "          vm['registerResource'] = registerResource;\n"
    1.40 @@ -554,27 +576,7 @@
    1.41                  + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.42                  + "        reload__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2_3B(loader, name, args, byteCode);\n"
    1.43                  + "    };\n"
    1.44 -                + "    vm.loadBytes = function(name, skip) {\n"
    1.45 -                + "      skip = typeof skip == 'number' ? skip : 0;\n"
    1.46 -                + "      var arr = resources[name];\n"
    1.47 -                + "      if (arr) {\n"
    1.48 -                + "        var arrSize = arr.length;\n"
    1.49 -                + "        if (skip < arrSize) return arr[skip];\n"
    1.50 -                + "        skip -= arrSize;\n"
    1.51 -                + "      } else {\n"
    1.52 -                + "        var arrSize = 0;\n"
    1.53 -                + "      };\n"
    1.54 -                + "      var ret = vm['org_apidesign_vm4brwsr_ClassPath'](false).\n"
    1.55 -                + "        loadBytes___3BLjava_lang_String_2Ljava_lang_Object_2I(name, args, skip);\n"
    1.56 -                + "      if (ret !== null) return ret;\n"
    1.57 -                + "      while (knownExtensions < extensions.length) {\n"
    1.58 -                + "        vm['registerResource'] = registerResource;\n"
    1.59 -                + "        extensions[knownExtensions++](vm);\n"
    1.60 -                + "        vm['registerResource'] = null;\n"
    1.61 -                + "      }\n"
    1.62 -                + "      var arr = resources[name];\n"
    1.63 -                + "      return (arr && arr.length > arrSize) ? arr[arrSize] : null;\n"
    1.64 -                + "    }\n"
    1.65 +                + "    vm.loadBytes = loadBytes;\n"
    1.66                  + "    vm.java_lang_reflect_Array(false);\n"
    1.67                  + "    return loader;\n"
    1.68                  + "  };\n");
     2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Wed May 14 16:09:03 2014 +0200
     2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Wed May 14 21:24:24 2014 +0200
     2.3 @@ -38,9 +38,12 @@
     2.4      static void init() {
     2.5      }
     2.6      
     2.7 -    static Object load(Object loader, String name, Object[] arguments) 
     2.8 +    static Object load(Object loader, String name, Object[] arguments, byte[] arr) 
     2.9      throws IOException, ClassNotFoundException {
    2.10 -        return new VMLazy(loader, arguments).load(name, false);
    2.11 +        if (arr == null) {
    2.12 +            throw new ClassNotFoundException(name);
    2.13 +        }
    2.14 +        return new VMLazy(loader, arguments).defineClass(arr, name, false);
    2.15      }
    2.16  
    2.17      static Object reload(Object loader, String name, Object[] arguments, byte[] arr)