# HG changeset patch # User Jaroslav Tulach # Date 1392585742 -3600 # Node ID 1e7ff3ba36661008daf3df1dca1bcc876b12f526 # Parent cfba11aaf2b5d6e69de9f6cdde49346f976d3a58 Making sure bit manipulation with longs produce reasonable results diff -r cfba11aaf2b5 -r 1e7ff3ba3666 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Feb 16 20:36:47 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Feb 16 22:22:22 2014 +0100 @@ -831,10 +831,16 @@ final Long lv = new Long(v); final int low = (int)(lv.longValue() & 0xFFFFFFFF); final int hi = (int)(lv.longValue() >> 32); - emit(smapper, out, "var @1 = 0x@3.next32(0x@2);", smapper.pushL(), - Integer.toHexString(low), Integer.toHexString(hi)); + if (hi == 0) { + smapper.assign(out, VarType.LONG, "(0x" + Integer.toHexString(low) + ")"); + } else { + smapper.assign(out, VarType.LONG, + "0x" + Integer.toHexString(hi) + ".next32(0x" + + Integer.toHexString(low) + ")" + ); + } } else { - emit(smapper, out, "var @1 = @2;", smapper.pushT(type), v); + smapper.assign(out, type, v); } break; } @@ -1198,13 +1204,13 @@ break; } case opc_bipush: - emit(smapper, out, "var @1 = @2;", - smapper.pushI(), Integer.toString(byteCodes[++i])); + smapper.assign(out, VarType.INTEGER, + "(" + Integer.toString(byteCodes[++i]) + ")"); break; case opc_sipush: - emit(smapper, out, "var @1 = @2;", - smapper.pushI(), - Integer.toString(readShortArg(byteCodes, i))); + smapper.assign(out, VarType.INTEGER, + "(" + Integer.toString(readShortArg(byteCodes, i)) + ")" + ); i += 2; break; case opc_getfield: { diff -r cfba11aaf2b5 -r 1e7ff3ba3666 rt/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java Sun Feb 16 20:36:47 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java Sun Feb 16 22:22:22 2014 +0100 @@ -117,6 +117,12 @@ double f = 3.0; assertExec("Should be the same", Numbers.class, "deserDouble__D", f); } + + @Test public void bytesToLong() throws Exception { + long exp = Numbers.bytesToLong((byte)30, (byte)20, 32); + assertExec("Should be the same", Numbers.class, "bytesToLong__JBBI", + Double.valueOf(exp), 30, 20, 32); + } /* @Test public void serDouble() throws IOException { double f = 3.0; diff -r cfba11aaf2b5 -r 1e7ff3ba3666 rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Sun Feb 16 20:36:47 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Sun Feb 16 22:22:22 2014 +0100 @@ -64,6 +64,10 @@ DataInputStream dis = new DataInputStream(is); return dis.readInt(); } + static long bytesToLong(byte b1, byte b2, int shift) { + return (((long)b1 << 56) + + ((long)b2 & 255) << 48) >> shift; + } static String intToString() { return new Integer(5).toString().toString();