Merge with default to get correct behavior of the contructor property of prototype reflection
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 01 Dec 2012 12:14:37 +0100
branchreflection
changeset 227fae5261c8a9a
parent 225 25e350c6385f
parent 226 907a52ed10e3
child 228 c40f70283620
Merge with default to get correct behavior of the contructor property of prototype
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sat Dec 01 08:52:30 2012 +0100
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sat Dec 01 12:14:37 2012 +0100
     1.3 @@ -107,17 +107,18 @@
     1.4                  generateInstanceMethod("\n    p.", m);
     1.5              }
     1.6          }
     1.7 +        out.append("\n    p.constructor = CLS;");
     1.8          out.append("\n    p.$instOf_").append(className).append(" = true;");
     1.9          for (String superInterface : jc.getSuperInterfaces()) {
    1.10              out.append("\n    p.$instOf_").append(superInterface.replace('/', '_')).append(" = true;");
    1.11          }
    1.12          out.append("\n    CLS.$class = java_lang_Class(true);");
    1.13          out.append("\n    CLS.$class.jvmName = '").append(jc.getClassName()).append("';");
    1.14 -        out.append("\n      if (arguments.length === 0) {");
    1.15 -        out.append("\n        return new CLS();");
    1.16 -        out.append("\n      }");
    1.17          out.append("\n  }");
    1.18          out.append("\n  if (arguments.length === 0) {");
    1.19 +        out.append("\n    if (!(this instanceof CLS)) {");
    1.20 +        out.append("\n      return new CLS();");
    1.21 +        out.append("\n    }");
    1.22          for (FieldData v : jc.getFields()) {
    1.23              if (!v.isStatic()) {
    1.24                  out.append("\n    this.fld_").
    1.25 @@ -126,7 +127,7 @@
    1.26          }
    1.27          out.append("\n    return this;");
    1.28          out.append("\n  }");
    1.29 -        out.append("\n  return new CLS;");
    1.30 +        out.append("\n  return arguments[0] ? new CLS() : CLS.prototype;");
    1.31          out.append("\n}");
    1.32          StringBuilder sb = new StringBuilder();
    1.33          for (String init : toInitilize.toArray()) {
    1.34 @@ -142,7 +143,7 @@
    1.35          final String mn = findMethodName(m, argsCnt);
    1.36          out.append(prefix).append(mn).append(" = function");
    1.37          if (mn.equals("classV")) {
    1.38 -            toInitilize.add(className(jc) + "(true)." + mn);
    1.39 +            toInitilize.add(className(jc) + "(false)." + mn);
    1.40          }
    1.41          out.append('(');
    1.42          String space = "";
    1.43 @@ -585,9 +586,9 @@
    1.44                  case opc_new: {
    1.45                      int indx = readIntArg(byteCodes, i);
    1.46                      String ci = jc.getClassName(indx);
    1.47 -                    out.append("s.push(");
    1.48 -                    out.append("new ").append(ci.replace('/','_'));
    1.49 -                    out.append(");");
    1.50 +                    out.append("s.push(new ");
    1.51 +                    out.append(ci.replace('/','_'));
    1.52 +                    out.append("());");
    1.53                      addReference(ci);
    1.54                      i += 2;
    1.55                      break;
    1.56 @@ -888,7 +889,7 @@
    1.57          }
    1.58          final String in = mi[0];
    1.59          out.append(in.replace('/', '_'));
    1.60 -        out.append("(true).");
    1.61 +        out.append("(false).");
    1.62          out.append(mn);
    1.63          out.append('(');
    1.64          String sep = "";
     2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java	Sat Dec 01 08:52:30 2012 +0100
     2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java	Sat Dec 01 12:14:37 2012 +0100
     2.3 @@ -17,6 +17,8 @@
     2.4   */
     2.5  package org.apidesign.vm4brwsr;
     2.6  
     2.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
     2.8 +
     2.9  /**
    2.10   *
    2.11   * @author Jaroslav Tulach <jtulach@netbeans.org>
    2.12 @@ -89,4 +91,30 @@
    2.13      private static boolean isNull() {
    2.14          return createInstance(true) == null;
    2.15      }
    2.16 +    
    2.17 +    @JavaScriptBody(args = "obj", body = "return obj.constructor;")
    2.18 +    static Object constructor(Object obj) {
    2.19 +        return obj;
    2.20 +    }
    2.21 +    
    2.22 +    public static boolean sharedConstructor() {
    2.23 +        class X {
    2.24 +        }
    2.25 +        
    2.26 +        X x1 = new X();
    2.27 +        X x2 = new X();
    2.28 +        
    2.29 +        return constructor(x1) == constructor(x2);
    2.30 +    }
    2.31 +    public static boolean differentConstructor() {
    2.32 +        class X {
    2.33 +        }
    2.34 +        class Y {
    2.35 +        }
    2.36 +        
    2.37 +        X x = new X();
    2.38 +        Y y = new Y();
    2.39 +        
    2.40 +        return constructor(x) == constructor(y);
    2.41 +    }
    2.42  }
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java	Sat Dec 01 08:52:30 2012 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java	Sat Dec 01 12:14:37 2012 +0100
     3.3 @@ -18,9 +18,7 @@
     3.4  package org.apidesign.vm4brwsr;
     3.5  
     3.6  import javax.script.Invocable;
     3.7 -import javax.script.ScriptException;
     3.8  import org.testng.annotations.Test;
     3.9 -import static org.testng.Assert.*;
    3.10  import org.testng.annotations.BeforeClass;
    3.11  
    3.12  /**
    3.13 @@ -110,6 +108,22 @@
    3.14          );
    3.15      }
    3.16      
    3.17 +    @Test public void sharedConstructor() throws Exception {
    3.18 +        assertExec(
    3.19 +            "Constructor of first and 2nd instance should be the same",
    3.20 +            Instance.class, "sharedConstructorZ",
    3.21 +            Double.valueOf(1.0)
    3.22 +        );
    3.23 +    }
    3.24 +
    3.25 +    @Test public void differentConstructor() throws Exception {
    3.26 +        assertExec(
    3.27 +            "Constructor of X and Y should be the different",
    3.28 +            Instance.class, "differentConstructorZ",
    3.29 +            Double.valueOf(0)
    3.30 +        );
    3.31 +    }
    3.32 +    
    3.33      protected String startCompilationWith() {
    3.34          return "org/apidesign/vm4brwsr/Instance";
    3.35      }