# HG changeset patch # User Jaroslav Tulach # Date 1400765380 -7200 # Node ID d4ee65642d8d88cd399b91613deefdefa2394af8 # Parent 60dcb3d7a687f83f4e00b06a8222c4b63c4ca340 Tests pass OK in full obfuscation mode diff -r 60dcb3d7a687 -r d4ee65642d8d launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/CompileCP.java --- a/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/CompileCP.java Thu May 22 12:19:52 2014 +0200 +++ b/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/CompileCP.java Thu May 22 15:29:40 2014 +0200 @@ -38,6 +38,7 @@ import java.util.zip.ZipEntry; import org.apidesign.bck2brwsr.launcher.BaseHTTPLauncher.Res; import org.apidesign.vm4brwsr.Bck2Brwsr; +import org.apidesign.vm4brwsr.ObfuscationLevel; /** * @@ -66,6 +67,7 @@ .addClasses(classes.toArray(new String[0])) .addExported(keep.toArray(new String[0])) .addResources(arr.toArray(new String[0])) + //.obfuscation(ObfuscationLevel.FULL) .library(true) .resources(new JarRes()) .generate(w); @@ -101,6 +103,7 @@ .addRootClasses(classes.toArray(new String[0])) .addResources(arr.toArray(new String[0])) .library(true) + //.obfuscation(ObfuscationLevel.FULL) .resources(new EmulationResources() { @Override public InputStream get(String resource) throws IOException { @@ -205,6 +208,7 @@ } Bck2Brwsr.newCompiler().addRootClasses(classes.toArray(new String[0])) + //.obfuscation(ObfuscationLevel.FULL) .resources(new Bck2Brwsr.Resources() { @Override public InputStream get(String resource) throws IOException { diff -r 60dcb3d7a687 -r d4ee65642d8d rt/emul/mini/src/main/java/java/lang/Class.java --- a/rt/emul/mini/src/main/java/java/lang/Class.java Thu May 22 12:19:52 2014 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java Thu May 22 15:29:40 2014 +0200 @@ -34,6 +34,7 @@ import java.lang.reflect.Method; import java.lang.reflect.TypeVariable; import java.net.URL; +import org.apidesign.bck2brwsr.core.Exported; import org.apidesign.bck2brwsr.core.JavaScriptBody; import org.apidesign.bck2brwsr.core.JavaScriptOnly; import org.apidesign.bck2brwsr.emul.reflect.AnnotationImpl; @@ -1743,7 +1744,7 @@ native static Class getPrimitiveClass(String type); @JavaScriptBody(args = {}, body = - "return this.desiredAssertionStatus ? this.desiredAssertionStatus : false;" + "return this['desiredAssertionStatus'] ? this['desiredAssertionStatus'] : false;" ) public native boolean desiredAssertionStatus(); @@ -1770,10 +1771,11 @@ ) static native Class classFor(Object self); + @Exported @JavaScriptBody(args = { "self" }, body - = "if (self.$hashCode) return self.$hashCode;\n" - + "var h = self.computeHashCode__I ? self.computeHashCode__I() : Math.random() * Math.pow(2, 31);\n" - + "return self.$hashCode = h & h;" + = "if (self['$hashCode']) return self['$hashCode'];\n" + + "var h = self['computeHashCode__I'] ? self['computeHashCode__I']() : Math.random() * Math.pow(2, 31);\n" + + "return self['$hashCode'] = h & h;" ) static native int defaultHashCode(Object self); @@ -1802,6 +1804,7 @@ ) static native int toJS(); + @Exported @JavaScriptOnly(name = "activate__Ljava_io_Closeable_2Lorg_apidesign_html_boot_spi_Fn$Presenter_2", value = "function() {\n" + " return vm.org_apidesign_bck2brwsr_emul_lang_System(false).activate__Ljava_io_Closeable_2();" + "}\n" @@ -1822,6 +1825,7 @@ @JavaScriptBody(args = {"o"}, body = "return o ? o.toString() : null;") private static native String msg(Object o); + @Exported @JavaScriptOnly(name = "bck2BrwsrThrwrbl", value = "c.bck2BrwsrCnvrt__Ljava_lang_Object_2Ljava_lang_Object_2") private static void bck2BrwsrCnvrtVM() { } diff -r 60dcb3d7a687 -r d4ee65642d8d rt/emul/mini/src/main/java/java/lang/String.java --- a/rt/emul/mini/src/main/java/java/lang/String.java Thu May 22 12:19:52 2014 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/String.java Thu May 22 15:29:40 2014 +0200 @@ -30,6 +30,7 @@ import java.lang.reflect.Method; import java.util.Comparator; import java.util.Locale; +import org.apidesign.bck2brwsr.core.Exported; import org.apidesign.bck2brwsr.core.ExtraJavaScript; import org.apidesign.bck2brwsr.core.JavaScriptBody; import org.apidesign.bck2brwsr.core.JavaScriptOnly; @@ -1457,7 +1458,7 @@ public int hashCode() { return super.hashCode(); } - int computeHashCode() { + @Exported int computeHashCode() { int h = 0; if (h == 0 && length() > 0) { int off = offset(); diff -r 60dcb3d7a687 -r d4ee65642d8d rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java --- a/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java Thu May 22 12:19:52 2014 +0200 +++ b/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java Thu May 22 15:29:40 2014 +0200 @@ -21,6 +21,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Enumeration; +import org.apidesign.bck2brwsr.core.Exported; import org.apidesign.bck2brwsr.core.JavaScriptBody; /** Utilities to work on methods. @@ -126,7 +127,7 @@ } return null; } - + public static Method[] findMethods(Class clazz, int mask) { Object[] namesAndData = findMethodData(clazz, "", false); int cnt = 0; @@ -137,6 +138,11 @@ if (middle == -1) { continue; } + if (sig.startsWith("$") && sig.endsWith("$")) { + // produced by Closure compiler in debug mode + // needs to be ignored + continue; + } String name = sig.substring(0, middle); sig = sig.substring(middle + 2); Class cls = (Class) namesAndData[i + 2]; @@ -152,7 +158,8 @@ } return arr; } - static String toSignature(Method m) { + + @Exported static String toSignature(Method m) { StringBuilder sb = new StringBuilder(); sb.append(m.getName()).append("__"); appendType(sb, m.getReturnType()); @@ -222,9 +229,17 @@ public static Enumeration signatureParser(final String sig) { class E implements Enumeration { int pos; + int len; + + E() { + len = sig.length(); + while (sig.charAt(len - 1) == '$') { + len--; + } + } public boolean hasMoreElements() { - return pos < sig.length(); + return pos < len; } public Class nextElement() { diff -r 60dcb3d7a687 -r d4ee65642d8d rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu May 22 12:19:52 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu May 22 15:29:40 2014 +0200 @@ -229,17 +229,7 @@ } for (MethodData m : jc.getMethods()) { byte[] onlyArr = m.findAnnotationData(true); - String[] only = findAnnotation(onlyArr, jc, - "org.apidesign.bck2brwsr.core.JavaScriptOnly", - "name", "value" - ); - if (only != null) { - if (only[0] != null && only[1] != null) { - append("\n p.").append(only[0]).append(" = ") - .append(only[1]).append(";"); - } - continue; - } + if (javaScriptOnly(onlyArr)) continue; String destObject; String mn; append("\n "); @@ -301,17 +291,7 @@ append("\n }"); for (FieldData v : jc.getFields()) { byte[] onlyArr = v.findAnnotationData(true); - String[] only = findAnnotation(onlyArr, jc, - "org.apidesign.bck2brwsr.core.JavaScriptOnly", - "name", "value" - ); - if (only != null) { - if (only[0] != null && only[1] != null) { - append("\n p.").append(only[0]).append(" = ") - .append(only[1]).append(";"); - } - continue; - } + if (javaScriptOnly(onlyArr)) continue; if (!v.isStatic()) { append("\n this.fld_"). append(className).append('_'). @@ -331,6 +311,25 @@ // } return ""; } + + private boolean javaScriptOnly(byte[] anno) throws IOException { + String[] only = findAnnotation(anno, jc, + "org.apidesign.bck2brwsr.core.JavaScriptOnly", + "name", "value" + ); + if (only != null) { + if (only[0] != null && only[1] != null) { + append("\n p.").append(only[0]).append(" = ") + .append(only[1]).append(";"); + } + if (ExportedSymbols.isMarkedAsExported(anno, jc)) { + append("\n p['").append(only[0]).append("'] = p.") + .append(only[0]).append(";"); + } + return true; + } + return false; + } private String generateStaticMethod(String destObject, MethodData m, StringArray toInitilize) throws IOException { String jsb = javaScriptBody(destObject, m, true); if (jsb != null) { diff -r 60dcb3d7a687 -r d4ee65642d8d rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java Thu May 22 12:19:52 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java Thu May 22 15:29:40 2014 +0200 @@ -138,7 +138,7 @@ } } - private boolean isMarkedAsExported(byte[] arrData, ClassData cd) + static boolean isMarkedAsExported(byte[] arrData, ClassData cd) throws IOException { if (arrData == null) { return false;