# HG changeset patch # User Jaroslav Tulach # Date 1400096596 -7200 # Node ID e2e9fb660c85effcff809b72270a1c12008cc755 # Parent bfda398c3a6851e50ef950b16bfb6a4b8a1aec10# Parent bdf93fec05a5cd505e9adb04fc7879d5de543e29 Obfuscated tests and their libraries pass tests OK diff -r bfda398c3a68 -r e2e9fb660c85 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java Sun May 11 14:01:18 2014 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java Wed May 14 21:43:16 2014 +0200 @@ -96,7 +96,7 @@ + " var el = window.document.getElementById(name);\n" + " el.parentNode.removeChild(el);\n" + " arr[0] = data;\n" - + " run.run__V();\n" + + " run['run__V']();\n" + "};\n" + "return true;\n" ) @@ -115,7 +115,7 @@ + " } catch (error) {;\n" + " throw 'Cannot parse' + error + ':' + this.response;\n" + " };\n" - + " callback.run__V();\n" + + " callback['run__V']();\n" + "};" + "request.send();" ) diff -r bfda398c3a68 -r e2e9fb660c85 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Sun May 11 14:01:18 2014 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Wed May 14 21:43:16 2014 +0200 @@ -140,7 +140,7 @@ } - @JavaScriptOnly(name = "koArray", value = "function() { return this.toArray___3Ljava_lang_Object_2(); }") + @JavaScriptOnly(name = "koArray", value = "function() { return this['toArray___3Ljava_lang_Object_2'](); }") private static native int koArray(); private void notifyChange() { diff -r bfda398c3a68 -r e2e9fb660c85 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypesTest.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypesTest.java Sun May 11 14:01:18 2014 +0200 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypesTest.java Wed May 14 21:43:16 2014 +0200 @@ -28,9 +28,9 @@ */ public class ConvertTypesTest { @JavaScriptBody(args = { "includeSex" }, body = "var json = new Object();" - + "json.firstName = 'son';\n" - + "json.lastName = 'dj';\n" - + "if (includeSex) json.sex = 'MALE';\n" + + "json['firstName'] = 'son';\n" + + "json['lastName'] = 'dj';\n" + + "if (includeSex) json['sex'] = 'MALE';\n" + "return json;" ) private static native Object createJSON(boolean includeSex); diff -r bfda398c3a68 -r e2e9fb660c85 launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java --- a/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java Sun May 11 14:01:18 2014 +0200 +++ b/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java Wed May 14 21:43:16 2014 +0200 @@ -266,7 +266,7 @@ return u; } - @JavaScriptBody(args = {}, body = "vm.java_lang_Class(false).desiredAssertionStatus = true;") + @JavaScriptBody(args = {}, body = "vm['java_lang_Class'](false)['desiredAssertionStatus'] = true;") private static void turnAssetionStatusOn() { } diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/compact/src/main/java/java/util/EnumMap.java --- a/rt/emul/compact/src/main/java/java/util/EnumMap.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/compact/src/main/java/java/util/EnumMap.java Wed May 14 21:43:16 2014 +0200 @@ -737,7 +737,7 @@ * Returns all of the values comprising K. * The result is uncloned, cached, and shared by all callers. */ - @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.fld_$VALUES;") + @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.prototype['_$VALUES']();") private static native > K[] getKeyUniverse(Class keyType); private static final long serialVersionUID = 458661240069192865L; diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/compact/src/main/java/java/util/EnumSet.java --- a/rt/emul/compact/src/main/java/java/util/EnumSet.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/compact/src/main/java/java/util/EnumSet.java Wed May 14 21:43:16 2014 +0200 @@ -384,7 +384,7 @@ * Returns all of the values comprising E. * The result is uncloned, cached, and shared by all callers. */ - @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.fld_$VALUES;") + @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.prototype['_$VALUES']();") private static native > E[] getUniverse(Class elementType); /** diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/compact/src/main/java/org/apidesign/bck2brwsr/emul/reflect/ProxyImpl.java --- a/rt/emul/compact/src/main/java/org/apidesign/bck2brwsr/emul/reflect/ProxyImpl.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/compact/src/main/java/org/apidesign/bck2brwsr/emul/reflect/ProxyImpl.java Wed May 14 21:43:16 2014 +0200 @@ -679,8 +679,8 @@ @JavaScriptBody(args = { "ignore", "name", "byteCode" }, body = - "var r = vm._reload;" - + "if (!r) r = exports._reload;" + "var r = vm['_reload'];" + + "if (!r) r = exports['_reload'];" + "return r(name, byteCode).constructor.$class;" ) private static native Class defineClass0( @@ -909,8 +909,8 @@ @JavaScriptBody(args = { "c", "sig", "method", "primitive" }, body = "var p = c.cnstr.prototype;\n" + "p[sig] = function() {\n" + - " var h = this._h();\n" + - " var res = h.invoke__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_reflect_Method_2_3Ljava_lang_Object_2(this, method, arguments);\n" + + " var h = this['_h']();\n" + + " var res = h['invoke__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_reflect_Method_2_3Ljava_lang_Object_2'](this, method, arguments);\n" + " \n" + " \n" + " return res;\n" + @@ -919,8 +919,8 @@ private static native void defineMethod(Class proxyClass, String sig, Method method, boolean primitive); @JavaScriptBody(args = "c", body = - "var h = c.cnstr.cons__VLjava_lang_reflect_InvocationHandler_2 = function(h) {\n" - + " c.superclass.cnstr.cons__VLjava_lang_reflect_InvocationHandler_2.call(this, h);\n" + "var h = c.cnstr['cons__VLjava_lang_reflect_InvocationHandler_2'] = function(h) {\n" + + " c.superclass.cnstr['cons__VLjava_lang_reflect_InvocationHandler_2'].call(this, h);\n" + "}\n" + "h.cls = c.cnstr;\n" ) diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java --- a/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Wed May 14 21:43:16 2014 +0200 @@ -178,11 +178,13 @@ return "".getClass().isEnum(); } - @Compare public String newInstanceFails() throws InstantiationException { + @Compare public String newInstanceFails() { try { return "success: " + StaticUseSub.class.newInstance(); } catch (IllegalAccessException ex) { - return ex.getClass().getName(); + return "failure"; + } catch (InstantiationException ex) { + return "failure"; } } diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/mini/src/main/java/java/lang/Enum.java --- a/rt/emul/mini/src/main/java/java/lang/Enum.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/Enum.java Wed May 14 21:43:16 2014 +0200 @@ -235,7 +235,7 @@ throw new IllegalArgumentException(); } - @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.fld_$VALUES;") + @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.prototype['_$VALUES']();") private static native Object[] values(Class enumType); /** diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js --- a/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js Wed May 14 21:43:16 2014 +0200 @@ -3,15 +3,17 @@ vm.java_lang_String(false); Array.at = function(arr, indx, value) { - if (indx < 0 || indx >= arr.length) { - var e = vm.java_lang_ArrayIndexOutOfBoundsException(true); - e.constructor.cons__VLjava_lang_String_2.call(e, indx.toString()); - throw e; + var prev = arr[indx]; + if (typeof prev === 'undefined' && (indx < 0 || indx >= arr.length)) { + var e = vm.java_lang_ArrayIndexOutOfBoundsException(true); + e.constructor.cons__VLjava_lang_String_2.call(e, indx.toString()); + throw e; } if (arguments.length === 3) { - arr[indx] = value; + arr[indx] = value; + } else { + return prev; } - return arr[indx]; }; Array.prototype.getClass__Ljava_lang_Class_2 = function() { return vm.java_lang_Class(false).defineArray__Ljava_lang_Class_2Ljava_lang_String_2Ljava_lang_Object_2(this.jvmName, this.fnc); diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/zip/src/main/java/org/apidesign/bck2brwsr/emul/zip/FastJar.java --- a/rt/emul/zip/src/main/java/org/apidesign/bck2brwsr/emul/zip/FastJar.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/zip/src/main/java/org/apidesign/bck2brwsr/emul/zip/FastJar.java Wed May 14 21:43:16 2014 +0200 @@ -36,6 +36,7 @@ import java.lang.reflect.Method; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import org.apidesign.bck2brwsr.core.Exported; import org.apidesign.bck2brwsr.core.JavaScriptBody; /** @@ -185,6 +186,8 @@ + " }\n" + "}" ) + + @Exported static void arraycopy(Object src, int srcBegin, Object dst, int dstBegin, int count) { try { Class system = Class.forName("java.lang.System"); diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java --- a/rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java Wed May 14 21:43:16 2014 +0200 @@ -17,7 +17,6 @@ */ package org.apidesign.bck2brwsr.emul.zip; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; diff -r bfda398c3a68 -r e2e9fb660c85 rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/ZipFileTest.java --- a/rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/ZipFileTest.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/ZipFileTest.java Wed May 14 21:43:16 2014 +0200 @@ -54,8 +54,8 @@ @JavaScriptBody(args = { "res", "path" }, body = "var myvm = bck2brwsr.apply(null, path);\n" - + "var cls = myvm.loadClass('java.lang.String');\n" - + "return cls.getClass__Ljava_lang_Class_2().getResourceAsStream__Ljava_io_InputStream_2Ljava_lang_String_2(res);\n" + + "var cls = myvm['loadClass']('java.lang.String');\n" + + "return cls['getClass__Ljava_lang_Class_2']()['getResourceAsStream__Ljava_io_InputStream_2Ljava_lang_String_2'](res);\n" ) private static native Object loadVMResource(String res, String...path); diff -r bfda398c3a68 -r e2e9fb660c85 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed May 14 21:43:16 2014 +0200 @@ -1313,7 +1313,8 @@ String[] fi = jc.getFieldInfoName(indx); final int type = VarType.fromFieldType(fi[2].charAt(0)); String ac = accessClass(mangleClassName(fi[0])); - smapper.assign(this, type, ac + "(false)._" + fi[1] + "()"); + String af = accessField(ac + "(false)", "_" + fi[1], fi); + smapper.assign(this, type, af + "()"); i += 2; addReference(fi[0]); break; @@ -1980,7 +1981,7 @@ } cnt[++depth] = 0; if (attrName != null) { - append(attrName).append(" : "); + append('"').append(attrName).append("\" : "); } if (type == '[') { append("["); @@ -2010,8 +2011,13 @@ final String slashType = attrType.substring(1, attrType.length() - 1); requireReference(slashType); - append(accessClass(mangleClassName(slashType))) - .append("(false).constructor.fld_").append(value); + final String cn = mangleClassName(slashType); + append(accessClass(cn)) + .append("(false)['valueOf__L"). + append(cn). + append("_2Ljava_lang_String_2']('"). + append(value). + append("')"); } }; ap.parse(data, cd); diff -r bfda398c3a68 -r e2e9fb660c85 rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Wed May 14 21:43:16 2014 +0200 @@ -33,7 +33,13 @@ */ @ExtraJavaScript(processByteCode = false, resource="") final class ClosureWrapper extends CommandLineRunner { - private static final String[] ARGS = { "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--js", "bck2brwsr-raw.js" /*, "--debug", "--formatting", "PRETTY_PRINT" */ }; + private static final String[] ARGS = { + "--compilation_level", + "SIMPLE_OPTIMIZATIONS", + "--js", "bck2brwsr-raw.js" + //, "--debug" + //, "--formatting", "PRETTY_PRINT" + }; private final Bck2Brwsr config; @@ -175,6 +181,7 @@ "toInt32", "toFP", "toLong", + "toJS", "toExactString", "add64", "sub64", @@ -185,6 +192,7 @@ "shl64", "shr64", "ushr64", + "compare", "compare64", "neg64", "div32", diff -r bfda398c3a68 -r e2e9fb660c85 rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java Wed May 14 21:43:16 2014 +0200 @@ -55,8 +55,20 @@ } boolean isExported(FieldData fieldData) throws IOException { - return isAccessible(fieldData.access) && isExported(fieldData.cls) - || isMarkedAsExported(fieldData); + if ( + isAccessible(fieldData.access) && + isExported(fieldData.cls) || isMarkedAsExported(fieldData) + ) { + return true; + } + if ( + fieldData.isStatic() && fieldData.getName().equals("$VALUES") && + "java/lang/Enum".equals(fieldData.cls.getSuperClassName()) + ) { + // enum values need to be exported + return true; + } + return false; } private boolean isMarkedAsExportedPackage(String pkgName) { diff -r bfda398c3a68 -r e2e9fb660c85 rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Wed May 14 21:43:16 2014 +0200 @@ -98,7 +98,7 @@ } for (String r : asBinary.toArray()) { - append("\n ").append(getExportsObject()).append(".registerResource('"); + append("\n ").append(getExportsObject()).append("['registerResource']('"); append(r).append("', '"); InputStream is = this.resources.get(r); byte[] arr = new byte[is.available()]; @@ -522,7 +522,7 @@ + " for (var i = 0; i < extensions.length; ++i) {\n" + " extensions[i](vm);\n" + " }\n" - + " vm.registerResource = null;\n" + + " vm['registerResource'] = null;\n" + " var knownExtensions = extensions.length;\n" + " var loader = {};\n" + " loader.vm = vm;\n" @@ -535,9 +535,9 @@ + " load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n" + " } catch (err) {\n" + " while (knownExtensions < extensions.length) {\n" - + " vm.registerResource = registerResource;\n" + + " vm['registerResource'] = registerResource;\n" + " extensions[knownExtensions++](vm);\n" - + " vm.registerResource = null;\n" + + " vm['registerResource'] = null;\n" + " }\n" + " fn = vm[attr];\n" + " if (fn) return fn(false);\n" @@ -568,9 +568,9 @@ + " loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2I(loader, name, args, skip);\n" + " if (ret !== null) return ret;\n" + " while (knownExtensions < extensions.length) {\n" - + " vm.registerResource = registerResource;\n" + + " vm['registerResource'] = registerResource;\n" + " extensions[knownExtensions++](vm);\n" - + " vm.registerResource = null;\n" + + " vm['registerResource'] = null;\n" + " }\n" + " var arr = resources[name];\n" + " return (arr && arr.length > arrSize) ? arr[arrSize] : null;\n" diff -r bfda398c3a68 -r e2e9fb660c85 rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Wed May 14 21:43:16 2014 +0200 @@ -37,46 +37,46 @@ return a % b; } - static float deserFloat() throws IOException { + public static float deserFloat() throws IOException { byte[] arr = {(byte) 71, (byte) 84, (byte) 52, (byte) 83}; ByteArrayInputStream is = new ByteArrayInputStream(arr); DataInputStream dis = new DataInputStream(is); float r = dis.readFloat(); return r; } - static double deserDouble() throws IOException { + public static double deserDouble() throws IOException { byte[] arr = {(byte)64, (byte)8, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0}; ByteArrayInputStream is = new ByteArrayInputStream(arr); DataInputStream dis = new DataInputStream(is); return dis.readDouble(); } - static long deserLong(byte[] arr) throws IOException { + public static long deserLong(byte[] arr) throws IOException { ByteArrayInputStream is = new ByteArrayInputStream(arr); DataInputStream dis = new DataInputStream(is); return dis.readLong(); } - static long deserLong(byte[] arr, int shift) throws IOException { + public static long deserLong(byte[] arr, int shift) throws IOException { return deserLong(arr) >> shift; } - static int deserInt() throws IOException { + public static int deserInt() throws IOException { byte[] arr = {(byte) 71, (byte) 84, (byte) 52, (byte) 83}; ByteArrayInputStream is = new ByteArrayInputStream(arr); DataInputStream dis = new DataInputStream(is); return dis.readInt(); } - static long bytesToLong(byte b1, byte b2, int shift) { + public static long bytesToLong(byte b1, byte b2, int shift) { return (((long)b1 << 56) + ((long)b2 & 255) << 48) >> shift; } - static String intToString() { + public static String intToString() { return new Integer(5).toString().toString(); } - static String floatToString() { + public static String floatToString() { return new Float(7.0).toString().toString(); } - static double seven(int todo) { + public static double seven(int todo) { switch (todo) { case 0: return sevenNew().doubleValue(); case 1: return sevenNew().intValue(); @@ -91,7 +91,7 @@ default: throw new IllegalStateException(); } } - static boolean bseven(int todo) { + public static boolean bseven(int todo) { switch (todo) { case 30: return bvalueOf(Boolean.FALSE); case 31: return bvalueOf(Boolean.TRUE); diff -r bfda398c3a68 -r e2e9fb660c85 rt/vm/src/test/java/org/apidesign/vm4brwsr/Resources.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Resources.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Resources.java Wed May 14 21:43:16 2014 +0200 @@ -64,7 +64,7 @@ ((long)b2 & 255) << 48) >> shift; } - static String loadHello() throws IOException { + public static String loadHello() throws IOException { Enumeration en; try { en = Resources.class.getClassLoader().getResources("META-INF/ahoj"); @@ -78,7 +78,7 @@ } return sb.toString().toString(); } - static String loadJustHello() throws IOException { + public static String loadJustHello() throws IOException { URL url = Resources.class.getResource("/META-INF/ahoj"); StringBuilder sb = new StringBuilder(); sb.append(readIS(url.openStream(), true)); diff -r bfda398c3a68 -r e2e9fb660c85 rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java Sun May 11 14:01:18 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java Wed May 14 21:43:16 2014 +0200 @@ -160,7 +160,9 @@ return super.get(name); } }). - addRootClasses(name).library(true); + addRootClasses(name). + obfuscation(ObfuscationLevel.FULL). + library(true); if (resourceName != null) { b2b = b2b.addResources(resourceName); }