# HG changeset patch # User Jaroslav Tulach # Date 1354360477 -3600 # Node ID fae5261c8a9acc619664894f7d8fce8bab5bfe87 # Parent 25e350c6385f65cd35d0afc45d39af84b9b46069# Parent 907a52ed10e3bc23b110717c88ef7125b7e5d195 Merge with default to get correct behavior of the contructor property of prototype diff -r 25e350c6385f -r fae5261c8a9a vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 08:52:30 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 12:14:37 2012 +0100 @@ -107,17 +107,18 @@ 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 CLS.$class = java_lang_Class(true);"); out.append("\n CLS.$class.jvmName = '").append(jc.getClassName()).append("';"); - 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_"). @@ -126,7 +127,7 @@ } out.append("\n return this;"); out.append("\n }"); - out.append("\n return new CLS;"); + out.append("\n return arguments[0] ? new CLS() : CLS.prototype;"); out.append("\n}"); StringBuilder sb = new StringBuilder(); for (String init : toInitilize.toArray()) { @@ -142,7 +143,7 @@ final String mn = findMethodName(m, argsCnt); out.append(prefix).append(mn).append(" = function"); if (mn.equals("classV")) { - toInitilize.add(className(jc) + "(true)." + mn); + toInitilize.add(className(jc) + "(false)." + mn); } out.append('('); String space = ""; @@ -585,9 +586,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; @@ -888,7 +889,7 @@ } final String in = mi[0]; out.append(in.replace('/', '_')); - out.append("(true)."); + out.append("(false)."); out.append(mn); out.append('('); String sep = ""; diff -r 25e350c6385f -r fae5261c8a9a vm/src/test/java/org/apidesign/vm4brwsr/Instance.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sat Dec 01 08:52:30 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sat Dec 01 12:14:37 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 25e350c6385f -r fae5261c8a9a vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sat Dec 01 08:52:30 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sat Dec 01 12:14:37 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"; }