rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
branchclosure
changeset 1020 a6bacea2518f
parent 869 151f4ccd7673
child 1029 b1fe994d4267
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu Mar 21 18:48:46 2013 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu Apr 25 16:17:48 2013 +0200
     1.3 @@ -24,11 +24,7 @@
     1.4   *
     1.5   * @author Jaroslav Tulach <jtulach@netbeans.org>
     1.6   */
     1.7 -class VM extends ByteCodeToJavaScript {
     1.8 -    public VM(Appendable out) {
     1.9 -        super(out);
    1.10 -    }
    1.11 -
    1.12 +abstract class VM extends ByteCodeToJavaScript {
    1.13      private VM(Appendable out, ObfuscationDelegate obfuscationDelegate) {
    1.14          super(out, obfuscationDelegate);
    1.15      }
    1.16 @@ -49,16 +45,27 @@
    1.17      }
    1.18      
    1.19      static void compile(Bck2Brwsr.Resources l, Appendable out, StringArray names) throws IOException {
    1.20 -        new VM(out).doCompile(l, names);
    1.21 +        VM vm = new Standalone(out, ObfuscationDelegate.NULL);
    1.22 +        vm.doCompile(l, names);
    1.23      }
    1.24  
    1.25      static void compile(Bck2Brwsr.Resources l, Appendable out, StringArray names,
    1.26                          ObfuscationDelegate obfuscationDelegate) throws IOException {
    1.27 -        new VM(out, obfuscationDelegate).doCompile(l, names);
    1.28 +        VM vm = new Standalone(out, obfuscationDelegate);
    1.29 +        vm.doCompile(l, names);
    1.30      }
    1.31  
    1.32 -    protected void doCompile(Bck2Brwsr.Resources l, StringArray names) throws IOException {
    1.33 -        out.append("(function VM(global) {var fillInVMSkeleton = function(vm) {");
    1.34 +    private void doCompile(Bck2Brwsr.Resources l, StringArray names) throws IOException {
    1.35 +        generatePrologue();
    1.36 +        generateBody(l, names);
    1.37 +        generateEpilogue();
    1.38 +    }
    1.39 +
    1.40 +    protected abstract void generatePrologue() throws IOException;
    1.41 +
    1.42 +    protected abstract void generateEpilogue() throws IOException;
    1.43 +
    1.44 +    protected void generateBody(Bck2Brwsr.Resources l, StringArray names) throws IOException {
    1.45          StringArray processed = new StringArray();
    1.46          StringArray initCode = new StringArray();
    1.47          for (String baseClass : names.toArray()) {
    1.48 @@ -76,7 +83,7 @@
    1.49                  }
    1.50                  InputStream is = loadClass(l, name);
    1.51                  if (is == null) {
    1.52 -                    throw new IOException("Can't find class " + name); 
    1.53 +                    throw new IOException("Can't find class " + name);
    1.54                  }
    1.55                  try {
    1.56                      String ic = compile(is);
    1.57 @@ -91,11 +98,11 @@
    1.58                                  break;
    1.59                              }
    1.60                          }
    1.61 -                        throw new IOException("Error while compiling " + name + "\n" 
    1.62 +                        throw new IOException("Error while compiling " + name + "\n"
    1.63                              + seq.subSequence(lastBlock + 1, seq.length()), ex
    1.64                          );
    1.65                      } else {
    1.66 -                        throw new IOException("Error while compiling " + name + "\n" 
    1.67 +                        throw new IOException("Error while compiling " + name + "\n"
    1.68                              + out, ex
    1.69                          );
    1.70                      }
    1.71 @@ -113,7 +120,7 @@
    1.72                  readResource(emul, out);
    1.73              }
    1.74              scripts = new StringArray();
    1.75 -            
    1.76 +
    1.77              StringArray toInit = StringArray.asList(references.toArray());
    1.78              toInit.reverse();
    1.79  
    1.80 @@ -128,36 +135,8 @@
    1.81                  }
    1.82              }
    1.83          }
    1.84 -        out.append(
    1.85 -              "  return vm;\n"
    1.86 -            + "  };\n"
    1.87 -            + "  global.bck2brwsr = function() {\n"
    1.88 -            + "    var args = Array.prototype.slice.apply(arguments);\n"
    1.89 -            + "    var vm = fillInVMSkeleton({});\n"
    1.90 -            + "    var loader = {};\n"
    1.91 -            + "    loader.vm = vm;\n"
    1.92 -            + "    loader.loadClass = function(name) {\n"
    1.93 -            + "      var attr = name.replace__Ljava_lang_String_2CC('.','_');\n"
    1.94 -            + "      var fn = vm[attr];\n"
    1.95 -            + "      if (fn) return fn(false);\n"
    1.96 -            + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.97 -            + "        load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
    1.98 -            + "    }\n"
    1.99 -            + "    if (vm.loadClass) {\n"
   1.100 -            + "      throw 'Cannot initialize the bck2brwsr VM twice!';\n"
   1.101 -            + "    }\n"
   1.102 -            + "    vm.loadClass = loader.loadClass;\n"
   1.103 -            + "    vm.loadBytes = function(name) {\n"
   1.104 -            + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
   1.105 -            + "        loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
   1.106 -            + "    }\n"
   1.107 -            + "    vm.java_lang_reflect_Array(false);\n"
   1.108 -            + "    vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
   1.109 -            + "      loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, null, args);\n"
   1.110 -            + "    return loader;\n"
   1.111 -            + "  };\n");
   1.112 -        out.append("}(this));");
   1.113      }
   1.114 +
   1.115      private static void readResource(InputStream emul, Appendable out) throws IOException {
   1.116          try {
   1.117              int state = 0;
   1.118 @@ -241,8 +220,80 @@
   1.119          return "vm." + className;
   1.120      }
   1.121  
   1.122 -    @Override
   1.123 -    String getVMObject() {
   1.124 -        return "vm";
   1.125 +    private static final class Standalone extends VM {
   1.126 +        private Standalone(Appendable out,
   1.127 +                           ObfuscationDelegate obfuscationDelegate) {
   1.128 +            super(out, obfuscationDelegate);
   1.129 +        }
   1.130 +
   1.131 +        @Override
   1.132 +        protected void generatePrologue() throws IOException {
   1.133 +            out.append("(function VM(global) {var fillInVMSkeleton = function(vm) {");
   1.134 +        }
   1.135 +
   1.136 +        @Override
   1.137 +        protected void generateEpilogue() throws IOException {
   1.138 +            out.append(
   1.139 +                  "  return vm;\n"
   1.140 +                + "  };\n"
   1.141 +                + "  global.bck2brwsr = function() {\n"
   1.142 +                + "    var args = Array.prototype.slice.apply(arguments);\n"
   1.143 +                + "    var vm = fillInVMSkeleton({});\n"
   1.144 +                + "    var loader = {};\n"
   1.145 +                + "    loader.vm = vm;\n"
   1.146 +                + "    loader.loadClass = function(name) {\n"
   1.147 +                + "      var attr = name.replace__Ljava_lang_String_2CC('.','_');\n"
   1.148 +                + "      var fn = vm[attr];\n"
   1.149 +                + "      if (fn) return fn(false);\n"
   1.150 +                + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
   1.151 +                + "        load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
   1.152 +                + "    }\n"
   1.153 +                + "    if (vm.loadClass) {\n"
   1.154 +                + "      throw 'Cannot initialize the bck2brwsr VM twice!';\n"
   1.155 +                + "    }\n"
   1.156 +                + "    vm.loadClass = loader.loadClass;\n"
   1.157 +                + "    vm.loadBytes = function(name) {\n"
   1.158 +                + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
   1.159 +                + "        loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
   1.160 +                + "    }\n"
   1.161 +                + "    vm.java_lang_reflect_Array(false);\n"
   1.162 +                + "    vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
   1.163 +                + "      loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, null, args);\n"
   1.164 +                + "    return loader;\n"
   1.165 +                + "  };\n");
   1.166 +            out.append("}(this));");
   1.167 +        }
   1.168 +
   1.169 +        @Override
   1.170 +        String getExportsObject() {
   1.171 +            return "vm";
   1.172 +        }
   1.173 +    }
   1.174 +
   1.175 +    private static final class Extension extends VM {
   1.176 +        private final String name;
   1.177 +
   1.178 +        private Extension(String name,
   1.179 +                          Appendable out,
   1.180 +                          ObfuscationDelegate obfuscationDelegate) {
   1.181 +            super(out, obfuscationDelegate);
   1.182 +            this.name = name;
   1.183 +        }
   1.184 +
   1.185 +        @Override
   1.186 +        protected void generatePrologue() throws IOException {
   1.187 +            out.append("bck2brwsr.registerExtension(function(exports) {\n"
   1.188 +                           + "  var vm = {};\n");
   1.189 +        }
   1.190 +
   1.191 +        @Override
   1.192 +        protected void generateEpilogue() throws IOException {
   1.193 +            out.append("});");
   1.194 +        }
   1.195 +
   1.196 +        @Override
   1.197 +        String getExportsObject() {
   1.198 +            return "exports";
   1.199 +        }
   1.200      }
   1.201  }