# HG changeset patch # User Jaroslav Tulach # Date 1403450356 -7200 # Node ID a34e2191b6bef239e557d44becfe905589a4b530 # Parent 8ac637d7d62a26d78d18c2d56b8735a49fc9e0ba Making sure no enumerable methods are on plain Object diff -r 8ac637d7d62a -r a34e2191b6be 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 Jun 22 00:09:56 2014 +0200 +++ b/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js Sun Jun 22 17:19:16 2014 +0200 @@ -2,7 +2,7 @@ vm.java_lang_reflect_Array(false); vm.java_lang_String(false); -Array.at = function(arr, indx, value) { +Object.defineProperty(Array, "at", { configurable: true, writable: true, value : function(arr, indx, value) { var prev = arr[indx]; if (typeof prev === 'undefined' && (indx < 0 || indx >= arr.length)) { var e = vm.java_lang_ArrayIndexOutOfBoundsException(true); @@ -14,11 +14,11 @@ } else { return prev; } -}; -Array.prototype.getClass__Ljava_lang_Class_2 = function() { +}}); +Object.defineProperty(Array.prototype, "getClass__Ljava_lang_Class_2", { configurable: true, writable: true, value : function() { return vm.java_lang_Class(false).defineArray__Ljava_lang_Class_2Ljava_lang_String_2Ljava_lang_Object_2(this.jvmName, this.fnc); -}; -Array.prototype.clone__Ljava_lang_Object_2 = function() { +}}); +Object.defineProperty(Array.prototype, "clone__Ljava_lang_Object_2", { configurable: true, writable: true, value : function() { var s = this.length; var ret = new Array(s); for (var i = 0; i < s; i++) { @@ -27,4 +27,4 @@ ret.jvmName = this.jvmName; ret.fnc = this.fnc; return ret; -}; +}}); diff -r 8ac637d7d62a -r a34e2191b6be rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jun 22 00:09:56 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jun 22 17:19:16 2014 +0200 @@ -365,7 +365,14 @@ final LocalsMapper lmapper = new LocalsMapper(stackMapIterator.getArguments()); - append(destObject).append(".").append(name).append(" = function("); + boolean obj = "java/lang/Object".equals(jc.getClassName()); + + if (obj) { + append("Object.defineProperty(").append(destObject). + append(", '").append(name).append("', { configurable: true, writable: true, value: function("); + } else { + append(destObject).append(".").append(name).append(" = function("); + } lmapper.outputArguments(this, m.isStatic()); append(") {").append("\n"); @@ -374,6 +381,9 @@ append(" throw 'no code found for ") .append(jc.getClassName()).append('.') .append(m.getName()).append("';\n"); + if (obj) { + append("}"); + } append("};"); return; } @@ -1393,7 +1403,11 @@ while (openBraces-- > 0) { append('}'); } - append("\n};"); + if (obj) { + append("\n}});"); + } else { + append("\n};"); + } } private int generateIf(StackMapper mapper, byte[] byteCodes, diff -r 8ac637d7d62a -r a34e2191b6be rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sun Jun 22 00:09:56 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sun Jun 22 17:19:16 2014 +0200 @@ -139,6 +139,13 @@ return countInstOf(10); } + public static String props() { + return list(new Object()); + } + + @JavaScriptBody(args = "o", body = "var s = ''; for (var p in {}) { s += p; }; return s;") + private static native String list(Object o); + @JavaScriptBody(args = "o", body = "var i = 0; for (p in o) { if (p.toString().indexOf('instOf') >= 0) i++; } return i;") private static native int countInstOf(Object o); diff -r 8ac637d7d62a -r a34e2191b6be rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sun Jun 22 00:09:56 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sun Jun 22 17:19:16 2014 +0200 @@ -17,9 +17,12 @@ */ package org.apidesign.vm4brwsr; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import org.testng.annotations.BeforeClass; /** * @@ -54,6 +57,14 @@ Double.valueOf(0) ); } + @Test public void noIterablePropsOnObject() throws Exception { + assertExec( + "No instOf properties found", + Instance.class, "props__Ljava_lang_String_2", + "" + ); + } + @Test public void verifyMagicOne() throws Exception { assertExec( "Should be three and something",