# HG changeset patch # User Jaroslav Tulach # Date 1392643615 -3600 # Node ID 5d6b648a39dbcfdf6489ef653e4c1a0bcf1e5be5 # Parent 5538c1eb03be6116a90504db421dfccec481b5e3 Another if statements to flush stack before generating them diff -r 5538c1eb03be -r 5d6b648a39db rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Feb 17 12:08:31 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Feb 17 14:26:55 2014 +0100 @@ -859,15 +859,15 @@ smapper.popD(), smapper.popD(), smapper.pushI()); break; case opc_if_acmpeq: - i = generateIf(byteCodes, i, smapper.popA(), smapper.popA(), + i = generateIf(smapper, byteCodes, i, smapper.popA(), smapper.popA(), "===", topMostLabel); break; case opc_if_acmpne: - i = generateIf(byteCodes, i, smapper.popA(), smapper.popA(), + i = generateIf(smapper, byteCodes, i, smapper.popA(), smapper.popA(), "!==", topMostLabel); break; case opc_if_icmpeq: - i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(), + i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(), "==", topMostLabel); break; case opc_ifeq: { @@ -927,23 +927,23 @@ break; } case opc_if_icmpne: - i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(), + i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(), "!=", topMostLabel); break; case opc_if_icmplt: - i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(), + i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(), "<", topMostLabel); break; case opc_if_icmple: - i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(), + i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(), "<=", topMostLabel); break; case opc_if_icmpgt: - i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(), + i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(), ">", topMostLabel); break; case opc_if_icmpge: - i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(), + i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(), ">=", topMostLabel); break; case opc_goto: { @@ -1320,7 +1320,11 @@ out.append("\n};"); } - private int generateIf(byte[] byteCodes, int i, final CharSequence v2, final CharSequence v1, final String test, int topMostLabel) throws IOException { + private int generateIf(StackMapper mapper, byte[] byteCodes, + int i, final CharSequence v2, final CharSequence v1, + final String test, int topMostLabel + ) throws IOException { + mapper.flush(out); int indx = i + readShortArg(byteCodes, i); out.append("if (").append(v1) .append(' ').append(test).append(' ') diff -r 5538c1eb03be -r 5d6b648a39db rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Mon Feb 17 12:08:31 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Mon Feb 17 14:26:55 2014 +0100 @@ -137,6 +137,53 @@ return i.sum(nowrap?-w:w, 1); } + public static String toStringArr() { + class N implements Next { + int idx = 0; + + @Override + public boolean hasNext() { + return idx < 5; + } + + @Override + public String next() { + switch (idx++) { + case 0: return "Zero"; + case 1: return "One"; + case 2: return "Two"; + case 3: return "Three"; + case 4: return "Four"; + } + throw new IllegalStateException(); + } + } + return toString(null, new N()).toString(); + } + + static String toString(Object thiz, Next it) { + if (!it.hasNext()) { + return "[]"; + } + + StringBuilder sb = new StringBuilder(); + sb.append('['); + for (;;) { + String e = it.next(); + sb.append(e == thiz ? "(this Collection)" : e); + if (!it.hasNext()) { + return sb.append(']').toString(); + } + sb.append(',').append(' '); + } + } + + static interface Next { + boolean hasNext(); + String next(); + } + + static { // check order of initializers StaticUse.NON_NULL.equals(new Object()); diff -r 5538c1eb03be -r 5d6b648a39db rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Mon Feb 17 12:08:31 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Mon Feb 17 14:26:55 2014 +0100 @@ -224,6 +224,15 @@ ); } + @Test public void collectionToString() throws Exception { + String exp = StaticMethod.toStringArr(); + assertExec( + "0 to 4", + StaticMethod.class, "toStringArr__Ljava_lang_String_2", + exp + ); + } + @Test public void or() throws Exception { assertExec( "Or will be 7",