1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Feb 15 15:47:28 2014 +0100
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Feb 15 17:23:24 2014 +0100
1.3 @@ -471,7 +471,7 @@
1.4 final int indx = wide ? readUShort(byteCodes, i++)
1.5 : readUByte(byteCodes, i);
1.6 wide = false;
1.7 - emit(out, "var @1 = @2;",
1.8 + emit(smapper, out, "var @1 = @2;",
1.9 lmapper.setI(indx), smapper.popI());
1.10 break;
1.11 }
1.12 @@ -480,7 +480,7 @@
1.13 final int indx = wide ? readUShort(byteCodes, i++)
1.14 : readUByte(byteCodes, i);
1.15 wide = false;
1.16 - emit(out, "var @1 = @2;",
1.17 + emit(smapper, out, "var @1 = @2;",
1.18 lmapper.setL(indx), smapper.popL());
1.19 break;
1.20 }
1.21 @@ -489,7 +489,7 @@
1.22 final int indx = wide ? readUShort(byteCodes, i++)
1.23 : readUByte(byteCodes, i);
1.24 wide = false;
1.25 - emit(out, "var @1 = @2;",
1.26 + emit(smapper, out, "var @1 = @2;",
1.27 lmapper.setF(indx), smapper.popF());
1.28 break;
1.29 }
1.30 @@ -498,7 +498,7 @@
1.31 final int indx = wide ? readUShort(byteCodes, i++)
1.32 : readUByte(byteCodes, i);
1.33 wide = false;
1.34 - emit(out, "var @1 = @2;",
1.35 + emit(smapper, out, "var @1 = @2;",
1.36 lmapper.setD(indx), smapper.popD());
1.37 break;
1.38 }
1.39 @@ -507,181 +507,181 @@
1.40 final int indx = wide ? readUShort(byteCodes, i++)
1.41 : readUByte(byteCodes, i);
1.42 wide = false;
1.43 - emit(out, "var @1 = @2;",
1.44 + emit(smapper, out, "var @1 = @2;",
1.45 lmapper.setA(indx), smapper.popA());
1.46 break;
1.47 }
1.48 case opc_astore_0:
1.49 - emit(out, "var @1 = @2;", lmapper.setA(0), smapper.popA());
1.50 + emit(smapper, out, "var @1 = @2;", lmapper.setA(0), smapper.popA());
1.51 break;
1.52 case opc_istore_0:
1.53 - emit(out, "var @1 = @2;", lmapper.setI(0), smapper.popI());
1.54 + emit(smapper, out, "var @1 = @2;", lmapper.setI(0), smapper.popI());
1.55 break;
1.56 case opc_lstore_0:
1.57 - emit(out, "var @1 = @2;", lmapper.setL(0), smapper.popL());
1.58 + emit(smapper, out, "var @1 = @2;", lmapper.setL(0), smapper.popL());
1.59 break;
1.60 case opc_fstore_0:
1.61 - emit(out, "var @1 = @2;", lmapper.setF(0), smapper.popF());
1.62 + emit(smapper, out, "var @1 = @2;", lmapper.setF(0), smapper.popF());
1.63 break;
1.64 case opc_dstore_0:
1.65 - emit(out, "var @1 = @2;", lmapper.setD(0), smapper.popD());
1.66 + emit(smapper, out, "var @1 = @2;", lmapper.setD(0), smapper.popD());
1.67 break;
1.68 case opc_astore_1:
1.69 - emit(out, "var @1 = @2;", lmapper.setA(1), smapper.popA());
1.70 + emit(smapper, out, "var @1 = @2;", lmapper.setA(1), smapper.popA());
1.71 break;
1.72 case opc_istore_1:
1.73 - emit(out, "var @1 = @2;", lmapper.setI(1), smapper.popI());
1.74 + emit(smapper, out, "var @1 = @2;", lmapper.setI(1), smapper.popI());
1.75 break;
1.76 case opc_lstore_1:
1.77 - emit(out, "var @1 = @2;", lmapper.setL(1), smapper.popL());
1.78 + emit(smapper, out, "var @1 = @2;", lmapper.setL(1), smapper.popL());
1.79 break;
1.80 case opc_fstore_1:
1.81 - emit(out, "var @1 = @2;", lmapper.setF(1), smapper.popF());
1.82 + emit(smapper, out, "var @1 = @2;", lmapper.setF(1), smapper.popF());
1.83 break;
1.84 case opc_dstore_1:
1.85 - emit(out, "var @1 = @2;", lmapper.setD(1), smapper.popD());
1.86 + emit(smapper, out, "var @1 = @2;", lmapper.setD(1), smapper.popD());
1.87 break;
1.88 case opc_astore_2:
1.89 - emit(out, "var @1 = @2;", lmapper.setA(2), smapper.popA());
1.90 + emit(smapper, out, "var @1 = @2;", lmapper.setA(2), smapper.popA());
1.91 break;
1.92 case opc_istore_2:
1.93 - emit(out, "var @1 = @2;", lmapper.setI(2), smapper.popI());
1.94 + emit(smapper, out, "var @1 = @2;", lmapper.setI(2), smapper.popI());
1.95 break;
1.96 case opc_lstore_2:
1.97 - emit(out, "var @1 = @2;", lmapper.setL(2), smapper.popL());
1.98 + emit(smapper, out, "var @1 = @2;", lmapper.setL(2), smapper.popL());
1.99 break;
1.100 case opc_fstore_2:
1.101 - emit(out, "var @1 = @2;", lmapper.setF(2), smapper.popF());
1.102 + emit(smapper, out, "var @1 = @2;", lmapper.setF(2), smapper.popF());
1.103 break;
1.104 case opc_dstore_2:
1.105 - emit(out, "var @1 = @2;", lmapper.setD(2), smapper.popD());
1.106 + emit(smapper, out, "var @1 = @2;", lmapper.setD(2), smapper.popD());
1.107 break;
1.108 case opc_astore_3:
1.109 - emit(out, "var @1 = @2;", lmapper.setA(3), smapper.popA());
1.110 + emit(smapper, out, "var @1 = @2;", lmapper.setA(3), smapper.popA());
1.111 break;
1.112 case opc_istore_3:
1.113 - emit(out, "var @1 = @2;", lmapper.setI(3), smapper.popI());
1.114 + emit(smapper, out, "var @1 = @2;", lmapper.setI(3), smapper.popI());
1.115 break;
1.116 case opc_lstore_3:
1.117 - emit(out, "var @1 = @2;", lmapper.setL(3), smapper.popL());
1.118 + emit(smapper, out, "var @1 = @2;", lmapper.setL(3), smapper.popL());
1.119 break;
1.120 case opc_fstore_3:
1.121 - emit(out, "var @1 = @2;", lmapper.setF(3), smapper.popF());
1.122 + emit(smapper, out, "var @1 = @2;", lmapper.setF(3), smapper.popF());
1.123 break;
1.124 case opc_dstore_3:
1.125 - emit(out, "var @1 = @2;", lmapper.setD(3), smapper.popD());
1.126 + emit(smapper, out, "var @1 = @2;", lmapper.setD(3), smapper.popD());
1.127 break;
1.128 case opc_iadd:
1.129 - emit(out, "@1 = @1.add32(@2);", smapper.getI(1), smapper.popI());
1.130 + emit(smapper, out, "@1 = @1.add32(@2);", smapper.getI(1), smapper.popI());
1.131 break;
1.132 case opc_ladd:
1.133 - emit(out, "@1 = @1.add64(@2);", smapper.getL(1), smapper.popL());
1.134 + emit(smapper, out, "@1 = @1.add64(@2);", smapper.getL(1), smapper.popL());
1.135 break;
1.136 case opc_fadd:
1.137 - emit(out, "@1 += @2;", smapper.getF(1), smapper.popF());
1.138 + emit(smapper, out, "@1 += @2;", smapper.getF(1), smapper.popF());
1.139 break;
1.140 case opc_dadd:
1.141 - emit(out, "@1 += @2;", smapper.getD(1), smapper.popD());
1.142 + emit(smapper, out, "@1 += @2;", smapper.getD(1), smapper.popD());
1.143 break;
1.144 case opc_isub:
1.145 - emit(out, "@1 = @1.sub32(@2);", smapper.getI(1), smapper.popI());
1.146 + emit(smapper, out, "@1 = @1.sub32(@2);", smapper.getI(1), smapper.popI());
1.147 break;
1.148 case opc_lsub:
1.149 - emit(out, "@1 = @1.sub64(@2);", smapper.getL(1), smapper.popL());
1.150 + emit(smapper, out, "@1 = @1.sub64(@2);", smapper.getL(1), smapper.popL());
1.151 break;
1.152 case opc_fsub:
1.153 - emit(out, "@1 -= @2;", smapper.getF(1), smapper.popF());
1.154 + emit(smapper, out, "@1 -= @2;", smapper.getF(1), smapper.popF());
1.155 break;
1.156 case opc_dsub:
1.157 - emit(out, "@1 -= @2;", smapper.getD(1), smapper.popD());
1.158 + emit(smapper, out, "@1 -= @2;", smapper.getD(1), smapper.popD());
1.159 break;
1.160 case opc_imul:
1.161 - emit(out, "@1 = @1.mul32(@2);", smapper.getI(1), smapper.popI());
1.162 + emit(smapper, out, "@1 = @1.mul32(@2);", smapper.getI(1), smapper.popI());
1.163 break;
1.164 case opc_lmul:
1.165 - emit(out, "@1 = @1.mul64(@2);", smapper.getL(1), smapper.popL());
1.166 + emit(smapper, out, "@1 = @1.mul64(@2);", smapper.getL(1), smapper.popL());
1.167 break;
1.168 case opc_fmul:
1.169 - emit(out, "@1 *= @2;", smapper.getF(1), smapper.popF());
1.170 + emit(smapper, out, "@1 *= @2;", smapper.getF(1), smapper.popF());
1.171 break;
1.172 case opc_dmul:
1.173 - emit(out, "@1 *= @2;", smapper.getD(1), smapper.popD());
1.174 + emit(smapper, out, "@1 *= @2;", smapper.getD(1), smapper.popD());
1.175 break;
1.176 case opc_idiv:
1.177 - emit(out, "@1 = @1.div32(@2);",
1.178 + emit(smapper, out, "@1 = @1.div32(@2);",
1.179 smapper.getI(1), smapper.popI());
1.180 break;
1.181 case opc_ldiv:
1.182 - emit(out, "@1 = @1.div64(@2);",
1.183 + emit(smapper, out, "@1 = @1.div64(@2);",
1.184 smapper.getL(1), smapper.popL());
1.185 break;
1.186 case opc_fdiv:
1.187 - emit(out, "@1 /= @2;", smapper.getF(1), smapper.popF());
1.188 + emit(smapper, out, "@1 /= @2;", smapper.getF(1), smapper.popF());
1.189 break;
1.190 case opc_ddiv:
1.191 - emit(out, "@1 /= @2;", smapper.getD(1), smapper.popD());
1.192 + emit(smapper, out, "@1 /= @2;", smapper.getD(1), smapper.popD());
1.193 break;
1.194 case opc_irem:
1.195 - emit(out, "@1 = @1.mod32(@2);",
1.196 + emit(smapper, out, "@1 = @1.mod32(@2);",
1.197 smapper.getI(1), smapper.popI());
1.198 break;
1.199 case opc_lrem:
1.200 - emit(out, "@1 = @1.mod64(@2);",
1.201 + emit(smapper, out, "@1 = @1.mod64(@2);",
1.202 smapper.getL(1), smapper.popL());
1.203 break;
1.204 case opc_frem:
1.205 - emit(out, "@1 %= @2;", smapper.getF(1), smapper.popF());
1.206 + emit(smapper, out, "@1 %= @2;", smapper.getF(1), smapper.popF());
1.207 break;
1.208 case opc_drem:
1.209 - emit(out, "@1 %= @2;", smapper.getD(1), smapper.popD());
1.210 + emit(smapper, out, "@1 %= @2;", smapper.getD(1), smapper.popD());
1.211 break;
1.212 case opc_iand:
1.213 - emit(out, "@1 &= @2;", smapper.getI(1), smapper.popI());
1.214 + emit(smapper, out, "@1 &= @2;", smapper.getI(1), smapper.popI());
1.215 break;
1.216 case opc_land:
1.217 - emit(out, "@1 = @1.and64(@2);", smapper.getL(1), smapper.popL());
1.218 + emit(smapper, out, "@1 = @1.and64(@2);", smapper.getL(1), smapper.popL());
1.219 break;
1.220 case opc_ior:
1.221 - emit(out, "@1 |= @2;", smapper.getI(1), smapper.popI());
1.222 + emit(smapper, out, "@1 |= @2;", smapper.getI(1), smapper.popI());
1.223 break;
1.224 case opc_lor:
1.225 - emit(out, "@1 = @1.or64(@2);", smapper.getL(1), smapper.popL());
1.226 + emit(smapper, out, "@1 = @1.or64(@2);", smapper.getL(1), smapper.popL());
1.227 break;
1.228 case opc_ixor:
1.229 - emit(out, "@1 ^= @2;", smapper.getI(1), smapper.popI());
1.230 + emit(smapper, out, "@1 ^= @2;", smapper.getI(1), smapper.popI());
1.231 break;
1.232 case opc_lxor:
1.233 - emit(out, "@1 = @1.xor64(@2);", smapper.getL(1), smapper.popL());
1.234 + emit(smapper, out, "@1 = @1.xor64(@2);", smapper.getL(1), smapper.popL());
1.235 break;
1.236 case opc_ineg:
1.237 - emit(out, "@1 = @1.neg32();", smapper.getI(0));
1.238 + emit(smapper, out, "@1 = @1.neg32();", smapper.getI(0));
1.239 break;
1.240 case opc_lneg:
1.241 - emit(out, "@1 = @1.neg64();", smapper.getL(0));
1.242 + emit(smapper, out, "@1 = @1.neg64();", smapper.getL(0));
1.243 break;
1.244 case opc_fneg:
1.245 - emit(out, "@1 = -@1;", smapper.getF(0));
1.246 + emit(smapper, out, "@1 = -@1;", smapper.getF(0));
1.247 break;
1.248 case opc_dneg:
1.249 - emit(out, "@1 = -@1;", smapper.getD(0));
1.250 + emit(smapper, out, "@1 = -@1;", smapper.getD(0));
1.251 break;
1.252 case opc_ishl:
1.253 - emit(out, "@1 <<= @2;", smapper.getI(1), smapper.popI());
1.254 + emit(smapper, out, "@1 <<= @2;", smapper.getI(1), smapper.popI());
1.255 break;
1.256 case opc_lshl:
1.257 - emit(out, "@1 = @1.shl64(@2);", smapper.getL(1), smapper.popI());
1.258 + emit(smapper, out, "@1 = @1.shl64(@2);", smapper.getL(1), smapper.popI());
1.259 break;
1.260 case opc_ishr:
1.261 - emit(out, "@1 >>= @2;", smapper.getI(1), smapper.popI());
1.262 + emit(smapper, out, "@1 >>= @2;", smapper.getI(1), smapper.popI());
1.263 break;
1.264 case opc_lshr:
1.265 - emit(out, "@1 = @1.shr64(@2);", smapper.getL(1), smapper.popI());
1.266 + emit(smapper, out, "@1 = @1.shr64(@2);", smapper.getL(1), smapper.popI());
1.267 break;
1.268 case opc_iushr:
1.269 - emit(out, "@1 >>>= @2;", smapper.getI(1), smapper.popI());
1.270 + emit(smapper, out, "@1 >>>= @2;", smapper.getI(1), smapper.popI());
1.271 break;
1.272 case opc_lushr:
1.273 - emit(out, "@1 = @1.ushr64(@2);", smapper.getL(1), smapper.popI());
1.274 + emit(smapper, out, "@1 = @1.ushr64(@2);", smapper.getL(1), smapper.popI());
1.275 break;
1.276 case opc_iinc: {
1.277 ++i;
1.278 @@ -692,132 +692,132 @@
1.279 : byteCodes[i];
1.280 wide = false;
1.281 if (incrBy == 1) {
1.282 - emit(out, "@1++;", lmapper.getI(varIndx));
1.283 + emit(smapper, out, "@1++;", lmapper.getI(varIndx));
1.284 } else {
1.285 - emit(out, "@1 += @2;",
1.286 + emit(smapper, out, "@1 += @2;",
1.287 lmapper.getI(varIndx),
1.288 Integer.toString(incrBy));
1.289 }
1.290 break;
1.291 }
1.292 case opc_return:
1.293 - emit(out, "return;");
1.294 + emit(smapper, out, "return;");
1.295 break;
1.296 case opc_ireturn:
1.297 - emit(out, "return @1;", smapper.popI());
1.298 + emit(smapper, out, "return @1;", smapper.popI());
1.299 break;
1.300 case opc_lreturn:
1.301 - emit(out, "return @1;", smapper.popL());
1.302 + emit(smapper, out, "return @1;", smapper.popL());
1.303 break;
1.304 case opc_freturn:
1.305 - emit(out, "return @1;", smapper.popF());
1.306 + emit(smapper, out, "return @1;", smapper.popF());
1.307 break;
1.308 case opc_dreturn:
1.309 - emit(out, "return @1;", smapper.popD());
1.310 + emit(smapper, out, "return @1;", smapper.popD());
1.311 break;
1.312 case opc_areturn:
1.313 - emit(out, "return @1;", smapper.popA());
1.314 + emit(smapper, out, "return @1;", smapper.popA());
1.315 break;
1.316 case opc_i2l:
1.317 - emit(out, "var @2 = @1;", smapper.popI(), smapper.pushL());
1.318 + emit(smapper, out, "var @2 = @1;", smapper.popI(), smapper.pushL());
1.319 break;
1.320 case opc_i2f:
1.321 - emit(out, "var @2 = @1;", smapper.popI(), smapper.pushF());
1.322 + emit(smapper, out, "var @2 = @1;", smapper.popI(), smapper.pushF());
1.323 break;
1.324 case opc_i2d:
1.325 - emit(out, "var @2 = @1;", smapper.popI(), smapper.pushD());
1.326 + emit(smapper, out, "var @2 = @1;", smapper.popI(), smapper.pushD());
1.327 break;
1.328 case opc_l2i:
1.329 - emit(out, "var @2 = @1.toInt32();", smapper.popL(), smapper.pushI());
1.330 + emit(smapper, out, "var @2 = @1.toInt32();", smapper.popL(), smapper.pushI());
1.331 break;
1.332 // max int check?
1.333 case opc_l2f:
1.334 - emit(out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushF());
1.335 + emit(smapper, out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushF());
1.336 break;
1.337 case opc_l2d:
1.338 - emit(out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushD());
1.339 + emit(smapper, out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushD());
1.340 break;
1.341 case opc_f2d:
1.342 - emit(out, "var @2 = @1;", smapper.popF(), smapper.pushD());
1.343 + emit(smapper, out, "var @2 = @1;", smapper.popF(), smapper.pushD());
1.344 break;
1.345 case opc_d2f:
1.346 - emit(out, "var @2 = @1;", smapper.popD(), smapper.pushF());
1.347 + emit(smapper, out, "var @2 = @1;", smapper.popD(), smapper.pushF());
1.348 break;
1.349 case opc_f2i:
1.350 - emit(out, "var @2 = @1.toInt32();",
1.351 + emit(smapper, out, "var @2 = @1.toInt32();",
1.352 smapper.popF(), smapper.pushI());
1.353 break;
1.354 case opc_f2l:
1.355 - emit(out, "var @2 = @1.toLong();",
1.356 + emit(smapper, out, "var @2 = @1.toLong();",
1.357 smapper.popF(), smapper.pushL());
1.358 break;
1.359 case opc_d2i:
1.360 - emit(out, "var @2 = @1.toInt32();",
1.361 + emit(smapper, out, "var @2 = @1.toInt32();",
1.362 smapper.popD(), smapper.pushI());
1.363 break;
1.364 case opc_d2l:
1.365 - emit(out, "var @2 = @1.toLong();",
1.366 + emit(smapper, out, "var @2 = @1.toLong();",
1.367 smapper.popD(), smapper.pushL());
1.368 break;
1.369 case opc_i2b:
1.370 - emit(out, "var @1 = @1.toInt8();", smapper.getI(0));
1.371 + emit(smapper, out, "var @1 = @1.toInt8();", smapper.getI(0));
1.372 break;
1.373 case opc_i2c:
1.374 out.append("{ /* number conversion */ }");
1.375 break;
1.376 case opc_i2s:
1.377 - emit(out, "var @1 = @1.toInt16();", smapper.getI(0));
1.378 + emit(smapper, out, "var @1 = @1.toInt16();", smapper.getI(0));
1.379 break;
1.380 case opc_aconst_null:
1.381 - emit(out, "var @1 = null;", smapper.pushA());
1.382 + emit(smapper, out, "var @1 = null;", smapper.pushA());
1.383 break;
1.384 case opc_iconst_m1:
1.385 - emit(out, "var @1 = -1;", smapper.pushI());
1.386 + emit(smapper, out, "var @1 = -1;", smapper.pushI());
1.387 break;
1.388 case opc_iconst_0:
1.389 - emit(out, "var @1 = 0;", smapper.pushI());
1.390 + emit(smapper, out, "var @1 = 0;", smapper.pushI());
1.391 break;
1.392 case opc_dconst_0:
1.393 - emit(out, "var @1 = 0;", smapper.pushD());
1.394 + emit(smapper, out, "var @1 = 0;", smapper.pushD());
1.395 break;
1.396 case opc_lconst_0:
1.397 - emit(out, "var @1 = 0;", smapper.pushL());
1.398 + emit(smapper, out, "var @1 = 0;", smapper.pushL());
1.399 break;
1.400 case opc_fconst_0:
1.401 - emit(out, "var @1 = 0;", smapper.pushF());
1.402 + emit(smapper, out, "var @1 = 0;", smapper.pushF());
1.403 break;
1.404 case opc_iconst_1:
1.405 - emit(out, "var @1 = 1;", smapper.pushI());
1.406 + emit(smapper, out, "var @1 = 1;", smapper.pushI());
1.407 break;
1.408 case opc_lconst_1:
1.409 - emit(out, "var @1 = 1;", smapper.pushL());
1.410 + emit(smapper, out, "var @1 = 1;", smapper.pushL());
1.411 break;
1.412 case opc_fconst_1:
1.413 - emit(out, "var @1 = 1;", smapper.pushF());
1.414 + emit(smapper, out, "var @1 = 1;", smapper.pushF());
1.415 break;
1.416 case opc_dconst_1:
1.417 - emit(out, "var @1 = 1;", smapper.pushD());
1.418 + emit(smapper, out, "var @1 = 1;", smapper.pushD());
1.419 break;
1.420 case opc_iconst_2:
1.421 - emit(out, "var @1 = 2;", smapper.pushI());
1.422 + emit(smapper, out, "var @1 = 2;", smapper.pushI());
1.423 break;
1.424 case opc_fconst_2:
1.425 - emit(out, "var @1 = 2;", smapper.pushF());
1.426 + emit(smapper, out, "var @1 = 2;", smapper.pushF());
1.427 break;
1.428 case opc_iconst_3:
1.429 - emit(out, "var @1 = 3;", smapper.pushI());
1.430 + emit(smapper, out, "var @1 = 3;", smapper.pushI());
1.431 break;
1.432 case opc_iconst_4:
1.433 - emit(out, "var @1 = 4;", smapper.pushI());
1.434 + emit(smapper, out, "var @1 = 4;", smapper.pushI());
1.435 break;
1.436 case opc_iconst_5:
1.437 - emit(out, "var @1 = 5;", smapper.pushI());
1.438 + emit(smapper, out, "var @1 = 5;", smapper.pushI());
1.439 break;
1.440 case opc_ldc: {
1.441 int indx = readUByte(byteCodes, ++i);
1.442 String v = encodeConstant(indx);
1.443 int type = VarType.fromConstantType(jc.getTag(indx));
1.444 - emit(out, "var @1 = @2;", smapper.pushT(type), v);
1.445 + emit(smapper, out, "var @1 = @2;", smapper.pushT(type), v);
1.446 break;
1.447 }
1.448 case opc_ldc_w:
1.449 @@ -830,25 +830,25 @@
1.450 final Long lv = new Long(v);
1.451 final int low = (int)(lv.longValue() & 0xFFFFFFFF);
1.452 final int hi = (int)(lv.longValue() >> 32);
1.453 - emit(out, "var @1 = 0x@3.next32(0x@2);", smapper.pushL(),
1.454 + emit(smapper, out, "var @1 = 0x@3.next32(0x@2);", smapper.pushL(),
1.455 Integer.toHexString(low), Integer.toHexString(hi));
1.456 } else {
1.457 - emit(out, "var @1 = @2;", smapper.pushT(type), v);
1.458 + emit(smapper, out, "var @1 = @2;", smapper.pushT(type), v);
1.459 }
1.460 break;
1.461 }
1.462 case opc_lcmp:
1.463 - emit(out, "var @3 = @2.compare64(@1);",
1.464 + emit(smapper, out, "var @3 = @2.compare64(@1);",
1.465 smapper.popL(), smapper.popL(), smapper.pushI());
1.466 break;
1.467 case opc_fcmpl:
1.468 case opc_fcmpg:
1.469 - emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.470 + emit(smapper, out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.471 smapper.popF(), smapper.popF(), smapper.pushI());
1.472 break;
1.473 case opc_dcmpl:
1.474 case opc_dcmpg:
1.475 - emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.476 + emit(smapper, out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.477 smapper.popD(), smapper.popD(), smapper.pushI());
1.478 break;
1.479 case opc_if_acmpeq:
1.480 @@ -865,56 +865,56 @@
1.481 break;
1.482 case opc_ifeq: {
1.483 int indx = i + readShortArg(byteCodes, i);
1.484 - emitIf(out, "if (@1 == 0) ",
1.485 + emitIf(smapper, out, "if (@1 == 0) ",
1.486 smapper.popI(), i, indx, topMostLabel);
1.487 i += 2;
1.488 break;
1.489 }
1.490 case opc_ifne: {
1.491 int indx = i + readShortArg(byteCodes, i);
1.492 - emitIf(out, "if (@1 != 0) ",
1.493 + emitIf(smapper, out, "if (@1 != 0) ",
1.494 smapper.popI(), i, indx, topMostLabel);
1.495 i += 2;
1.496 break;
1.497 }
1.498 case opc_iflt: {
1.499 int indx = i + readShortArg(byteCodes, i);
1.500 - emitIf(out, "if (@1 < 0) ",
1.501 + emitIf(smapper, out, "if (@1 < 0) ",
1.502 smapper.popI(), i, indx, topMostLabel);
1.503 i += 2;
1.504 break;
1.505 }
1.506 case opc_ifle: {
1.507 int indx = i + readShortArg(byteCodes, i);
1.508 - emitIf(out, "if (@1 <= 0) ",
1.509 + emitIf(smapper, out, "if (@1 <= 0) ",
1.510 smapper.popI(), i, indx, topMostLabel);
1.511 i += 2;
1.512 break;
1.513 }
1.514 case opc_ifgt: {
1.515 int indx = i + readShortArg(byteCodes, i);
1.516 - emitIf(out, "if (@1 > 0) ",
1.517 + emitIf(smapper, out, "if (@1 > 0) ",
1.518 smapper.popI(), i, indx, topMostLabel);
1.519 i += 2;
1.520 break;
1.521 }
1.522 case opc_ifge: {
1.523 int indx = i + readShortArg(byteCodes, i);
1.524 - emitIf(out, "if (@1 >= 0) ",
1.525 + emitIf(smapper, out, "if (@1 >= 0) ",
1.526 smapper.popI(), i, indx, topMostLabel);
1.527 i += 2;
1.528 break;
1.529 }
1.530 case opc_ifnonnull: {
1.531 int indx = i + readShortArg(byteCodes, i);
1.532 - emitIf(out, "if (@1 !== null) ",
1.533 + emitIf(smapper, out, "if (@1 !== null) ",
1.534 smapper.popA(), i, indx, topMostLabel);
1.535 i += 2;
1.536 break;
1.537 }
1.538 case opc_ifnull: {
1.539 int indx = i + readShortArg(byteCodes, i);
1.540 - emitIf(out, "if (@1 === null) ",
1.541 + emitIf(smapper, out, "if (@1 === null) ",
1.542 smapper.popA(), i, indx, topMostLabel);
1.543 i += 2;
1.544 break;
1.545 @@ -969,7 +969,7 @@
1.546 case opc_new: {
1.547 int indx = readUShortArg(byteCodes, i);
1.548 String ci = jc.getClassName(indx);
1.549 - emit(out, "var @1 = new @2;",
1.550 + emit(smapper, out, "var @1 = new @2;",
1.551 smapper.pushA(), accessClass(mangleClassName(ci)));
1.552 addReference(ci);
1.553 i += 2;
1.554 @@ -992,53 +992,53 @@
1.555 break;
1.556 }
1.557 case opc_arraylength:
1.558 - emit(out, "var @2 = @1.length;",
1.559 + emit(smapper, out, "var @2 = @1.length;",
1.560 smapper.popA(), smapper.pushI());
1.561 break;
1.562 case opc_lastore:
1.563 - emit(out, "Array.at(@3, @2, @1);",
1.564 + emit(smapper, out, "Array.at(@3, @2, @1);",
1.565 smapper.popL(), smapper.popI(), smapper.popA());
1.566 break;
1.567 case opc_fastore:
1.568 - emit(out, "Array.at(@3, @2, @1);",
1.569 + emit(smapper, out, "Array.at(@3, @2, @1);",
1.570 smapper.popF(), smapper.popI(), smapper.popA());
1.571 break;
1.572 case opc_dastore:
1.573 - emit(out, "Array.at(@3, @2, @1);",
1.574 + emit(smapper, out, "Array.at(@3, @2, @1);",
1.575 smapper.popD(), smapper.popI(), smapper.popA());
1.576 break;
1.577 case opc_aastore:
1.578 - emit(out, "Array.at(@3, @2, @1);",
1.579 + emit(smapper, out, "Array.at(@3, @2, @1);",
1.580 smapper.popA(), smapper.popI(), smapper.popA());
1.581 break;
1.582 case opc_iastore:
1.583 case opc_bastore:
1.584 case opc_castore:
1.585 case opc_sastore:
1.586 - emit(out, "Array.at(@3, @2, @1);",
1.587 + emit(smapper, out, "Array.at(@3, @2, @1);",
1.588 smapper.popI(), smapper.popI(), smapper.popA());
1.589 break;
1.590 case opc_laload:
1.591 - emit(out, "var @3 = Array.at(@2, @1);",
1.592 + emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.593 smapper.popI(), smapper.popA(), smapper.pushL());
1.594 break;
1.595 case opc_faload:
1.596 - emit(out, "var @3 = Array.at(@2, @1);",
1.597 + emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.598 smapper.popI(), smapper.popA(), smapper.pushF());
1.599 break;
1.600 case opc_daload:
1.601 - emit(out, "var @3 = Array.at(@2, @1);",
1.602 + emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.603 smapper.popI(), smapper.popA(), smapper.pushD());
1.604 break;
1.605 case opc_aaload:
1.606 - emit(out, "var @3 = Array.at(@2, @1);",
1.607 + emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.608 smapper.popI(), smapper.popA(), smapper.pushA());
1.609 break;
1.610 case opc_iaload:
1.611 case opc_baload:
1.612 case opc_caload:
1.613 case opc_saload:
1.614 - emit(out, "var @3 = Array.at(@2, @1);",
1.615 + emit(smapper, out, "var @3 = Array.at(@2, @1);",
1.616 smapper.popI(), smapper.popA(), smapper.pushI());
1.617 break;
1.618 case opc_pop:
1.619 @@ -1048,18 +1048,18 @@
1.620 break;
1.621 case opc_dup: {
1.622 final Variable v = smapper.get(0);
1.623 - emit(out, "var @1 = @2;", smapper.pushT(v.getType()), v);
1.624 + emit(smapper, out, "var @1 = @2;", smapper.pushT(v.getType()), v);
1.625 break;
1.626 }
1.627 case opc_dup2: {
1.628 final Variable vi1 = smapper.get(0);
1.629
1.630 if (vi1.isCategory2()) {
1.631 - emit(out, "var @1 = @2;",
1.632 + emit(smapper, out, "var @1 = @2;",
1.633 smapper.pushT(vi1.getType()), vi1);
1.634 } else {
1.635 final Variable vi2 = smapper.get(1);
1.636 - emit(out, "var @1 = @2, @3 = @4;",
1.637 + emit(smapper, out, "var @1 = @2, @3 = @4;",
1.638 smapper.pushT(vi2.getType()), vi2,
1.639 smapper.pushT(vi1.getType()), vi1);
1.640 }
1.641 @@ -1072,7 +1072,7 @@
1.642 final Variable vo2 = smapper.pushT(vi2.getType());
1.643 final Variable vo1 = smapper.pushT(vi1.getType());
1.644
1.645 - emit(out, "var @1 = @2, @3 = @4, @5 = @6;",
1.646 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6;",
1.647 vo1, vi1, vo2, vi2, vo3, vo1);
1.648 break;
1.649 }
1.650 @@ -1085,7 +1085,7 @@
1.651 final Variable vo2 = smapper.pushT(vi2.getType());
1.652 final Variable vo1 = smapper.pushT(vi1.getType());
1.653
1.654 - emit(out, "var @1 = @2, @3 = @4, @5 = @6;",
1.655 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6;",
1.656 vo1, vi1, vo2, vi2, vo3, vo1);
1.657 } else {
1.658 final Variable vi3 = smapper.pop();
1.659 @@ -1095,9 +1095,9 @@
1.660 final Variable vo2 = smapper.pushT(vi2.getType());
1.661 final Variable vo1 = smapper.pushT(vi1.getType());
1.662
1.663 - emit(out, "var @1 = @2, @3 = @4, @5 = @6,",
1.664 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6,",
1.665 vo1, vi1, vo2, vi2, vo3, vi3);
1.666 - emit(out, " @1 = @2, @3 = @4;",
1.667 + emit(smapper, out, " @1 = @2, @3 = @4;",
1.668 vo4, vo1, vo5, vo2);
1.669 }
1.670 break;
1.671 @@ -1111,7 +1111,7 @@
1.672 final Variable vo2 = smapper.pushT(vi2.getType());
1.673 final Variable vo1 = smapper.pushT(vi1.getType());
1.674
1.675 - emit(out, "var @1 = @2, @3 = @4, @5 = @6;",
1.676 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6;",
1.677 vo1, vi1, vo2, vi2, vo3, vo1);
1.678 } else {
1.679 final Variable vi3 = smapper.pop();
1.680 @@ -1120,7 +1120,7 @@
1.681 final Variable vo2 = smapper.pushT(vi2.getType());
1.682 final Variable vo1 = smapper.pushT(vi1.getType());
1.683
1.684 - emit(out, "var @1 = @2, @3 = @4, @5 = @6, @7 = @8;",
1.685 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6, @7 = @8;",
1.686 vo1, vi1, vo2, vi2, vo3, vi3, vo4, vo1);
1.687 }
1.688 break;
1.689 @@ -1135,7 +1135,7 @@
1.690 final Variable vo2 = smapper.pushT(vi2.getType());
1.691 final Variable vo1 = smapper.pushT(vi1.getType());
1.692
1.693 - emit(out, "var @1 = @2, @3 = @4, @5 = @6;",
1.694 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6;",
1.695 vo1, vi1, vo2, vi2, vo3, vo1);
1.696 } else {
1.697 final Variable vi3 = smapper.pop();
1.698 @@ -1144,7 +1144,7 @@
1.699 final Variable vo2 = smapper.pushT(vi2.getType());
1.700 final Variable vo1 = smapper.pushT(vi1.getType());
1.701
1.702 - emit(out, "var @1 = @2, @3 = @4, @5 = @6, @7 = @8;",
1.703 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6, @7 = @8;",
1.704 vo1, vi1, vo2, vi2, vo3, vi3, vo4, vo1);
1.705 }
1.706 } else {
1.707 @@ -1157,9 +1157,9 @@
1.708 final Variable vo2 = smapper.pushT(vi2.getType());
1.709 final Variable vo1 = smapper.pushT(vi1.getType());
1.710
1.711 - emit(out, "var @1 = @2, @3 = @4, @5 = @6,",
1.712 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6,",
1.713 vo1, vi1, vo2, vi2, vo3, vi3);
1.714 - emit(out, " @1 = @2, @3 = @4;",
1.715 + emit(smapper, out, " @1 = @2, @3 = @4;",
1.716 vo4, vo1, vo5, vo2);
1.717 } else {
1.718 final Variable vi4 = smapper.pop();
1.719 @@ -1170,9 +1170,9 @@
1.720 final Variable vo2 = smapper.pushT(vi2.getType());
1.721 final Variable vo1 = smapper.pushT(vi1.getType());
1.722
1.723 - emit(out, "var @1 = @2, @3 = @4, @5 = @6, @7 = @8,",
1.724 + emit(smapper, out, "var @1 = @2, @3 = @4, @5 = @6, @7 = @8,",
1.725 vo1, vi1, vo2, vi2, vo3, vi3, vo4, vi4);
1.726 - emit(out, " @1 = @2, @3 = @4;",
1.727 + emit(smapper, out, " @1 = @2, @3 = @4;",
1.728 vo5, vo1, vo6, vo2);
1.729 }
1.730 }
1.731 @@ -1185,7 +1185,7 @@
1.732 if (vi1.getType() == vi2.getType()) {
1.733 final Variable tmp = smapper.pushT(vi1.getType());
1.734
1.735 - emit(out, "var @1 = @2, @2 = @3, @3 = @1;",
1.736 + emit(smapper, out, "var @1 = @2, @2 = @3, @3 = @1;",
1.737 tmp, vi1, vi2);
1.738 smapper.pop(1);
1.739 } else {
1.740 @@ -1196,11 +1196,11 @@
1.741 break;
1.742 }
1.743 case opc_bipush:
1.744 - emit(out, "var @1 = @2;",
1.745 + emit(smapper, out, "var @1 = @2;",
1.746 smapper.pushI(), Integer.toString(byteCodes[++i]));
1.747 break;
1.748 case opc_sipush:
1.749 - emit(out, "var @1 = @2;",
1.750 + emit(smapper, out, "var @1 = @2;",
1.751 smapper.pushI(),
1.752 Integer.toString(readShortArg(byteCodes, i)));
1.753 i += 2;
1.754 @@ -1211,7 +1211,7 @@
1.755 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.756 final String mangleClass = mangleClassName(fi[0]);
1.757 final String mangleClassAccess = accessClass(mangleClass);
1.758 - emit(out, "var @2 = @4(false)._@3.call(@1);",
1.759 + emit(smapper, out, "var @2 = @4(false)._@3.call(@1);",
1.760 smapper.popA(),
1.761 smapper.pushT(type), fi[1], mangleClassAccess
1.762 );
1.763 @@ -1224,7 +1224,7 @@
1.764 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.765 final String mangleClass = mangleClassName(fi[0]);
1.766 final String mangleClassAccess = accessClass(mangleClass);
1.767 - emit(out, "@4(false)._@3.call(@2, @1);",
1.768 + emit(smapper, out, "@4(false)._@3.call(@2, @1);",
1.769 smapper.popT(type),
1.770 smapper.popA(), fi[1],
1.771 mangleClassAccess
1.772 @@ -1236,7 +1236,7 @@
1.773 int indx = readUShortArg(byteCodes, i);
1.774 String[] fi = jc.getFieldInfoName(indx);
1.775 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.776 - emit(out, "var @1 = @2(false)._@3();",
1.777 + emit(smapper, out, "var @1 = @2(false)._@3();",
1.778 smapper.pushT(type),
1.779 accessClass(mangleClassName(fi[0])), fi[1]);
1.780 i += 2;
1.781 @@ -1247,7 +1247,7 @@
1.782 int indx = readUShortArg(byteCodes, i);
1.783 String[] fi = jc.getFieldInfoName(indx);
1.784 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.785 - emit(out, "@1(false)._@2(@3);",
1.786 + emit(smapper, out, "@1(false)._@2(@3);",
1.787 accessClass(mangleClassName(fi[0])), fi[1],
1.788 smapper.popT(type));
1.789 i += 2;
1.790 @@ -1270,7 +1270,7 @@
1.791 final Variable v = smapper.popA();
1.792 smapper.clear();
1.793
1.794 - emit(out, "{ var @1 = @2; throw @2; }",
1.795 + emit(smapper, out, "{ var @1 = @2; throw @2; }",
1.796 smapper.pushA(), v);
1.797 break;
1.798 }
1.799 @@ -1293,7 +1293,7 @@
1.800
1.801 default: {
1.802 wide = false;
1.803 - emit(out, "throw 'unknown bytecode @1';",
1.804 + emit(smapper, out, "throw 'unknown bytecode @1';",
1.805 Integer.toString(c));
1.806 }
1.807 }
1.808 @@ -1930,7 +1930,15 @@
1.809 return ",";
1.810 }
1.811
1.812 - static void emit(final Appendable out,
1.813 + final void emit(
1.814 + StackMapper sm,
1.815 + final Appendable out,
1.816 + final String format, final CharSequence... params
1.817 + ) throws IOException {
1.818 + sm.flush(out);
1.819 + emitImpl(out, format, params);
1.820 + }
1.821 + static void emitImpl(final Appendable out,
1.822 final String format,
1.823 final CharSequence... params) throws IOException {
1.824 final int length = format.length();
1.825 @@ -1996,10 +2004,13 @@
1.826 }
1.827
1.828 private static void emitIf(
1.829 - Appendable out, String pattern, Variable param,
1.830 + StackMapper sm,
1.831 + Appendable out, String pattern,
1.832 + Variable param,
1.833 int current, int to, int canBack
1.834 ) throws IOException {
1.835 - emit(out, pattern, param);
1.836 + sm.flush(out);
1.837 + emitImpl(out, pattern, param);
1.838 goTo(out, current, to, canBack);
1.839 }
1.840
1.841 @@ -2016,7 +2027,7 @@
1.842 case 11: jvmType = "[J"; break;
1.843 default: throw new IllegalStateException("Array type: " + atype);
1.844 }
1.845 - emit(out, "var @2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(true, '@3', @1);",
1.846 + emit(smapper, out, "var @2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(true, '@3', @1);",
1.847 smapper.popI(), smapper.pushA(), jvmType);
1.848 }
1.849
1.850 @@ -2027,7 +2038,7 @@
1.851 } else {
1.852 typeName = "[L" + typeName + ";";
1.853 }
1.854 - emit(out, "var @2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(false, '@3', @1);",
1.855 + emit(smapper, out, "var @2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(false, '@3', @1);",
1.856 smapper.popI(), smapper.pushA(), typeName);
1.857 }
1.858
1.859 @@ -2043,7 +2054,7 @@
1.860 dims.insert(1, smapper.popI());
1.861 }
1.862 dims.append(']');
1.863 - emit(out, "var @2 = Array.prototype.multiNewArray__Ljava_lang_Object_2Ljava_lang_String_2_3II('@3', @1, 0);",
1.864 + emit(smapper, out, "var @2 = Array.prototype.multiNewArray__Ljava_lang_Object_2Ljava_lang_String_2_3II('@3', @1, 0);",
1.865 dims.toString(), smapper.pushA(), typeName);
1.866 return i;
1.867 }
1.868 @@ -2094,11 +2105,11 @@
1.869 private void generateInstanceOf(int indx, final StackMapper smapper) throws IOException {
1.870 final String type = jc.getClassName(indx);
1.871 if (!type.startsWith("[")) {
1.872 - emit(out, "var @2 = @1 != null && @1.$instOf_@3 ? 1 : 0;",
1.873 + emit(smapper, out, "var @2 = @1 != null && @1.$instOf_@3 ? 1 : 0;",
1.874 smapper.popA(), smapper.pushI(),
1.875 type.replace('/', '_'));
1.876 } else {
1.877 - emit(out, "var @2 = vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@3').isInstance__ZLjava_lang_Object_2(@1);",
1.878 + emit(smapper, out, "var @2 = vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@3').isInstance__ZLjava_lang_Object_2(@1);",
1.879 smapper.popA(), smapper.pushI(),
1.880 type
1.881 );
1.882 @@ -2108,11 +2119,11 @@
1.883 private void generateCheckcast(int indx, final StackMapper smapper) throws IOException {
1.884 final String type = jc.getClassName(indx);
1.885 if (!type.startsWith("[")) {
1.886 - emit(out,
1.887 + emit(smapper, out,
1.888 "if (@1 !== null && !@1.$instOf_@2) throw vm.java_lang_ClassCastException(true);",
1.889 smapper.getA(0), type.replace('/', '_'));
1.890 } else {
1.891 - emit(out, "vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@2').cast__Ljava_lang_Object_2Ljava_lang_Object_2(@1);",
1.892 + emit(smapper, out, "vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@2').cast__Ljava_lang_Object_2Ljava_lang_Object_2(@1);",
1.893 smapper.getA(0), type
1.894 );
1.895 }
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Sat Feb 15 15:47:28 2014 +0100
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Sat Feb 15 17:23:24 2014 +0100
2.3 @@ -22,13 +22,16 @@
2.4
2.5 final class StackMapper {
2.6 private final TypeArray stackTypeIndexPairs;
2.7 + private final StringArray stackValues;
2.8
2.9 public StackMapper() {
2.10 stackTypeIndexPairs = new TypeArray();
2.11 + stackValues = new StringArray();
2.12 }
2.13
2.14 public void clear() {
2.15 stackTypeIndexPairs.clear();
2.16 + stackValues.clear();
2.17 }
2.18
2.19 public void syncWithFrameStack(final TypeArray frameStack) {
2.20 @@ -65,7 +68,20 @@
2.21 }
2.22
2.23 void assign(Appendable out, int varType, CharSequence s) throws IOException {
2.24 - ByteCodeToJavaScript.emit(out, "var @1 = @2;", pushT(varType), s);
2.25 + pushTypeAndValue(varType, s);
2.26 + flush(out);
2.27 + }
2.28 +
2.29 + void flush(Appendable out) throws IOException {
2.30 + int count = stackTypeIndexPairs.getSize();
2.31 + for (int i = 0; i < count; i++) {
2.32 + String val = stackValues.getAndClear(i);
2.33 + if (val == null) {
2.34 + continue;
2.35 + }
2.36 + CharSequence var = getVariable(stackTypeIndexPairs.get(i));
2.37 + ByteCodeToJavaScript.emitImpl(out, "var @1 = @2;", var, val);
2.38 + }
2.39 }
2.40
2.41 public Variable popI() {
2.42 @@ -157,8 +173,26 @@
2.43 final int count = stackTypeIndexPairs.getSize();
2.44 final int value = (count << 8) | (type & 0xff);
2.45 stackTypeIndexPairs.add(value);
2.46 +
2.47 + addStackValue(count, null);
2.48 + return value;
2.49 + }
2.50
2.51 - return value;
2.52 + private void pushTypeAndValue(final int type, CharSequence v) {
2.53 + final int count = stackTypeIndexPairs.getSize();
2.54 + final int value = (count << 8) | (type & 0xff);
2.55 + stackTypeIndexPairs.add(value);
2.56 + final String val = v.toString();
2.57 + addStackValue(count, val);
2.58 + }
2.59 +
2.60 + private void addStackValue(int at, final String val) {
2.61 + final String[] arr = stackValues.toArray();
2.62 + if (arr.length > at) {
2.63 + arr[at] = val;
2.64 + } else {
2.65 + stackValues.add(val);
2.66 + }
2.67 }
2.68
2.69 private void popImpl(final int count) {
3.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/StringArray.java Sat Feb 15 15:47:28 2014 +0100
3.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/StringArray.java Sat Feb 15 17:23:24 2014 +0100
3.3 @@ -112,4 +112,14 @@
3.4 }
3.5 return -1;
3.6 }
3.7 +
3.8 + String getAndClear(int count) {
3.9 + String s = arr[count];
3.10 + arr[count] = null;
3.11 + return s;
3.12 + }
3.13 +
3.14 + void clear() {
3.15 + arr = null;
3.16 + }
3.17 }