# HG changeset patch # User Jaroslav Tulach # Date 1354354524 -3600 # Node ID 907a52ed10e3bc23b110717c88ef7125b7e5d195 # Parent 7aa36c48c634f02e186b0a259a6c6635015820bc Make sure the constructor property points to the real function that creates the object diff -r 7aa36c48c634 -r 907a52ed10e3 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Nov 29 22:03:11 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 10:35:24 2012 +0100 @@ -107,15 +107,16 @@ generateInstanceMethod("\n p.", m); } } + out.append("\n p.constructor = CLS;"); out.append("\n p.$instOf_").append(className).append(" = true;"); for (String superInterface : jc.getSuperInterfaces()) { out.append("\n p.$instOf_").append(superInterface.replace('/', '_')).append(" = true;"); } - out.append("\n if (arguments.length === 0) {"); - out.append("\n return new CLS();"); - out.append("\n }"); out.append("\n }"); out.append("\n if (arguments.length === 0) {"); + out.append("\n if (!(this instanceof CLS)) {"); + out.append("\n return new CLS();"); + out.append("\n }"); for (FieldData v : jc.getFields()) { if (!v.isStatic()) { out.append("\n this.fld_"). @@ -583,9 +584,9 @@ case opc_new: { int indx = readIntArg(byteCodes, i); String ci = jc.getClassName(indx); - out.append("s.push("); - out.append("new ").append(ci.replace('/','_')); - out.append(");"); + out.append("s.push(new "); + out.append(ci.replace('/','_')); + out.append("());"); addReference(ci); i += 2; break; diff -r 7aa36c48c634 -r 907a52ed10e3 vm/src/test/java/org/apidesign/vm4brwsr/Instance.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Thu Nov 29 22:03:11 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sat Dec 01 10:35:24 2012 +0100 @@ -17,6 +17,8 @@ */ package org.apidesign.vm4brwsr; +import org.apidesign.bck2brwsr.core.JavaScriptBody; + /** * * @author Jaroslav Tulach @@ -89,4 +91,30 @@ private static boolean isNull() { return createInstance(true) == null; } + + @JavaScriptBody(args = "obj", body = "return obj.constructor;") + static Object constructor(Object obj) { + return obj; + } + + public static boolean sharedConstructor() { + class X { + } + + X x1 = new X(); + X x2 = new X(); + + return constructor(x1) == constructor(x2); + } + public static boolean differentConstructor() { + class X { + } + class Y { + } + + X x = new X(); + Y y = new Y(); + + return constructor(x) == constructor(y); + } } diff -r 7aa36c48c634 -r 907a52ed10e3 vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Thu Nov 29 22:03:11 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sat Dec 01 10:35:24 2012 +0100 @@ -18,9 +18,7 @@ package org.apidesign.vm4brwsr; import javax.script.Invocable; -import javax.script.ScriptException; import org.testng.annotations.Test; -import static org.testng.Assert.*; import org.testng.annotations.BeforeClass; /** @@ -110,6 +108,22 @@ ); } + @Test public void sharedConstructor() throws Exception { + assertExec( + "Constructor of first and 2nd instance should be the same", + Instance.class, "sharedConstructorZ", + Double.valueOf(1.0) + ); + } + + @Test public void differentConstructor() throws Exception { + assertExec( + "Constructor of X and Y should be the different", + Instance.class, "differentConstructorZ", + Double.valueOf(0) + ); + } + protected String startCompilationWith() { return "org/apidesign/vm4brwsr/Instance"; }