Making sure bit manipulation with longs produce reasonable results ReducedStack
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 16 Feb 2014 22:22:22 +0100
branchReducedStack
changeset 14621e7ff3ba3666
parent 1461 cfba11aaf2b5
child 1463 15c1110da559
Making sure bit manipulation with longs produce reasonable results
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Feb 16 20:36:47 2014 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Feb 16 22:22:22 2014 +0100
     1.3 @@ -831,10 +831,16 @@
     1.4                          final Long lv = new Long(v);
     1.5                          final int low = (int)(lv.longValue() & 0xFFFFFFFF);
     1.6                          final int hi = (int)(lv.longValue() >> 32);
     1.7 -                        emit(smapper, out, "var @1 = 0x@3.next32(0x@2);", smapper.pushL(), 
     1.8 -                                Integer.toHexString(low), Integer.toHexString(hi));
     1.9 +                        if (hi == 0) {
    1.10 +                            smapper.assign(out, VarType.LONG, "(0x" + Integer.toHexString(low) + ")");
    1.11 +                        } else {
    1.12 +                            smapper.assign(out, VarType.LONG,
    1.13 +                                "0x" + Integer.toHexString(hi) + ".next32(0x" + 
    1.14 +                                    Integer.toHexString(low) + ")"
    1.15 +                            );
    1.16 +                        }
    1.17                      } else {
    1.18 -                        emit(smapper, out, "var @1 = @2;", smapper.pushT(type), v);
    1.19 +                        smapper.assign(out, type, v);
    1.20                      }
    1.21                      break;
    1.22                  }
    1.23 @@ -1198,13 +1204,13 @@
    1.24                      break;
    1.25                  }
    1.26                  case opc_bipush:
    1.27 -                    emit(smapper, out, "var @1 = @2;",
    1.28 -                         smapper.pushI(), Integer.toString(byteCodes[++i]));
    1.29 +                    smapper.assign(out, VarType.INTEGER, 
    1.30 +                        "(" + Integer.toString(byteCodes[++i]) + ")");
    1.31                      break;
    1.32                  case opc_sipush:
    1.33 -                    emit(smapper, out, "var @1 = @2;",
    1.34 -                         smapper.pushI(),
    1.35 -                         Integer.toString(readShortArg(byteCodes, i)));
    1.36 +                    smapper.assign(out, VarType.INTEGER, 
    1.37 +                        "(" + Integer.toString(readShortArg(byteCodes, i)) + ")"
    1.38 +                    );
    1.39                      i += 2;
    1.40                      break;
    1.41                  case opc_getfield: {
     2.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Sun Feb 16 20:36:47 2014 +0100
     2.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Sun Feb 16 22:22:22 2014 +0100
     2.3 @@ -117,6 +117,12 @@
     2.4          double f = 3.0;
     2.5          assertExec("Should be the same", Numbers.class, "deserDouble__D", f);
     2.6      }
     2.7 +    
     2.8 +    @Test public void bytesToLong() throws Exception {
     2.9 +        long exp = Numbers.bytesToLong((byte)30, (byte)20, 32);
    2.10 +        assertExec("Should be the same", Numbers.class, "bytesToLong__JBBI", 
    2.11 +            Double.valueOf(exp), 30, 20, 32);
    2.12 +    }
    2.13      /*
    2.14      @Test public void serDouble() throws IOException {
    2.15          double f = 3.0;
     3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java	Sun Feb 16 20:36:47 2014 +0100
     3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java	Sun Feb 16 22:22:22 2014 +0100
     3.3 @@ -64,6 +64,10 @@
     3.4          DataInputStream dis = new DataInputStream(is);
     3.5          return dis.readInt();
     3.6      }
     3.7 +    static long bytesToLong(byte b1, byte b2, int shift) {
     3.8 +        return (((long)b1 << 56) +
     3.9 +                ((long)b2 & 255) << 48) >> shift;
    3.10 +    }
    3.11  
    3.12      static String intToString() {
    3.13          return new Integer(5).toString().toString();