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 }