| Index: test/cctest/test-heap.cc
|
| diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
|
| index aa5fe59bd991b9dc7f9016fa5bfcde49f803d03f..a23ee171f2a556bdf5116639f8bc58ceb0bdccd2 100644
|
| --- a/test/cctest/test-heap.cc
|
| +++ b/test/cctest/test-heap.cc
|
| @@ -1216,7 +1216,7 @@ TEST(TestInternalWeakListsTraverseWithGC) {
|
| TEST(TestSizeOfObjectsVsHeapIteratorPrecision) {
|
| InitializeVM();
|
| intptr_t size_of_objects_1 = Heap::SizeOfObjects();
|
| - HeapIterator iterator(HeapIterator::kPreciseFiltering);
|
| + HeapIterator iterator(HeapIterator::kFilterFreeListNodes);
|
| intptr_t size_of_objects_2 = 0;
|
| for (HeapObject* obj = iterator.next();
|
| obj != NULL;
|
| @@ -1240,3 +1240,65 @@ TEST(TestSizeOfObjectsVsHeapIteratorPrecision) {
|
| CHECK_GT(size_of_objects_2 / 100, delta);
|
| }
|
| }
|
| +
|
| +
|
| +class HeapIteratorTestHelper {
|
| + public:
|
| + HeapIteratorTestHelper(Object* a, Object* b)
|
| + : a_(a), b_(b), a_found_(false), b_found_(false) {}
|
| + bool a_found() { return a_found_; }
|
| + bool b_found() { return b_found_; }
|
| + void IterateHeap(HeapIterator::HeapObjectsFiltering mode) {
|
| + HeapIterator iterator(mode);
|
| + for (HeapObject* obj = iterator.next();
|
| + obj != NULL;
|
| + obj = iterator.next()) {
|
| + if (obj == a_)
|
| + a_found_ = true;
|
| + else if (obj == b_)
|
| + b_found_ = true;
|
| + }
|
| + }
|
| + private:
|
| + Object* a_;
|
| + Object* b_;
|
| + bool a_found_;
|
| + bool b_found_;
|
| +};
|
| +
|
| +TEST(HeapIteratorFilterUnreachable) {
|
| + InitializeVM();
|
| + v8::HandleScope scope;
|
| + CompileRun("a = {}; b = {};");
|
| + v8::Handle<Object> a(Top::context()->global()->GetProperty(
|
| + *Factory::LookupAsciiSymbol("a"))->ToObjectChecked());
|
| + v8::Handle<Object> b(Top::context()->global()->GetProperty(
|
| + *Factory::LookupAsciiSymbol("b"))->ToObjectChecked());
|
| + CHECK_NE(*a, *b);
|
| + {
|
| + HeapIteratorTestHelper helper(*a, *b);
|
| + helper.IterateHeap(HeapIterator::kFilterUnreachable);
|
| + CHECK(helper.a_found());
|
| + CHECK(helper.b_found());
|
| + }
|
| + CHECK(Top::context()->global()->DeleteProperty(
|
| + *Factory::LookupAsciiSymbol("a"), JSObject::FORCE_DELETION));
|
| + // We ensure that GC will not happen, so our raw pointer stays valid.
|
| + AssertNoAllocation no_alloc;
|
| + Object* a_saved = *a;
|
| + a.Clear();
|
| + // Verify that "a" object still resides in the heap...
|
| + {
|
| + HeapIteratorTestHelper helper(a_saved, *b);
|
| + helper.IterateHeap(HeapIterator::kNoFiltering);
|
| + CHECK(helper.a_found());
|
| + CHECK(helper.b_found());
|
| + }
|
| + // ...but is now unreachable.
|
| + {
|
| + HeapIteratorTestHelper helper(a_saved, *b);
|
| + helper.IterateHeap(HeapIterator::kFilterUnreachable);
|
| + CHECK(!helper.a_found());
|
| + CHECK(helper.b_found());
|
| + }
|
| +}
|
|
|