rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
branchclosure
changeset 1584 7b6295731c30
parent 1583 89b6b369c13d
child 1587 bf08bd96d408
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 21 23:42:24 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu May 22 10:48:09 2014 +0200
     1.3 @@ -35,12 +35,6 @@
     1.4      private final ExportedSymbols exportedSymbols;
     1.5      private final StringArray invokerMethods;
     1.6  
     1.7 -    private static final Class<?> FIXED_DEPENDENCIES[] = {
     1.8 -            Class.class,
     1.9 -            ArithmeticException.class,
    1.10 -            VM.class
    1.11 -        };
    1.12 -
    1.13      private VM(Appendable out, Bck2Brwsr.Resources resources, StringArray explicitlyExported) {
    1.14          super(out);
    1.15          this.resources = resources;
    1.16 @@ -69,17 +63,20 @@
    1.17      ) throws IOException {
    1.18          String[] both = config.classes().toArray();
    1.19          
    1.20 -        VM vm = config.isExtension() ? 
    1.21 -            new Extension(out, config.getResources(), both, config.exported())
    1.22 -            : 
    1.23 -            new Standalone(out, config.getResources(), config.exported());
    1.24 -
    1.25          final StringArray fixedNames = new StringArray();
    1.26 -
    1.27 -        for (final Class<?> fixedClass: FIXED_DEPENDENCIES) {
    1.28 -            fixedNames.add(fixedClass.getName().replace('.', '/'));
    1.29 -        }
    1.30 -
    1.31 +        fixedNames.add(Class.class.getName().replace('.', '/'));
    1.32 +        fixedNames.add(ArithmeticException.class.getName().replace('.', '/'));
    1.33 +        
    1.34 +        VM vm;
    1.35 +        if (config.isExtension()) {
    1.36 +            fixedNames.add(VM.class.getName().replace('.', '/'));
    1.37 +            vm = new Extension(out, config.getResources(), both, config.exported());
    1.38 +        } else {
    1.39 +            if (config.includeVM()) {
    1.40 +                fixedNames.add(VM.class.getName().replace('.', '/'));
    1.41 +            }
    1.42 +            vm = new Standalone(out, config.getResources(), config.exported());
    1.43 +        }            
    1.44          vm.doCompile(fixedNames.addAndNew(both), config.allResources());
    1.45      }
    1.46  
    1.47 @@ -490,6 +487,10 @@
    1.48                  + "      else resources[n].push(arr);\n"
    1.49                  + "    }\n"
    1.50                  + "    var vm = fillInVMSkeleton({ 'registerResource' : registerResource });\n"
    1.51 +                + "    function initVM() {\n"
    1.52 +                + "      var clsArray = vm['java_lang_reflect_Array'];\n"
    1.53 +                + "      if (clsArray) clsArray(false);\n"
    1.54 +                + "    }\n"
    1.55                  + "    for (var i = 0; i < extensions.length; ++i) {\n"
    1.56                  + "      extensions[i](vm);\n"
    1.57                  + "    }\n"
    1.58 @@ -518,6 +519,7 @@
    1.59                  + "        vm['registerResource'] = registerResource;\n"
    1.60                  + "        extensions[knownExtensions++](vm);\n"
    1.61                  + "        vm['registerResource'] = null;\n"
    1.62 +                + "        initVM();\n"
    1.63                  + "      }\n"
    1.64                  + "      var arr = resources[name];\n"
    1.65                  + "      return (arr && arr.length > arrSize) ? arr[arrSize] : null;\n"
    1.66 @@ -536,7 +538,7 @@
    1.67                  + "      var fn = vm[attr];\n"
    1.68                  + "      if (fn) return fn(false);\n"
    1.69                  + "      try {\n"
    1.70 -                + "        var arr = loadBytes(name.replace__Ljava_lang_String_2CC('.', '/') + '.class');\n"
    1.71 +                + "        var arr = loadBytes(replaceAll(name, '.', '/') + '.class');\n"
    1.72                  + "        return reload(name, arr, true);\n"
    1.73                  + "      } catch (err) {\n"
    1.74                  + "        fn = vm[attr];\n"
    1.75 @@ -550,7 +552,7 @@
    1.76                  + "    vm['loadClass'] = loader.loadClass;\n"
    1.77                  + "    vm['_reload'] = reload;\n"
    1.78                  + "    vm['loadBytes'] = loadBytes;\n"
    1.79 -                + "    vm['java_lang_reflect_Array'](false);\n"
    1.80 +                + "    initVM();\n"
    1.81                  + "    return loader;\n"
    1.82                  + "  };\n");
    1.83              append(