1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 21 13:39:23 2013 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 25 11:00:52 2013 +0100
1.3 @@ -304,7 +304,7 @@
1.4 emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(0));
1.5 break;
1.6 case opc_lload_0:
1.7 - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(0));
1.8 + emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(0));
1.9 break;
1.10 case opc_fload_0:
1.11 emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(0));
1.12 @@ -319,7 +319,7 @@
1.13 emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(1));
1.14 break;
1.15 case opc_lload_1:
1.16 - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(1));
1.17 + emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(1));
1.18 break;
1.19 case opc_fload_1:
1.20 emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(1));
1.21 @@ -334,7 +334,7 @@
1.22 emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(2));
1.23 break;
1.24 case opc_lload_2:
1.25 - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(2));
1.26 + emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(2));
1.27 break;
1.28 case opc_fload_2:
1.29 emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(2));
1.30 @@ -349,7 +349,7 @@
1.31 emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(3));
1.32 break;
1.33 case opc_lload_3:
1.34 - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(3));
1.35 + emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(3));
1.36 break;
1.37 case opc_fload_3:
1.38 emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(3));
1.39 @@ -481,7 +481,7 @@
1.40 emit(out, "@1 = @1.add32(@2);", smapper.getI(1), smapper.popI());
1.41 break;
1.42 case opc_ladd:
1.43 - emit(out, "@1 += @2;", smapper.getL(1), smapper.popL());
1.44 + emit(out, "@1 = @1.add64(@2);", smapper.getL(1), smapper.popL());
1.45 break;
1.46 case opc_fadd:
1.47 emit(out, "@1 += @2;", smapper.getF(1), smapper.popF());
1.48 @@ -518,7 +518,7 @@
1.49 smapper.getI(1), smapper.popI());
1.50 break;
1.51 case opc_ldiv:
1.52 - emit(out, "@1 = Math.floor(@1 / @2);",
1.53 + emit(out, "@1 = @1.div64(@2);",
1.54 smapper.getL(1), smapper.popL());
1.55 break;
1.56 case opc_fdiv:
1.57 @@ -573,7 +573,7 @@
1.58 emit(out, "@1 <<= @2;", smapper.getI(1), smapper.popI());
1.59 break;
1.60 case opc_lshl:
1.61 - emit(out, "@1 <<= @2;", smapper.getL(1), smapper.popI());
1.62 + emit(out, "@1 = @1.shl64(@2);", smapper.getL(1), smapper.popI());
1.63 break;
1.64 case opc_ishr:
1.65 emit(out, "@1 >>= @2;", smapper.getI(1), smapper.popI());
1.66 @@ -618,7 +618,7 @@
1.67 emit(out, "return @1;", smapper.popA());
1.68 break;
1.69 case opc_i2l:
1.70 - emit(out, "var @2 = @1;", smapper.popI(), smapper.pushL());
1.71 + emit(out, "var @2 = new Long(@1, 0);", smapper.popI(), smapper.pushL());
1.72 break;
1.73 case opc_i2f:
1.74 emit(out, "var @2 = @1;", smapper.popI(), smapper.pushF());
1.75 @@ -627,14 +627,14 @@
1.76 emit(out, "var @2 = @1;", smapper.popI(), smapper.pushD());
1.77 break;
1.78 case opc_l2i:
1.79 - emit(out, "var @2 = @1;", smapper.popL(), smapper.pushI());
1.80 + emit(out, "var @2 = @1.toInt32();", smapper.popL(), smapper.pushI());
1.81 break;
1.82 // max int check?
1.83 case opc_l2f:
1.84 - emit(out, "var @2 = @1;", smapper.popL(), smapper.pushF());
1.85 + emit(out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushF());
1.86 break;
1.87 case opc_l2d:
1.88 - emit(out, "var @2 = @1;", smapper.popL(), smapper.pushD());
1.89 + emit(out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushD());
1.90 break;
1.91 case opc_f2d:
1.92 emit(out, "var @2 = @1;", smapper.popF(), smapper.pushD());
1.93 @@ -647,7 +647,7 @@
1.94 smapper.popF(), smapper.pushI());
1.95 break;
1.96 case opc_f2l:
1.97 - emit(out, "var @2 = Math.floor(@1);",
1.98 + emit(out, "var @2 = LongFromNumber(Math.floor(@1));",
1.99 smapper.popF(), smapper.pushL());
1.100 break;
1.101 case opc_d2i:
1.102 @@ -655,7 +655,7 @@
1.103 smapper.popD(), smapper.pushI());
1.104 break;
1.105 case opc_d2l:
1.106 - emit(out, "var @2 = Math.floor(@1);",
1.107 + emit(out, "var @2 = LongFromNumber(Math.floor(@1));",
1.108 smapper.popD(), smapper.pushL());
1.109 break;
1.110 case opc_i2b:
1.111 @@ -680,7 +680,7 @@
1.112 emit(out, "var @1 = 0;", smapper.pushD());
1.113 break;
1.114 case opc_lconst_0:
1.115 - emit(out, "var @1 = 0;", smapper.pushL());
1.116 + emit(out, "var @1 = new Long(0,0);", smapper.pushL());
1.117 break;
1.118 case opc_fconst_0:
1.119 emit(out, "var @1 = 0;", smapper.pushF());
1.120 @@ -689,7 +689,7 @@
1.121 emit(out, "var @1 = 1;", smapper.pushI());
1.122 break;
1.123 case opc_lconst_1:
1.124 - emit(out, "var @1 = 1;", smapper.pushL());
1.125 + emit(out, "var @1 = new Long(1,0);", smapper.pushL());
1.126 break;
1.127 case opc_fconst_1:
1.128 emit(out, "var @1 = 1;", smapper.pushF());
1.129 @@ -725,11 +725,19 @@
1.130 i += 2;
1.131 String v = encodeConstant(indx);
1.132 int type = VarType.fromConstantType(jc.getTag(indx));
1.133 - emit(out, "var @1 = @2;", smapper.pushT(type), v);
1.134 + if (type == VarType.LONG) {
1.135 + final Long lv = new Long(v);
1.136 + final int low = (int)(lv.longValue() & 0xFFFFFFFF);
1.137 + final int hi = (int)(lv.longValue() >> 32);
1.138 + emit(out, "var @1 = new Long(0x@2, 0x@3);", smapper.pushL(),
1.139 + Integer.toHexString(low), Integer.toHexString(hi));
1.140 + } else {
1.141 + emit(out, "var @1 = @2;", smapper.pushT(type), v);
1.142 + }
1.143 break;
1.144 }
1.145 case opc_lcmp:
1.146 - emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.147 + emit(out, "var @3 = @2.compare64(@1);",
1.148 smapper.popL(), smapper.popL(), smapper.pushI());
1.149 break;
1.150 case opc_fcmpl: