Make sure the constructor property points to the real function that creates the object
1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Nov 29 22:03:11 2012 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 10:35:24 2012 +0100
1.3 @@ -107,15 +107,16 @@
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 if (arguments.length === 0) {");
1.13 - out.append("\n return new CLS();");
1.14 - out.append("\n }");
1.15 out.append("\n }");
1.16 out.append("\n if (arguments.length === 0) {");
1.17 + out.append("\n if (!(this instanceof CLS)) {");
1.18 + out.append("\n return new CLS();");
1.19 + out.append("\n }");
1.20 for (FieldData v : jc.getFields()) {
1.21 if (!v.isStatic()) {
1.22 out.append("\n this.fld_").
1.23 @@ -583,9 +584,9 @@
1.24 case opc_new: {
1.25 int indx = readIntArg(byteCodes, i);
1.26 String ci = jc.getClassName(indx);
1.27 - out.append("s.push(");
1.28 - out.append("new ").append(ci.replace('/','_'));
1.29 - out.append(");");
1.30 + out.append("s.push(new ");
1.31 + out.append(ci.replace('/','_'));
1.32 + out.append("());");
1.33 addReference(ci);
1.34 i += 2;
1.35 break;
2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Thu Nov 29 22:03:11 2012 +0100
2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sat Dec 01 10:35:24 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 Thu Nov 29 22:03:11 2012 +0100
3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sat Dec 01 10:35:24 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 }