1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Feb 18 10:02:46 2014 +0100
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Feb 18 22:20:50 2014 +0100
1.3 @@ -831,7 +831,7 @@
1.4 int indx = readUByte(byteCodes, ++i);
1.5 String v = encodeConstant(indx);
1.6 int type = VarType.fromConstantType(jc.getTag(indx));
1.7 - emit(smapper, out, "var @1 = @2;", smapper.pushT(type), v);
1.8 + smapper.assign(out, type, v);
1.9 break;
1.10 }
1.11 case opc_ldc_w:
1.12 @@ -858,18 +858,15 @@
1.13 break;
1.14 }
1.15 case opc_lcmp:
1.16 - emit(smapper, out, "var @3 = (@2).compare64(@1);",
1.17 - smapper.popL(), smapper.popL(), smapper.pushI());
1.18 + smapper.replace(out, VarType.INTEGER, "(@2).compare64(@1)", smapper.popL(), smapper.getL(0));
1.19 break;
1.20 case opc_fcmpl:
1.21 case opc_fcmpg:
1.22 - emit(smapper, out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.23 - smapper.popF(), smapper.popF(), smapper.pushI());
1.24 + smapper.replace(out, VarType.INTEGER, "(@2).compare(@1)", smapper.popF(), smapper.getF(0));
1.25 break;
1.26 case opc_dcmpl:
1.27 case opc_dcmpg:
1.28 - emit(smapper, out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.29 - smapper.popD(), smapper.popD(), smapper.pushI());
1.30 + smapper.replace(out, VarType.INTEGER, "(@2).compare(@1)", smapper.popD(), smapper.getD(0));
1.31 break;
1.32 case opc_if_acmpeq:
1.33 i = generateIf(smapper, byteCodes, i, smapper.popA(), smapper.popA(),
1.34 @@ -885,56 +882,56 @@
1.35 break;
1.36 case opc_ifeq: {
1.37 int indx = i + readShortArg(byteCodes, i);
1.38 - emitIf(smapper, out, "if (@1 == 0) ",
1.39 + emitIf(smapper, out, "if ((@1) == 0) ",
1.40 smapper.popI(), i, indx, topMostLabel);
1.41 i += 2;
1.42 break;
1.43 }
1.44 case opc_ifne: {
1.45 int indx = i + readShortArg(byteCodes, i);
1.46 - emitIf(smapper, out, "if (@1 != 0) ",
1.47 + emitIf(smapper, out, "if ((@1) != 0) ",
1.48 smapper.popI(), i, indx, topMostLabel);
1.49 i += 2;
1.50 break;
1.51 }
1.52 case opc_iflt: {
1.53 int indx = i + readShortArg(byteCodes, i);
1.54 - emitIf(smapper, out, "if (@1 < 0) ",
1.55 + emitIf(smapper, out, "if ((@1) < 0) ",
1.56 smapper.popI(), i, indx, topMostLabel);
1.57 i += 2;
1.58 break;
1.59 }
1.60 case opc_ifle: {
1.61 int indx = i + readShortArg(byteCodes, i);
1.62 - emitIf(smapper, out, "if (@1 <= 0) ",
1.63 + emitIf(smapper, out, "if ((@1) <= 0) ",
1.64 smapper.popI(), i, indx, topMostLabel);
1.65 i += 2;
1.66 break;
1.67 }
1.68 case opc_ifgt: {
1.69 int indx = i + readShortArg(byteCodes, i);
1.70 - emitIf(smapper, out, "if (@1 > 0) ",
1.71 + emitIf(smapper, out, "if ((@1) > 0) ",
1.72 smapper.popI(), i, indx, topMostLabel);
1.73 i += 2;
1.74 break;
1.75 }
1.76 case opc_ifge: {
1.77 int indx = i + readShortArg(byteCodes, i);
1.78 - emitIf(smapper, out, "if (@1 >= 0) ",
1.79 + emitIf(smapper, out, "if ((@1) >= 0) ",
1.80 smapper.popI(), i, indx, topMostLabel);
1.81 i += 2;
1.82 break;
1.83 }
1.84 case opc_ifnonnull: {
1.85 int indx = i + readShortArg(byteCodes, i);
1.86 - emitIf(smapper, out, "if (@1 !== null) ",
1.87 + emitIf(smapper, out, "if ((@1) !== null) ",
1.88 smapper.popA(), i, indx, topMostLabel);
1.89 i += 2;
1.90 break;
1.91 }
1.92 case opc_ifnull: {
1.93 int indx = i + readShortArg(byteCodes, i);
1.94 - emitIf(smapper, out, "if (@1 === null) ",
1.95 + emitIf(smapper, out, "if ((@1) === null) ",
1.96 smapper.popA(), i, indx, topMostLabel);
1.97 i += 2;
1.98 break;
1.99 @@ -1013,8 +1010,7 @@
1.100 break;
1.101 }
1.102 case opc_arraylength:
1.103 - emit(smapper, out, "var @2 = @1.length;",
1.104 - smapper.popA(), smapper.pushI());
1.105 + smapper.replace(out, VarType.INTEGER, "(@1).length", smapper.getA(0));
1.106 break;
1.107 case opc_lastore:
1.108 emit(smapper, out, "Array.at(@3, @2, @1);",
1.109 @@ -1040,27 +1036,27 @@
1.110 smapper.popI(), smapper.popI(), smapper.popA());
1.111 break;
1.112 case opc_laload:
1.113 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.114 - smapper.popI(), smapper.popA(), smapper.pushL());
1.115 + smapper.replace(out, VarType.LONG, "Array.at(@2, @1)",
1.116 + smapper.popI(), smapper.getA(0));
1.117 break;
1.118 case opc_faload:
1.119 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.120 - smapper.popI(), smapper.popA(), smapper.pushF());
1.121 + smapper.replace(out, VarType.FLOAT, "Array.at(@2, @1)",
1.122 + smapper.popI(), smapper.getA(0));
1.123 break;
1.124 case opc_daload:
1.125 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.126 - smapper.popI(), smapper.popA(), smapper.pushD());
1.127 + smapper.replace(out, VarType.DOUBLE, "Array.at(@2, @1)",
1.128 + smapper.popI(), smapper.getA(0));
1.129 break;
1.130 case opc_aaload:
1.131 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.132 - smapper.popI(), smapper.popA(), smapper.pushA());
1.133 + smapper.replace(out, VarType.REFERENCE, "Array.at(@2, @1)",
1.134 + smapper.popI(), smapper.getA(0));
1.135 break;
1.136 case opc_iaload:
1.137 case opc_baload:
1.138 case opc_caload:
1.139 case opc_saload:
1.140 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.141 - smapper.popI(), smapper.popA(), smapper.pushI());
1.142 + smapper.replace(out, VarType.INTEGER, "Array.at(@2, @1)",
1.143 + smapper.popI(), smapper.getA(0));
1.144 break;
1.145 case opc_pop:
1.146 case opc_pop2:
1.147 @@ -1232,9 +1228,9 @@
1.148 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.149 final String mangleClass = mangleClassName(fi[0]);
1.150 final String mangleClassAccess = accessClass(mangleClass);
1.151 - emit(smapper, out, "var @2 = @4(false)._@3.call(@1);",
1.152 - smapper.popA(),
1.153 - smapper.pushT(type), fi[1], mangleClassAccess
1.154 + smapper.replace(out, type, "@3(false)._@2.call(@1)",
1.155 + smapper.getA(0),
1.156 + fi[1], mangleClassAccess
1.157 );
1.158 i += 2;
1.159 break;
1.160 @@ -1257,9 +1253,8 @@
1.161 int indx = readUShortArg(byteCodes, i);
1.162 String[] fi = jc.getFieldInfoName(indx);
1.163 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.164 - emit(smapper, out, "var @1 = @2(false)._@3();",
1.165 - smapper.pushT(type),
1.166 - accessClass(mangleClassName(fi[0])), fi[1]);
1.167 + String ac = accessClass(mangleClassName(fi[0]));
1.168 + smapper.assign(out, type, ac + "(false)._" + fi[1] + "()");
1.169 i += 2;
1.170 addReference(fi[0]);
1.171 break;
1.172 @@ -1297,13 +1292,13 @@
1.173 }
1.174
1.175 case opc_monitorenter: {
1.176 - out.append("/* monitor enter */");
1.177 + debug("/* monitor enter */");
1.178 smapper.popA();
1.179 break;
1.180 }
1.181
1.182 case opc_monitorexit: {
1.183 - out.append("/* monitor exit */");
1.184 + debug("/* monitor exit */");
1.185 smapper.popA();
1.186 break;
1.187 }
1.188 @@ -1341,9 +1336,9 @@
1.189 ) throws IOException {
1.190 mapper.flush(out);
1.191 int indx = i + readShortArg(byteCodes, i);
1.192 - out.append("if (").append(v1)
1.193 - .append(' ').append(test).append(' ')
1.194 - .append(v2).append(") ");
1.195 + out.append("if ((").append(v1)
1.196 + .append(") ").append(test).append(" (")
1.197 + .append(v2).append(")) ");
1.198 goTo(out, i, indx, topMostLabel);
1.199 return i + 2;
1.200 }
1.201 @@ -2101,7 +2096,9 @@
1.202 table += 4;
1.203 int high = readInt4(byteCodes, table);
1.204 table += 4;
1.205 - out.append("switch (").append(smapper.popI()).append(") {\n");
1.206 + final CharSequence swVar = smapper.popValue();
1.207 + smapper.flush(out);
1.208 + out.append("switch (").append(swVar).append(") {\n");
1.209 while (low <= high) {
1.210 int offset = i + readInt4(byteCodes, table);
1.211 table += 4;
1.212 @@ -2121,7 +2118,9 @@
1.213 table += 4;
1.214 int n = readInt4(byteCodes, table);
1.215 table += 4;
1.216 - out.append("switch (").append(smapper.popI()).append(") {\n");
1.217 + final CharSequence swVar = smapper.popValue();
1.218 + smapper.flush(out);
1.219 + out.append("switch (").append(swVar).append(") {\n");
1.220 while (n-- > 0) {
1.221 int cnstnt = readInt4(byteCodes, table);
1.222 table += 4;