Tests pass OK in full obfuscation mode closure
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 22 May 2014 15:29:40 +0200
branchclosure
changeset 1586d4ee65642d8d
parent 1585 60dcb3d7a687
child 1587 bf08bd96d408
Tests pass OK in full obfuscation mode
launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/CompileCP.java
rt/emul/mini/src/main/java/java/lang/Class.java
rt/emul/mini/src/main/java/java/lang/String.java
rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java
     1.1 --- a/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/CompileCP.java	Thu May 22 12:19:52 2014 +0200
     1.2 +++ b/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/CompileCP.java	Thu May 22 15:29:40 2014 +0200
     1.3 @@ -38,6 +38,7 @@
     1.4  import java.util.zip.ZipEntry;
     1.5  import org.apidesign.bck2brwsr.launcher.BaseHTTPLauncher.Res;
     1.6  import org.apidesign.vm4brwsr.Bck2Brwsr;
     1.7 +import org.apidesign.vm4brwsr.ObfuscationLevel;
     1.8  
     1.9  /**
    1.10   *
    1.11 @@ -66,6 +67,7 @@
    1.12                  .addClasses(classes.toArray(new String[0]))
    1.13                  .addExported(keep.toArray(new String[0]))
    1.14                  .addResources(arr.toArray(new String[0]))
    1.15 +                //.obfuscation(ObfuscationLevel.FULL)
    1.16                  .library(true)
    1.17                  .resources(new JarRes())
    1.18                  .generate(w);
    1.19 @@ -101,6 +103,7 @@
    1.20                      .addRootClasses(classes.toArray(new String[0]))
    1.21                      .addResources(arr.toArray(new String[0]))
    1.22                      .library(true)
    1.23 +                    //.obfuscation(ObfuscationLevel.FULL)
    1.24                      .resources(new EmulationResources() {
    1.25                          @Override
    1.26                          public InputStream get(String resource) throws IOException {
    1.27 @@ -205,6 +208,7 @@
    1.28          }
    1.29  
    1.30          Bck2Brwsr.newCompiler().addRootClasses(classes.toArray(new String[0]))
    1.31 +            //.obfuscation(ObfuscationLevel.FULL)
    1.32              .resources(new Bck2Brwsr.Resources() {
    1.33                  @Override
    1.34                  public InputStream get(String resource) throws IOException {
     2.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java	Thu May 22 12:19:52 2014 +0200
     2.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java	Thu May 22 15:29:40 2014 +0200
     2.3 @@ -34,6 +34,7 @@
     2.4  import java.lang.reflect.Method;
     2.5  import java.lang.reflect.TypeVariable;
     2.6  import java.net.URL;
     2.7 +import org.apidesign.bck2brwsr.core.Exported;
     2.8  import org.apidesign.bck2brwsr.core.JavaScriptBody;
     2.9  import org.apidesign.bck2brwsr.core.JavaScriptOnly;
    2.10  import org.apidesign.bck2brwsr.emul.reflect.AnnotationImpl;
    2.11 @@ -1743,7 +1744,7 @@
    2.12      native static Class getPrimitiveClass(String type);
    2.13  
    2.14      @JavaScriptBody(args = {}, body = 
    2.15 -        "return this.desiredAssertionStatus ? this.desiredAssertionStatus : false;"
    2.16 +        "return this['desiredAssertionStatus'] ? this['desiredAssertionStatus'] : false;"
    2.17      )
    2.18      public native boolean desiredAssertionStatus();
    2.19      
    2.20 @@ -1770,10 +1771,11 @@
    2.21      )
    2.22      static native Class<?> classFor(Object self);
    2.23      
    2.24 +    @Exported
    2.25      @JavaScriptBody(args = { "self" }, body
    2.26 -            = "if (self.$hashCode) return self.$hashCode;\n"
    2.27 -            + "var h = self.computeHashCode__I ? self.computeHashCode__I() : Math.random() * Math.pow(2, 31);\n"
    2.28 -            + "return self.$hashCode = h & h;"
    2.29 +            = "if (self['$hashCode']) return self['$hashCode'];\n"
    2.30 +            + "var h = self['computeHashCode__I'] ? self['computeHashCode__I']() : Math.random() * Math.pow(2, 31);\n"
    2.31 +            + "return self['$hashCode'] = h & h;"
    2.32      )
    2.33      static native int defaultHashCode(Object self);
    2.34  
    2.35 @@ -1802,6 +1804,7 @@
    2.36      )
    2.37      static native int toJS();
    2.38  
    2.39 +    @Exported
    2.40      @JavaScriptOnly(name = "activate__Ljava_io_Closeable_2Lorg_apidesign_html_boot_spi_Fn$Presenter_2", value = "function() {\n"
    2.41          + "  return vm.org_apidesign_bck2brwsr_emul_lang_System(false).activate__Ljava_io_Closeable_2();"
    2.42          + "}\n"
    2.43 @@ -1822,6 +1825,7 @@
    2.44      @JavaScriptBody(args = {"o"}, body = "return o ? o.toString() : null;")
    2.45      private static native String msg(Object o);
    2.46  
    2.47 +    @Exported
    2.48      @JavaScriptOnly(name = "bck2BrwsrThrwrbl", value = "c.bck2BrwsrCnvrt__Ljava_lang_Object_2Ljava_lang_Object_2")
    2.49      private static void bck2BrwsrCnvrtVM() {
    2.50      }
     3.1 --- a/rt/emul/mini/src/main/java/java/lang/String.java	Thu May 22 12:19:52 2014 +0200
     3.2 +++ b/rt/emul/mini/src/main/java/java/lang/String.java	Thu May 22 15:29:40 2014 +0200
     3.3 @@ -30,6 +30,7 @@
     3.4  import java.lang.reflect.Method;
     3.5  import java.util.Comparator;
     3.6  import java.util.Locale;
     3.7 +import org.apidesign.bck2brwsr.core.Exported;
     3.8  import org.apidesign.bck2brwsr.core.ExtraJavaScript;
     3.9  import org.apidesign.bck2brwsr.core.JavaScriptBody;
    3.10  import org.apidesign.bck2brwsr.core.JavaScriptOnly;
    3.11 @@ -1457,7 +1458,7 @@
    3.12      public int hashCode() {
    3.13          return super.hashCode();
    3.14      }
    3.15 -    int computeHashCode() {
    3.16 +    @Exported int computeHashCode() {
    3.17          int h = 0;
    3.18          if (h == 0 && length() > 0) {
    3.19              int off = offset();
     4.1 --- a/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java	Thu May 22 12:19:52 2014 +0200
     4.2 +++ b/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java	Thu May 22 15:29:40 2014 +0200
     4.3 @@ -21,6 +21,7 @@
     4.4  import java.lang.reflect.Constructor;
     4.5  import java.lang.reflect.Method;
     4.6  import java.util.Enumeration;
     4.7 +import org.apidesign.bck2brwsr.core.Exported;
     4.8  import org.apidesign.bck2brwsr.core.JavaScriptBody;
     4.9  
    4.10  /** Utilities to work on methods.
    4.11 @@ -126,7 +127,7 @@
    4.12          }
    4.13          return null;
    4.14      }
    4.15 -
    4.16 +    
    4.17      public static Method[] findMethods(Class<?> clazz, int mask) {
    4.18          Object[] namesAndData = findMethodData(clazz, "", false);
    4.19          int cnt = 0;
    4.20 @@ -137,6 +138,11 @@
    4.21              if (middle == -1) {
    4.22                  continue;
    4.23              }
    4.24 +            if (sig.startsWith("$") && sig.endsWith("$")) {
    4.25 +                // produced by Closure compiler in debug mode
    4.26 +                // needs to be ignored
    4.27 +                continue;
    4.28 +            }
    4.29              String name = sig.substring(0, middle);
    4.30              sig = sig.substring(middle + 2);
    4.31              Class<?> cls = (Class<?>) namesAndData[i + 2];
    4.32 @@ -152,7 +158,8 @@
    4.33          }
    4.34          return arr;
    4.35      }
    4.36 -    static String toSignature(Method m) {
    4.37 +    
    4.38 +    @Exported static String toSignature(Method m) {
    4.39          StringBuilder sb = new StringBuilder();
    4.40          sb.append(m.getName()).append("__");
    4.41          appendType(sb, m.getReturnType());
    4.42 @@ -222,9 +229,17 @@
    4.43      public static Enumeration<Class> signatureParser(final String sig) {
    4.44          class E implements Enumeration<Class> {
    4.45              int pos;
    4.46 +            int len;
    4.47 +            
    4.48 +            E() {
    4.49 +                len = sig.length();
    4.50 +                while (sig.charAt(len - 1) == '$') {
    4.51 +                    len--;
    4.52 +                }
    4.53 +            }
    4.54              
    4.55              public boolean hasMoreElements() {
    4.56 -                return pos < sig.length();
    4.57 +                return pos < len;
    4.58              }
    4.59  
    4.60              public Class nextElement() {
     5.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu May 22 12:19:52 2014 +0200
     5.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu May 22 15:29:40 2014 +0200
     5.3 @@ -229,17 +229,7 @@
     5.4          }
     5.5          for (MethodData m : jc.getMethods()) {
     5.6              byte[] onlyArr = m.findAnnotationData(true);
     5.7 -            String[] only = findAnnotation(onlyArr, jc, 
     5.8 -                "org.apidesign.bck2brwsr.core.JavaScriptOnly", 
     5.9 -                "name", "value"
    5.10 -            );
    5.11 -            if (only != null) {
    5.12 -                if (only[0] != null && only[1] != null) {
    5.13 -                    append("\n    p.").append(only[0]).append(" = ")
    5.14 -                        .append(only[1]).append(";");
    5.15 -                }
    5.16 -                continue;
    5.17 -            }
    5.18 +            if (javaScriptOnly(onlyArr)) continue;
    5.19              String destObject;
    5.20              String mn;
    5.21              append("\n    ");
    5.22 @@ -301,17 +291,7 @@
    5.23          append("\n    }");
    5.24          for (FieldData v : jc.getFields()) {
    5.25              byte[] onlyArr = v.findAnnotationData(true);
    5.26 -            String[] only = findAnnotation(onlyArr, jc, 
    5.27 -                "org.apidesign.bck2brwsr.core.JavaScriptOnly", 
    5.28 -                "name", "value"
    5.29 -            );
    5.30 -            if (only != null) {
    5.31 -                if (only[0] != null && only[1] != null) {
    5.32 -                    append("\n    p.").append(only[0]).append(" = ")
    5.33 -                        .append(only[1]).append(";");
    5.34 -                }
    5.35 -                continue;
    5.36 -            }
    5.37 +            if (javaScriptOnly(onlyArr)) continue;
    5.38              if (!v.isStatic()) {
    5.39                  append("\n    this.fld_").
    5.40                      append(className).append('_').
    5.41 @@ -331,6 +311,25 @@
    5.42  //        }
    5.43          return "";
    5.44      }
    5.45 +
    5.46 +    private boolean javaScriptOnly(byte[] anno) throws IOException {
    5.47 +        String[] only = findAnnotation(anno, jc,
    5.48 +            "org.apidesign.bck2brwsr.core.JavaScriptOnly",
    5.49 +            "name", "value"
    5.50 +        );
    5.51 +        if (only != null) {
    5.52 +            if (only[0] != null && only[1] != null) {
    5.53 +                append("\n    p.").append(only[0]).append(" = ")
    5.54 +                    .append(only[1]).append(";");
    5.55 +            }
    5.56 +            if (ExportedSymbols.isMarkedAsExported(anno, jc)) {
    5.57 +                append("\n    p['").append(only[0]).append("'] = p.")
    5.58 +                    .append(only[0]).append(";");
    5.59 +            }
    5.60 +            return true;
    5.61 +        }
    5.62 +        return false;
    5.63 +    }
    5.64      private String generateStaticMethod(String destObject, MethodData m, StringArray toInitilize) throws IOException {
    5.65          String jsb = javaScriptBody(destObject, m, true);
    5.66          if (jsb != null) {
     6.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java	Thu May 22 12:19:52 2014 +0200
     6.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java	Thu May 22 15:29:40 2014 +0200
     6.3 @@ -138,7 +138,7 @@
     6.4          }
     6.5      }
     6.6  
     6.7 -    private boolean isMarkedAsExported(byte[] arrData, ClassData cd)
     6.8 +    static boolean isMarkedAsExported(byte[] arrData, ClassData cd)
     6.9              throws IOException {
    6.10          if (arrData == null) {
    6.11              return false;