rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
branchclosure
changeset 1604 7665471a56c1
parent 1598 ec62383beb7d
child 1608 5186733b7e07
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Mon May 26 16:20:51 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Tue May 27 12:25:41 2014 +0200
     1.3 @@ -77,7 +77,7 @@
     1.4              fixedNames.add(VM.class.getName().replace('.', '/'));
     1.5              vm = new Extension(out, 
     1.6                  config.getResources(), both, config.exported(),
     1.7 -                config.allResources()
     1.8 +                config.allResources(), config.classpath()
     1.9              );
    1.10          } else {
    1.11              if (config.includeVM()) {
    1.12 @@ -487,10 +487,9 @@
    1.13                  + "    name = replaceAll(name, '.', '_');\n"
    1.14                  + "    return name;\n"
    1.15                  + "  };\n"
    1.16 -                + "  global.bck2brwsr = function() {\n"
    1.17 -                + "    var args = Array.prototype.slice.apply(arguments);\n"
    1.18 -                + "    var resources = {};\n"
    1.19 -                + "    function loadExtension(url) {\n"
    1.20 +                + "  function loadExtension(url) {\n"
    1.21 +                + "      if (url.substring(url.length - 4) == '.jar')\n"
    1.22 +                + "        url = url.substring(0, url.length - 4) + '.js';\n"
    1.23                  + "      var xhr = new XMLHttpRequest();\n"
    1.24                  + "      xhr.open('GET', url, false);\n"
    1.25                  + "      xhr.send();\n"
    1.26 @@ -498,7 +497,10 @@
    1.27                  + "      script.type = 'text/javascript';\n"
    1.28                  + "      script.text = xhr.responseText;\n"
    1.29                  + "      document.getElementsByTagName('head')[0].appendChild(script);\n"
    1.30 -                + "    }\n"
    1.31 +                + "  }\n"
    1.32 +                + "  global.bck2brwsr = function() {\n"
    1.33 +                + "    var args = Array.prototype.slice.apply(arguments);\n"
    1.34 +                + "    var resources = {};\n"
    1.35                  + "    function registerResource(n, a64) {\n"
    1.36                  + "      var str = atob(a64);\n"
    1.37                  + "      var arr = [];\n"
    1.38 @@ -556,12 +558,15 @@
    1.39                  + "      var arr = resources[name];\n"
    1.40                  + "      return (arr && arr.length > arrSize) ? arr[arrSize] : null;\n"
    1.41                  + "    }\n"
    1.42 -                + "    var reload = function(name, arr, keep) {;\n"
    1.43 +                + "    var reload = function(name, arr, keep) {\n"
    1.44 +                + "      if (!arr) throw 'Cannot find ' + name;\n"
    1.45 +                + "      var lazy = vm['org_apidesign_vm4brwsr_VMLazy'];\n"
    1.46 +                + "      if (!lazy) throw 'No bck2brwsr VM module to compile ' + name;\n"
    1.47                  + "      if (!keep) {\n"
    1.48                  + "        var attr = mangleClass(name);\n"
    1.49                  + "        delete vm[attr];\n"
    1.50                  + "      }\n"
    1.51 -                + "      return vm['org_apidesign_vm4brwsr_VMLazy'](false)\n"
    1.52 +                + "      return lazy(false)\n"
    1.53                  + "        ['load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2_3B']\n"
    1.54                  + "        (vm, name, args, arr);\n"
    1.55                  + "    };\n"
    1.56 @@ -594,6 +599,10 @@
    1.57                  + "      return false;\n"
    1.58                  + "    }\n"
    1.59                  + "    extensions.push(extension);\n"
    1.60 +                + "    var cp = config['classpath'];\n"
    1.61 +                + "    if (cp) for (var i = 0; i < cp.length; i++) {\n"
    1.62 +                + "      loadExtension(cp[i]);\n"
    1.63 +                + "    }\n"
    1.64                  + "    return null;\n"
    1.65                  + "  };\n");
    1.66              append("}(this));");
    1.67 @@ -612,21 +621,39 @@
    1.68  
    1.69      private static final class Extension extends VM {
    1.70          private final StringArray extensionClasses;
    1.71 +        private final StringArray classpath;
    1.72  
    1.73          private Extension(Appendable out, Bck2Brwsr.Resources resources,
    1.74              String[] extClassesArray, StringArray explicitlyExported,
    1.75 -            StringArray asBinary
    1.76 +            StringArray asBinary, StringArray classpath
    1.77          ) {
    1.78              super(out, resources, explicitlyExported, asBinary);
    1.79              this.extensionClasses = StringArray.asList(extClassesArray);
    1.80 +            this.classpath = classpath;
    1.81          }
    1.82  
    1.83          @Override
    1.84          protected void generatePrologue() throws IOException {
    1.85 -            append("bck2brwsr.register({\n"
    1.86 -                    + "'magic' : 'kafíčko'\n"
    1.87 -                + "}, function(exports) {\n"
    1.88 -                           + "  var vm = {};\n");
    1.89 +            append(
    1.90 +                  "bck2brwsr.register({\n"
    1.91 +                + "  'magic' : 'kafíčko'"
    1.92 +            );
    1.93 +            if (classpath != null && classpath.toArray().length > 0) {
    1.94 +                append(
    1.95 +                  ",\n  'classpath' : [\n"
    1.96 +                );
    1.97 +                String sep = "    ";
    1.98 +                for (String s : classpath.toArray()) {
    1.99 +                    append(sep).append("'").append(s).append("'");
   1.100 +                    sep = ",\n    ";
   1.101 +                }
   1.102 +                append(
   1.103 +                  "\n  ]"
   1.104 +                );
   1.105 +            }
   1.106 +            append(
   1.107 +                  "\n}, function(exports) {\n"
   1.108 +                + "  var vm = {};\n");
   1.109              append("  function link(n) {\n"
   1.110                  + "    return function() {\n"
   1.111                  + "      var cls = n['replace__Ljava_lang_String_2CC']"