Don't reference Fn closure
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 01 May 2014 13:43:36 +0200
branchclosure
changeset 1515d6d1fc565854
parent 1514 d2401e2648af
child 1516 cd7667c861d6
Don't reference Fn
rt/emul/mini/src/main/java/java/lang/Class.java
rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     1.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java	Wed Apr 30 15:57:56 2014 +0200
     1.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java	Thu May 01 13:43:36 2014 +0200
     1.3 @@ -35,6 +35,7 @@
     1.4  import java.lang.reflect.TypeVariable;
     1.5  import java.net.URL;
     1.6  import org.apidesign.bck2brwsr.core.JavaScriptBody;
     1.7 +import org.apidesign.bck2brwsr.core.JavaScriptOnly;
     1.8  import org.apidesign.bck2brwsr.emul.reflect.AnnotationImpl;
     1.9  import org.apidesign.bck2brwsr.emul.reflect.MethodImpl;
    1.10  
    1.11 @@ -1773,5 +1774,20 @@
    1.12              + "\n}"
    1.13      )
    1.14      static native Object clone(Object self) throws CloneNotSupportedException;
    1.15 -    
    1.16 +
    1.17 +    @JavaScriptOnly(name = "toJS", value = "function(v) {\n"
    1.18 +        + "  if (v === null) return null;\n"
    1.19 +        + "  if (Object.prototype.toString.call(v) === '[object Array]') {\n"
    1.20 +        + "    return vm.org_apidesign_bck2brwsr_emul_lang_System(false).convArray__Ljava_lang_Object_2Ljava_lang_Object_2(v);\n"
    1.21 +        + "  }\n"
    1.22 +        + "  return v.valueOf();\n"
    1.23 +        + "}\n"
    1.24 +    )
    1.25 +    static native int toJS();
    1.26 +
    1.27 +    @JavaScriptOnly(name = "activate__Ljava_io_Closeable_2Lorg_apidesign_html_boot_spi_Fn$Presenter_2", value = "function() {\n"
    1.28 +        + "  return vm.org_apidesign_bck2brwsr_emul_lang_System(false).activate__Ljava_io_Closeable_2();"
    1.29 +        + "}\n"
    1.30 +    )
    1.31 +    static native int activate();
    1.32  }
     2.1 --- a/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java	Wed Apr 30 15:57:56 2014 +0200
     2.2 +++ b/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java	Thu May 01 13:43:36 2014 +0200
     2.3 @@ -17,9 +17,10 @@
     2.4   */
     2.5  package org.apidesign.bck2brwsr.emul.lang;
     2.6  
     2.7 +import java.io.Closeable;
     2.8 +import java.io.IOException;
     2.9  import java.lang.reflect.Method;
    2.10  import org.apidesign.bck2brwsr.core.JavaScriptBody;
    2.11 -import org.apidesign.bck2brwsr.core.JavaScriptOnly;
    2.12  
    2.13  /**
    2.14   *
    2.15 @@ -73,15 +74,15 @@
    2.16      @JavaScriptBody(args = { "obj" }, body="return vm.java_lang_Object(false).hashCode__I.call(obj);")
    2.17      public static native int identityHashCode(Object obj);
    2.18      
    2.19 -    @JavaScriptOnly(name = "toJS", value = "function(v) {\n" + 
    2.20 -        "  if (v === null) return null;\n" +
    2.21 -        "  if (Object.prototype.toString.call(v) === '[object Array]') {\n" +
    2.22 -        "    return vm.org_apidesign_bck2brwsr_emul_lang_System(false).convArray__Ljava_lang_Object_2Ljava_lang_Object_2(v);\n" +
    2.23 -        "  }\n" +
    2.24 -        "  return v.valueOf();\n" +
    2.25 -        "}\n"
    2.26 -    )
    2.27 -    public static native int toJS();
    2.28 +    public static Closeable activate() {
    2.29 +        return DUMMY;
    2.30 +    }
    2.31 +    private static final Closeable DUMMY = new Closeable() {
    2.32 +        @Override
    2.33 +        public void close() throws IOException {
    2.34 +        }
    2.35 +    };
    2.36 +    
    2.37      
    2.38      private static Object convArray(Object o) {
    2.39          if (o instanceof Object[]) {
     3.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Wed Apr 30 15:57:56 2014 +0200
     3.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu May 01 13:43:36 2014 +0200
     3.3 @@ -29,6 +29,7 @@
     3.4      private ClassData jc;
     3.5      private final Appendable out;
     3.6      private boolean outChanged;
     3.7 +    private boolean callbacks;
     3.8  
     3.9      protected ByteCodeToJavaScript(Appendable out) {
    3.10          this.out = out;
    3.11 @@ -140,6 +141,7 @@
    3.12  
    3.13      protected String compile(ClassData classData) throws IOException {
    3.14          this.jc = classData;
    3.15 +        this.callbacks = this.jc.getClassName().endsWith("/$JsCallbacks$");
    3.16          if (jc.getMajor_version() < 50) {
    3.17              throw new IOException("Can't compile " + jc.getClassName() + ". Class file version " + jc.getMajor_version() + "."
    3.18                  + jc.getMinor_version() + " - recompile with -target 1.6 (at least)."
    3.19 @@ -1586,7 +1588,13 @@
    3.20          }
    3.21  
    3.22          final String in = mi[0];
    3.23 -        String object = accessClass(mangleClassName(in)) + "(false)";
    3.24 +        String mcn;
    3.25 +        if (callbacks && in.equals("org/apidesign/html/boot/spi/Fn")) {
    3.26 +            mcn = "java_lang_Class";
    3.27 +        } else {
    3.28 +            mcn = mangleClassName(in);
    3.29 +        }
    3.30 +        String object = accessClass(mcn) + "(false)";
    3.31          if (mn.startsWith("cons_")) {
    3.32              object += ".constructor";
    3.33          }
    3.34 @@ -1735,7 +1743,8 @@
    3.35              append(space);
    3.36              space = outputArg(this, p.args, index);
    3.37              if (p.html4j && space.length() > 0) {
    3.38 -                toValue.append("\n  ").append(p.args[index]).append(" = vm.org_apidesign_bck2brwsr_emul_lang_System(false).toJS(").
    3.39 +                toValue.append("\n  ").append(p.args[index]).append(" = ")
    3.40 +                    .append(accessClass("java_lang_Class")).append("(false).toJS(").
    3.41                      append(p.args[index]).append(");");
    3.42              }
    3.43              index++;