fix BitStorage bug
authorAmir Kamil <kamil@cs.berkeley.edu>
Tue, 10 Jul 2007 04:44:51 +0000 (05:44 +0100)
committerAmir Kamil <kamil@cs.berkeley.edu>
Tue, 10 Jul 2007 04:44:51 +0000 (05:44 +0100)
ships/BitFifo.ship

index 60de543..61b6491 100644 (file)
@@ -110,7 +110,8 @@ private static class BitStorage {
     int entry = ((numbits + start) / 64) % bits.length;
     int off = (numbits + start) % 64;
     int maxadd = 64 - off;
-    bits[entry] = (bits[entry] & (-1L >>> maxadd)) | (data << off);
+    long mask = maxadd < 64 ? (-1L >>> maxadd) : 0L;
+    bits[entry] = (bits[entry] & mask) | (data << off);
     if (num > maxadd) {
       numbits += maxadd;
       return add(data >>> maxadd, num - maxadd);
@@ -125,11 +126,13 @@ private static class BitStorage {
     int off = start % 64;
     int max = 64 - off;
     int n = num > max ? max : num;
-    long res = (bits[entry] >>> off) & (-1L >>> (64 - n));
+    long mask = n > 0 ? (-1L >>> (64 - n)) : 0L;
+    long res = (bits[entry] >>> off) & mask;
     int oldstart = start;
     if (n < num) {
       int n2 = num - n;
-      res |= (bits[(entry + 1) % bits.length] & (-1L >>> (64 - n2))) << n;
+      long mask2 = n2 > 0 ? (-1L >>> (64 - n2)) : 0L;
+      res |= (bits[(entry + 1) % bits.length] & mask2) << n;
     }
     start = (start + num) % (64 * bits.length);
     numbits -= num;
@@ -139,6 +142,43 @@ private static class BitStorage {
     return 64 * bits.length;
   }
   // Test code for BitStorage
+  static void test3(String[] args) {
+      BitStorage bs = new BitStorage(37);
+      Random rand = new Random();
+      Vector ins = new Vector();
+      Vector ret = new Vector();
+      StringBuffer sbi = new StringBuffer();
+      StringBuffer sbr = new StringBuffer();
+      System.out.println("==== Test #3 ====");
+      System.out.println("inserting...");
+      long data = rand.nextLong();
+      bs.add(data, 0);
+      ins.add(new Integer(0));
+      data = rand.nextLong();
+      int num = rand.nextInt(37);
+      int s = bs.size();
+      bs.add(data, num);
+      assert bs.size() - s == num : "bad size: " + s + " + " + num + " != " + bs.size();
+      ins.add(new Integer(num));
+      add(sbi, data, num);
+      print(data, num);
+      System.out.println("\nretrieving...");
+      num = bs.size();
+      data = bs.get(num);
+      ret.add(new Integer(num));
+      add(sbr, data, num);
+      print(data, num);
+      System.out.println("\ninsertion sequence:");
+      for (int i = 0; i < ins.size(); i++) {
+         System.out.print(" " + ins.get(i));
+      }
+      System.out.println("\nretrieval sequence:");
+      for (int i = 0; i < ret.size(); i++) {
+         System.out.print(" " + ret.get(i));
+      }
+      System.out.println();
+      check(sbi, sbr);
+  }
   static void test2(String[] args) {
       int iters = (args.length > 0 ? Integer.parseInt(args[0]) : 10);
       BitStorage bs = new BitStorage(37 * iters);
@@ -259,6 +299,7 @@ private static class BitStorage {
 public static void main(String[] args) {
     BitStorage.test1(args);
     BitStorage.test2(args);
+    BitStorage.test3(args);
 }
 
 // Ship implementation