Making sure no enumerable methods are on plain Object defprop
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 22 Jun 2014 17:19:16 +0200
branchdefprop
changeset 1633a34e2191b6be
parent 1632 8ac637d7d62a
child 1634 783acbc99199
Making sure no enumerable methods are on plain Object
rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java
     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",