rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
branchclosure
changeset 1609 752f48257d4a
parent 1608 5186733b7e07
child 1610 a6f807104d8e
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 28 09:07:48 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 28 10:47:18 2014 +0200
     1.3 @@ -493,14 +493,28 @@
     1.4                  + "    var at = pending.indexOf(ev.target);\n"
     1.5                  + "    pending.splice(at, 1);\n"
     1.6                  + "    if (pending.length === 0) {\n"
     1.7 -                + "      for (var i = 0; i < pendingClasses.length; i += 2) {\n"
     1.8 -                + "        var vm = pendingClasses[i];\n"
     1.9 -                + "        var n = pendingClasses[i + 1];\n"
    1.10 -                + "        vm.loadClass(n);\n"
    1.11 +                + "      for (var i = 0; i < pendingClasses.length; i += 3) {\n"
    1.12 +                + "        invokeMethod(pendingClasses[i], pendingClasses[i + 1], pendingClasses[i + 2]);\n"
    1.13                  + "      }\n"
    1.14                  + "      pendingClasses = [];\n"
    1.15                  + "    }\n"
    1.16                  + "  }\n"
    1.17 +                + "  function invokeMethod(vm, n, args) {\n"
    1.18 +                + "    var clazz = vm.loadClass(n);\n"
    1.19 +                + "    if (args) {\n"
    1.20 +                + "      var seek = args[0];\n"
    1.21 +                + "      var prefix = seek.indexOf('__') == -1 ? seek + '__' : seek;\n"
    1.22 +                + "      args = Array.prototype.slice.call(args, 1);\n"
    1.23 +                + "      var found = '';\n"
    1.24 +                + "      for (var m in clazz) {\n"
    1.25 +                + "        if (m.indexOf(prefix) === 0) {\n"
    1.26 +                + "          return clazz[m].apply(null, args);\n"
    1.27 +                + "        }\n"
    1.28 +                + "        found += m.toString() + '\\n'\n"
    1.29 +                + "      }\n"
    1.30 +                + "      throw 'Cannot find ' + seek + ' in ' + n + ' found:\\n' + found;\n"
    1.31 +                + "    }\n"
    1.32 +                + "  }\n"
    1.33                  + "  function extensionError(ev) {\n"
    1.34                  + "    console.log('error loading ' + ev.target.src);\n"
    1.35                  + "    extensionLoaded(ev);\n"
    1.36 @@ -611,14 +625,29 @@
    1.37                  + "    loader.loadClass = function(name) {\n"
    1.38                  + "      if (pending.length === 0) {\n"
    1.39                  + "        try {\n"
    1.40 -                + "          return loadClass(name);\n"
    1.41 +                + "          var c = loadClass(name);\n"
    1.42 +                + "          c['invoke'] = function() {\n"
    1.43 +                + "            return invokeMethod(vm, name, arguments);\n"
    1.44 +                + "          };\n"
    1.45 +                + "          return c;\n"
    1.46                  + "        } catch (err) {\n"
    1.47                  + "          if (pending.length === 0) throw err;\n"
    1.48                  + "        }\n"
    1.49                  + "      }\n"
    1.50                  + "      pendingClasses.push(vm);\n"
    1.51                  + "      pendingClasses.push(name);\n"
    1.52 -                + "      return null;\n"
    1.53 +                + "      pendingClasses.push(null);\n"
    1.54 +                + "      return {\n"
    1.55 +                + "        'invoke' : function() {\n"
    1.56 +                + "          if (pending.length === 0) {\n"
    1.57 +                + "            invokeMethod(vm, name, arguments);\n"
    1.58 +                + "            return;\n"
    1.59 +                + "          }\n"
    1.60 +                + "          pendingClasses.push(vm);\n"
    1.61 +                + "          pendingClasses.push(name);\n"
    1.62 +                + "          pendingClasses.push(arguments);\n"
    1.63 +                + "        }\n"
    1.64 +                + "      };\n"
    1.65                  + "    }\n"
    1.66                  + "    return loader;\n"
    1.67                  + "  };\n");