1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Sun Apr 27 22:40:17 2014 +0200
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon Apr 28 10:59:12 2014 +0200
1.3 @@ -19,6 +19,7 @@
1.4
1.5 import java.io.IOException;
1.6 import java.io.InputStream;
1.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.8 import org.apidesign.vm4brwsr.ByteCodeParser.ClassData;
1.9 import org.apidesign.vm4brwsr.ByteCodeParser.FieldData;
1.10 import org.apidesign.vm4brwsr.ByteCodeParser.MethodData;
1.11 @@ -79,10 +80,10 @@
1.12 fixedNames.add(fixedClass.getName().replace('.', '/'));
1.13 }
1.14
1.15 - vm.doCompile(fixedNames.addAndNew(both));
1.16 + vm.doCompile(fixedNames.addAndNew(both), config.allResources());
1.17 }
1.18
1.19 - private void doCompile(StringArray names) throws IOException {
1.20 + private void doCompile(StringArray names, StringArray asBinary) throws IOException {
1.21 generatePrologue();
1.22 out.append(
1.23 "\n var invoker = function Invoker() {"
1.24 @@ -97,10 +98,29 @@
1.25 + "\n return invoker;"
1.26 + "\n };");
1.27 }
1.28 +
1.29 + for (String r : asBinary.toArray()) {
1.30 + out.append("\n ").append(getExportsObject()).append(".registerResource('");
1.31 + out.append(r).append("', '");
1.32 + InputStream is = this.resources.get(r);
1.33 + byte[] arr = new byte[is.available()];
1.34 + int len = is.read(arr);
1.35 + if (len != arr.length) {
1.36 + throw new IOException("Not read as much as expected for " + r + " expected: " + arr.length + " was: " + len);
1.37 + }
1.38 + out.append(btoa(arr));
1.39 + out.append("');");
1.40 + }
1.41 +
1.42 out.append("\n");
1.43 generateEpilogue();
1.44 }
1.45
1.46 + @JavaScriptBody(args = { "arr" }, body = "return btoa(arr);")
1.47 + private static String btoa(byte[] arr) {
1.48 + return javax.xml.bind.DatatypeConverter.printBase64Binary(arr);
1.49 + }
1.50 +
1.51 protected abstract void generatePrologue() throws IOException;
1.52
1.53 protected abstract void generateEpilogue() throws IOException;
1.54 @@ -435,10 +455,19 @@
1.55 + " var extensions = [];\n"
1.56 + " global.bck2brwsr = function() {\n"
1.57 + " var args = Array.prototype.slice.apply(arguments);\n"
1.58 - + " var vm = fillInVMSkeleton({});\n"
1.59 + + " var resources = {};\n"
1.60 + + " function registerResource(n, a64) {\n"
1.61 + + " var str = atob(a64);\n"
1.62 + + " var arr = [];\n"
1.63 + + " for (var i = 0; i < str.length; i++) arr.push(str.charCodeAt(i) & 0xff);\n"
1.64 + + " if (!resources[n]) resources[n] = [arr];\n"
1.65 + + " else resources[n].push(arr);\n"
1.66 + + " }\n"
1.67 + + " var vm = fillInVMSkeleton({ 'registerResource' : registerResource });\n"
1.68 + " for (var i = 0; i < extensions.length; ++i) {\n"
1.69 + " extensions[i](vm);\n"
1.70 + " }\n"
1.71 + + " vm.registerResource = null;\n"
1.72 + " var knownExtensions = extensions.length;\n"
1.73 + " var loader = {};\n"
1.74 + " loader.vm = vm;\n"
1.75 @@ -451,7 +480,9 @@
1.76 + " load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
1.77 + " } catch (err) {\n"
1.78 + " while (knownExtensions < extensions.length) {\n"
1.79 + + " vm.registerResource = registerResource;\n"
1.80 + " extensions[knownExtensions++](vm);\n"
1.81 + + " vm.registerResource = null;\n"
1.82 + " }\n"
1.83 + " fn = vm[attr];\n"
1.84 + " if (fn) return fn(false);\n"
1.85 @@ -463,6 +494,7 @@
1.86 + " }\n"
1.87 + " vm.loadClass = loader.loadClass;\n"
1.88 + " vm.loadBytes = function(name) {\n"
1.89 + + " if (resources[name]) return resources[name][0];\n"
1.90 + " return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
1.91 + " loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
1.92 + " }\n"