Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index df502cb177e6d8ee103668a80c57c6c689f01bd3..ef281167af4bb354f39f6e6911e64d9628c78209 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -14223,6 +14223,30 @@ THREADED_TEST(DataView) { |
} |
+THREADED_TEST(SkipArrayBufferBackingStoreDuringGC) { |
+ const int kSize = 64; |
+ |
+ LocalContext env; |
+ v8::Isolate* isolate = env->GetIsolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ |
+ // Make sure the pointer looks like a heap object |
+ uint8_t* store_ptr = reinterpret_cast<uint8_t*>(i::kHeapObjectTag); |
+ |
+ // Create ArrayBuffer with pointer-that-cannot-be-visited in the backing store |
+ Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, store_ptr, 8); |
+ |
+ // Should not crash |
+ CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
+ CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
+ CcTest::heap()->CollectAllGarbage(); |
+ CcTest::heap()->CollectAllGarbage(); |
+ |
+ // Should not move the pointer |
+ CHECK_EQ(ab->GetContents().Data(), store_ptr); |
+} |
+ |
+ |
THREADED_TEST(SharedUint8Array) { |
i::FLAG_harmony_sharedarraybuffer = true; |
TypedArrayTestHelper<uint8_t, v8::Uint8Array, i::FixedUint8Array, |