1.1 --- a/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js Sun Jun 22 00:09:56 2014 +0200
1.2 +++ b/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js Sun Jun 22 17:19:16 2014 +0200
1.3 @@ -2,7 +2,7 @@
1.4 vm.java_lang_reflect_Array(false);
1.5 vm.java_lang_String(false);
1.6
1.7 -Array.at = function(arr, indx, value) {
1.8 +Object.defineProperty(Array, "at", { configurable: true, writable: true, value : function(arr, indx, value) {
1.9 var prev = arr[indx];
1.10 if (typeof prev === 'undefined' && (indx < 0 || indx >= arr.length)) {
1.11 var e = vm.java_lang_ArrayIndexOutOfBoundsException(true);
1.12 @@ -14,11 +14,11 @@
1.13 } else {
1.14 return prev;
1.15 }
1.16 -};
1.17 -Array.prototype.getClass__Ljava_lang_Class_2 = function() {
1.18 +}});
1.19 +Object.defineProperty(Array.prototype, "getClass__Ljava_lang_Class_2", { configurable: true, writable: true, value : function() {
1.20 return vm.java_lang_Class(false).defineArray__Ljava_lang_Class_2Ljava_lang_String_2Ljava_lang_Object_2(this.jvmName, this.fnc);
1.21 -};
1.22 -Array.prototype.clone__Ljava_lang_Object_2 = function() {
1.23 +}});
1.24 +Object.defineProperty(Array.prototype, "clone__Ljava_lang_Object_2", { configurable: true, writable: true, value : function() {
1.25 var s = this.length;
1.26 var ret = new Array(s);
1.27 for (var i = 0; i < s; i++) {
1.28 @@ -27,4 +27,4 @@
1.29 ret.jvmName = this.jvmName;
1.30 ret.fnc = this.fnc;
1.31 return ret;
1.32 -};
1.33 +}});
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jun 22 00:09:56 2014 +0200
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jun 22 17:19:16 2014 +0200
2.3 @@ -365,7 +365,14 @@
2.4 final LocalsMapper lmapper =
2.5 new LocalsMapper(stackMapIterator.getArguments());
2.6
2.7 - append(destObject).append(".").append(name).append(" = function(");
2.8 + boolean obj = "java/lang/Object".equals(jc.getClassName());
2.9 +
2.10 + if (obj) {
2.11 + append("Object.defineProperty(").append(destObject).
2.12 + append(", '").append(name).append("', { configurable: true, writable: true, value: function(");
2.13 + } else {
2.14 + append(destObject).append(".").append(name).append(" = function(");
2.15 + }
2.16 lmapper.outputArguments(this, m.isStatic());
2.17 append(") {").append("\n");
2.18
2.19 @@ -374,6 +381,9 @@
2.20 append(" throw 'no code found for ")
2.21 .append(jc.getClassName()).append('.')
2.22 .append(m.getName()).append("';\n");
2.23 + if (obj) {
2.24 + append("}");
2.25 + }
2.26 append("};");
2.27 return;
2.28 }
2.29 @@ -1393,7 +1403,11 @@
2.30 while (openBraces-- > 0) {
2.31 append('}');
2.32 }
2.33 - append("\n};");
2.34 + if (obj) {
2.35 + append("\n}});");
2.36 + } else {
2.37 + append("\n};");
2.38 + }
2.39 }
2.40
2.41 private int generateIf(StackMapper mapper, byte[] byteCodes,
3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sun Jun 22 00:09:56 2014 +0200
3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sun Jun 22 17:19:16 2014 +0200
3.3 @@ -139,6 +139,13 @@
3.4 return countInstOf(10);
3.5 }
3.6
3.7 + public static String props() {
3.8 + return list(new Object());
3.9 + }
3.10 +
3.11 + @JavaScriptBody(args = "o", body = "var s = ''; for (var p in {}) { s += p; }; return s;")
3.12 + private static native String list(Object o);
3.13 +
3.14 @JavaScriptBody(args = "o", body = "var i = 0; for (p in o) { if (p.toString().indexOf('instOf') >= 0) i++; } return i;")
3.15 private static native int countInstOf(Object o);
3.16
4.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sun Jun 22 00:09:56 2014 +0200
4.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sun Jun 22 17:19:16 2014 +0200
4.3 @@ -17,9 +17,12 @@
4.4 */
4.5 package org.apidesign.vm4brwsr;
4.6
4.7 +import javax.script.ScriptEngine;
4.8 +import javax.script.ScriptEngineManager;
4.9 +import static org.testng.Assert.fail;
4.10 import org.testng.annotations.AfterClass;
4.11 +import org.testng.annotations.BeforeClass;
4.12 import org.testng.annotations.Test;
4.13 -import org.testng.annotations.BeforeClass;
4.14
4.15 /**
4.16 *
4.17 @@ -54,6 +57,14 @@
4.18 Double.valueOf(0)
4.19 );
4.20 }
4.21 + @Test public void noIterablePropsOnObject() throws Exception {
4.22 + assertExec(
4.23 + "No instOf properties found",
4.24 + Instance.class, "props__Ljava_lang_String_2",
4.25 + ""
4.26 + );
4.27 + }
4.28 +
4.29 @Test public void verifyMagicOne() throws Exception {
4.30 assertExec(
4.31 "Should be three and something",