| Index: test/cctest/test-heap.cc
|
| diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
|
| index ac121e059fe9a313e921d656918281da96d105eb..e652282a88d93967732a7549539e699893f7a298 100644
|
| --- a/test/cctest/test-heap.cc
|
| +++ b/test/cctest/test-heap.cc
|
| @@ -4608,6 +4608,46 @@ TEST(Regress388880) {
|
| }
|
|
|
|
|
| +TEST(Regress3631) {
|
| + i::FLAG_expose_gc = true;
|
| + CcTest::InitializeVM();
|
| + v8::HandleScope scope(CcTest::isolate());
|
| + Isolate* isolate = CcTest::i_isolate();
|
| + Heap* heap = isolate->heap();
|
| + IncrementalMarking* marking = CcTest::heap()->incremental_marking();
|
| + v8::Local<v8::Value> result = CompileRun(
|
| + "var weak_map = new WeakMap();"
|
| + "var future_keys = [];"
|
| + "for (var i = 0; i < 50; i++) {"
|
| + " var key = {'k' : i + 0.1};"
|
| + " weak_map.set(key, 1);"
|
| + " future_keys.push({'x' : i + 0.2});"
|
| + "}"
|
| + "weak_map");
|
| + if (marking->IsStopped()) {
|
| + marking->Start();
|
| + }
|
| + // Incrementally mark the backing store.
|
| + Handle<JSObject> obj =
|
| + v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(result));
|
| + Handle<JSWeakCollection> weak_map(reinterpret_cast<JSWeakCollection*>(*obj));
|
| + while (!Marking::IsBlack(
|
| + Marking::MarkBitFrom(HeapObject::cast(weak_map->table()))) &&
|
| + !marking->IsStopped()) {
|
| + marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
|
| + }
|
| + // Stash the backing store in a handle.
|
| + Handle<Object> save(weak_map->table(), isolate);
|
| + // The following line will update the backing store.
|
| + CompileRun(
|
| + "for (var i = 0; i < 50; i++) {"
|
| + " weak_map.set(future_keys[i], i);"
|
| + "}");
|
| + heap->incremental_marking()->set_should_hurry(true);
|
| + heap->CollectGarbage(OLD_POINTER_SPACE);
|
| +}
|
| +
|
| +
|
| #ifdef DEBUG
|
| TEST(PathTracer) {
|
| CcTest::InitializeVM();
|
|
|