Enclose constants as objects. Get the function arguments without creates stack objects. Flush stack on frame closing.
1.1 --- a/rt/emul/mini/src/main/java/java/lang/Object.java Sat Feb 15 20:18:26 2014 +0100
1.2 +++ b/rt/emul/mini/src/main/java/java/lang/Object.java Sat Feb 15 23:13:53 2014 +0100
1.3 @@ -43,7 +43,7 @@
1.4
1.5 private static void registerNatives() {
1.6 boolean assertsOn = false;
1.7 - assert assertsOn = false;
1.8 + // assert assertsOn = true;
1.9 if (assertsOn) try {
1.10 Array.get(null, 0);
1.11 } catch (Throwable ex) {
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Feb 15 20:18:26 2014 +0100
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Feb 15 23:13:53 2014 +0100
2.3 @@ -340,6 +340,7 @@
2.4 }
2.5 }
2.6 if (lastStackFrame != stackMapIterator.getFrameIndex()) {
2.7 + smapper.flush(out);
2.8 if (i != 0) {
2.9 out.append(" }\n");
2.10 }
2.11 @@ -772,46 +773,46 @@
2.12 smapper.assign(out, VarType.REFERENCE, "null");
2.13 break;
2.14 case opc_iconst_m1:
2.15 - smapper.assign(out, VarType.INTEGER, "-1");
2.16 + smapper.assign(out, VarType.INTEGER, "(-1)");
2.17 break;
2.18 case opc_iconst_0:
2.19 - smapper.assign(out, VarType.INTEGER, "0");
2.20 + smapper.assign(out, VarType.INTEGER, "(0)");
2.21 break;
2.22 case opc_dconst_0:
2.23 - smapper.assign(out, VarType.DOUBLE, "0");
2.24 + smapper.assign(out, VarType.DOUBLE, "(0)");
2.25 break;
2.26 case opc_lconst_0:
2.27 - smapper.assign(out, VarType.LONG, "0");
2.28 + smapper.assign(out, VarType.LONG, "(0)");
2.29 break;
2.30 case opc_fconst_0:
2.31 - smapper.assign(out, VarType.FLOAT, "0");
2.32 + smapper.assign(out, VarType.FLOAT, "(0)");
2.33 break;
2.34 case opc_iconst_1:
2.35 - smapper.assign(out, VarType.INTEGER, "1");
2.36 + smapper.assign(out, VarType.INTEGER, "(1)");
2.37 break;
2.38 case opc_lconst_1:
2.39 - smapper.assign(out, VarType.LONG, "1");
2.40 + smapper.assign(out, VarType.LONG, "(1)");
2.41 break;
2.42 case opc_fconst_1:
2.43 - smapper.assign(out, VarType.FLOAT, "1");
2.44 + smapper.assign(out, VarType.FLOAT, "(1)");
2.45 break;
2.46 case opc_dconst_1:
2.47 - smapper.assign(out, VarType.DOUBLE, "1");
2.48 + smapper.assign(out, VarType.DOUBLE, "(1)");
2.49 break;
2.50 case opc_iconst_2:
2.51 - smapper.assign(out, VarType.INTEGER, "2");
2.52 + smapper.assign(out, VarType.INTEGER, "(2)");
2.53 break;
2.54 case opc_fconst_2:
2.55 - smapper.assign(out, VarType.FLOAT, "2");
2.56 + smapper.assign(out, VarType.FLOAT, "(2)");
2.57 break;
2.58 case opc_iconst_3:
2.59 - smapper.assign(out, VarType.INTEGER, "3");
2.60 + smapper.assign(out, VarType.INTEGER, "(3)");
2.61 break;
2.62 case opc_iconst_4:
2.63 - smapper.assign(out, VarType.INTEGER, "4");
2.64 + smapper.assign(out, VarType.INTEGER, "(4)");
2.65 break;
2.66 case opc_iconst_5:
2.67 - smapper.assign(out, VarType.INTEGER, "5");
2.68 + smapper.assign(out, VarType.INTEGER, "(5)");
2.69 break;
2.70 case opc_ldc: {
2.71 int indx = readUByte(byteCodes, ++i);
2.72 @@ -1542,10 +1543,10 @@
2.73 String mn = findMethodName(mi, cnt, returnType);
2.74
2.75 final int numArguments = cnt.length() + 1;
2.76 - final Variable[] vars = new Variable[numArguments];
2.77 + final CharSequence[] vars = new CharSequence[numArguments];
2.78
2.79 for (int j = numArguments - 1; j >= 0; --j) {
2.80 - vars[j] = mapper.pop(out);
2.81 + vars[j] = mapper.popValue();
2.82 }
2.83
2.84 if (returnType[0] != 'V') {