rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
branchclosure
changeset 1613 81926ff11587
parent 1611 d0df418a5993
child 1693 800cb3d9f3b0
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 28 14:35:21 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu May 29 09:57:01 2014 +0200
     1.3 @@ -98,10 +98,9 @@
     1.4                  "\n  var invoker = {};");
     1.5          generateBody(names);
     1.6          for (String invokerMethod: invokerMethods.toArray()) {
     1.7 -            append("\n  invoker." + invokerMethod + " = function(target) {"
     1.8 -                + "\n    return function() {"
     1.9 -                + "\n      return target['" + invokerMethod + "'].apply(target, arguments);"
    1.10 -                + "\n    };"
    1.11 +            append("\n  invoker." + invokerMethod + " = function() {"
    1.12 +                + "\n    var target = arguments[0];"
    1.13 +                + "\n    return target['" + invokerMethod + "'].apply(target, Array.prototype.slice.call(arguments, 1));"
    1.14                  + "\n  };"
    1.15              );
    1.16          }
    1.17 @@ -366,9 +365,11 @@
    1.18  
    1.19      @Override
    1.20      protected String accessVirtualMethod(
    1.21 -                             String object,
    1.22 -                             String mangledName,
    1.23 -                             String[] fieldInfoName) throws IOException {
    1.24 +            String object, 
    1.25 +            String mangledName, 
    1.26 +            String[] fieldInfoName, 
    1.27 +            int params
    1.28 +    ) throws IOException {
    1.29          final ClassData referencedClass =
    1.30                  classDataCache.getClassData(fieldInfoName[0]);
    1.31          final MethodData method =
    1.32 @@ -382,17 +383,17 @@
    1.33                          || ((referencedClass.getAccessFlags()
    1.34                                   & ByteCodeParser.ACC_FINAL) != 0)
    1.35                          || !isHierarchyExported(method))) {
    1.36 -            return object + "." + mangledName;
    1.37 +            return object + "." + mangledName + '(';
    1.38          }
    1.39  
    1.40 -        return accessThroughInvoker(object, mangledName);
    1.41 +        return accessThroughInvoker(object, mangledName, params > 1 ? "," : "");
    1.42      }
    1.43  
    1.44 -    private String accessThroughInvoker(String object, String mangledName) {
    1.45 +    private String accessThroughInvoker(String object, String mangledName, String sep) {
    1.46          if (!invokerMethods.contains(mangledName)) {
    1.47              invokerMethods.add(mangledName);
    1.48          }
    1.49 -        return "invoker." + mangledName + '(' + object + ')';
    1.50 +        return "invoker." + mangledName + '(' + object + sep;
    1.51      }
    1.52  
    1.53      private boolean isHierarchyExported(final MethodData methodData)