From: Amir Kamil Date: Tue, 10 Jul 2007 04:44:51 +0000 (+0100) Subject: fix BitStorage bug X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=4903fb55706f5760475057334395c084cc8a434e;p=fleet.git fix BitStorage bug --- diff --git a/ships/BitFifo.ship b/ships/BitFifo.ship index 60de543..61b6491 100644 --- a/ships/BitFifo.ship +++ b/ships/BitFifo.ship @@ -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