Index: test/unittests/heap/marking-unittest.cc |
diff --git a/test/unittests/heap/marking-unittest.cc b/test/unittests/heap/marking-unittest.cc |
index 5be909a1a400a7f7babe9d30cf749df4b78cb5f3..0015cce8d77fd403d05c83ec2231062007a465af 100644 |
--- a/test/unittests/heap/marking-unittest.cc |
+++ b/test/unittests/heap/marking-unittest.cc |
@@ -110,5 +110,51 @@ TEST(Marking, TransitionWhiteGreyBlackGrey) { |
free(bitmap); |
} |
+TEST(Marking, SetAndClearRange) { |
+ Bitmap* bitmap = reinterpret_cast<Bitmap*>( |
+ calloc(Bitmap::kSize / kPointerSize, kPointerSize)); |
+ for (int i = 0; i < 3; i++) { |
+ bitmap->SetRange(i, Bitmap::kBitsPerCell + i); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[0], 0xffffffff << i); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[1], (1 << i) - 1); |
+ bitmap->ClearRange(i, Bitmap::kBitsPerCell + i); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[0], 0x0); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[1], 0x0); |
+ } |
+ free(bitmap); |
+} |
+ |
+TEST(Marking, ClearMultipleRanges) { |
+ Bitmap* bitmap = reinterpret_cast<Bitmap*>( |
+ calloc(Bitmap::kSize / kPointerSize, kPointerSize)); |
+ CHECK(bitmap->AllBitsClearInRange(0, Bitmap::kBitsPerCell * 3)); |
+ bitmap->SetRange(0, Bitmap::kBitsPerCell * 3); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[0], 0xffffffff); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[1], 0xffffffff); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[2], 0xffffffff); |
+ CHECK(bitmap->AllBitsSetInRange(0, Bitmap::kBitsPerCell * 3)); |
+ bitmap->ClearRange(Bitmap::kBitsPerCell / 2, Bitmap::kBitsPerCell); |
+ bitmap->ClearRange(Bitmap::kBitsPerCell, |
+ Bitmap::kBitsPerCell + Bitmap::kBitsPerCell / 2); |
+ bitmap->ClearRange(Bitmap::kBitsPerCell * 2 + 8, |
+ Bitmap::kBitsPerCell * 2 + 16); |
+ bitmap->ClearRange(Bitmap::kBitsPerCell * 2 + 24, Bitmap::kBitsPerCell * 3); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[0], 0xffff); |
+ CHECK(bitmap->AllBitsSetInRange(0, Bitmap::kBitsPerCell / 2)); |
+ CHECK(bitmap->AllBitsClearInRange(Bitmap::kBitsPerCell / 2, |
+ Bitmap::kBitsPerCell)); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[1], 0xffff0000); |
+ CHECK( |
+ bitmap->AllBitsSetInRange(Bitmap::kBitsPerCell + Bitmap::kBitsPerCell / 2, |
+ 2 * Bitmap::kBitsPerCell)); |
+ CHECK(bitmap->AllBitsClearInRange( |
+ Bitmap::kBitsPerCell, Bitmap::kBitsPerCell + Bitmap::kBitsPerCell / 2)); |
+ CHECK_EQ(reinterpret_cast<uint32_t*>(bitmap)[2], 0xff00ff); |
+ CHECK(bitmap->AllBitsSetInRange(2 * Bitmap::kBitsPerCell, |
+ 2 * Bitmap::kBitsPerCell + 8)); |
+ CHECK(bitmap->AllBitsClearInRange(2 * Bitmap::kBitsPerCell + 24, |
+ Bitmap::kBitsPerCell * 3)); |
+ free(bitmap); |
+} |
} // namespace internal |
} // namespace v8 |