diff -r 80a388c8c27b -r 8e546d108658 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 21 13:39:23 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 25 11:00:52 2013 +0100 @@ -304,7 +304,7 @@ emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(0)); break; case opc_lload_0: - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(0)); + emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(0)); break; case opc_fload_0: emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(0)); @@ -319,7 +319,7 @@ emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(1)); break; case opc_lload_1: - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(1)); + emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(1)); break; case opc_fload_1: emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(1)); @@ -334,7 +334,7 @@ emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(2)); break; case opc_lload_2: - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(2)); + emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(2)); break; case opc_fload_2: emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(2)); @@ -349,7 +349,7 @@ emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(3)); break; case opc_lload_3: - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(3)); + emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(3)); break; case opc_fload_3: emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(3)); @@ -481,7 +481,7 @@ emit(out, "@1 = @1.add32(@2);", smapper.getI(1), smapper.popI()); break; case opc_ladd: - emit(out, "@1 += @2;", smapper.getL(1), smapper.popL()); + emit(out, "@1 = @1.add64(@2);", smapper.getL(1), smapper.popL()); break; case opc_fadd: emit(out, "@1 += @2;", smapper.getF(1), smapper.popF()); @@ -518,7 +518,7 @@ smapper.getI(1), smapper.popI()); break; case opc_ldiv: - emit(out, "@1 = Math.floor(@1 / @2);", + emit(out, "@1 = @1.div64(@2);", smapper.getL(1), smapper.popL()); break; case opc_fdiv: @@ -573,7 +573,7 @@ emit(out, "@1 <<= @2;", smapper.getI(1), smapper.popI()); break; case opc_lshl: - emit(out, "@1 <<= @2;", smapper.getL(1), smapper.popI()); + emit(out, "@1 = @1.shl64(@2);", smapper.getL(1), smapper.popI()); break; case opc_ishr: emit(out, "@1 >>= @2;", smapper.getI(1), smapper.popI()); @@ -618,7 +618,7 @@ emit(out, "return @1;", smapper.popA()); break; case opc_i2l: - emit(out, "var @2 = @1;", smapper.popI(), smapper.pushL()); + emit(out, "var @2 = new Long(@1, 0);", smapper.popI(), smapper.pushL()); break; case opc_i2f: emit(out, "var @2 = @1;", smapper.popI(), smapper.pushF()); @@ -627,14 +627,14 @@ emit(out, "var @2 = @1;", smapper.popI(), smapper.pushD()); break; case opc_l2i: - emit(out, "var @2 = @1;", smapper.popL(), smapper.pushI()); + emit(out, "var @2 = @1.toInt32();", smapper.popL(), smapper.pushI()); break; // max int check? case opc_l2f: - emit(out, "var @2 = @1;", smapper.popL(), smapper.pushF()); + emit(out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushF()); break; case opc_l2d: - emit(out, "var @2 = @1;", smapper.popL(), smapper.pushD()); + emit(out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushD()); break; case opc_f2d: emit(out, "var @2 = @1;", smapper.popF(), smapper.pushD()); @@ -647,7 +647,7 @@ smapper.popF(), smapper.pushI()); break; case opc_f2l: - emit(out, "var @2 = Math.floor(@1);", + emit(out, "var @2 = LongFromNumber(Math.floor(@1));", smapper.popF(), smapper.pushL()); break; case opc_d2i: @@ -655,7 +655,7 @@ smapper.popD(), smapper.pushI()); break; case opc_d2l: - emit(out, "var @2 = Math.floor(@1);", + emit(out, "var @2 = LongFromNumber(Math.floor(@1));", smapper.popD(), smapper.pushL()); break; case opc_i2b: @@ -680,7 +680,7 @@ emit(out, "var @1 = 0;", smapper.pushD()); break; case opc_lconst_0: - emit(out, "var @1 = 0;", smapper.pushL()); + emit(out, "var @1 = new Long(0,0);", smapper.pushL()); break; case opc_fconst_0: emit(out, "var @1 = 0;", smapper.pushF()); @@ -689,7 +689,7 @@ emit(out, "var @1 = 1;", smapper.pushI()); break; case opc_lconst_1: - emit(out, "var @1 = 1;", smapper.pushL()); + emit(out, "var @1 = new Long(1,0);", smapper.pushL()); break; case opc_fconst_1: emit(out, "var @1 = 1;", smapper.pushF()); @@ -725,11 +725,19 @@ i += 2; String v = encodeConstant(indx); int type = VarType.fromConstantType(jc.getTag(indx)); - emit(out, "var @1 = @2;", smapper.pushT(type), v); + if (type == VarType.LONG) { + final Long lv = new Long(v); + final int low = (int)(lv.longValue() & 0xFFFFFFFF); + final int hi = (int)(lv.longValue() >> 32); + emit(out, "var @1 = new Long(0x@2, 0x@3);", smapper.pushL(), + Integer.toHexString(low), Integer.toHexString(hi)); + } else { + emit(out, "var @1 = @2;", smapper.pushT(type), v); + } break; } case opc_lcmp: - emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);", + emit(out, "var @3 = @2.compare64(@1);", smapper.popL(), smapper.popL(), smapper.pushI()); break; case opc_fcmpl: