Index: test/cctest/wasm/test-managed.cc |
diff --git a/test/cctest/wasm/test-managed.cc b/test/cctest/wasm/test-managed.cc |
index 00b1c9bb579bbca86e24a57d4660adfe9ed6ac4a..1ad39743d25b91cce66c31cdcbb39c35bda08990 100644 |
--- a/test/cctest/wasm/test-managed.cc |
+++ b/test/cctest/wasm/test-managed.cc |
@@ -20,6 +20,9 @@ class DeleteRecorder { |
*deleted_ = false; |
} |
~DeleteRecorder() { *deleted_ = true; } |
+ static void Deleter(void* value) { |
+ delete reinterpret_cast<DeleteRecorder*>(value); |
+ } |
private: |
bool* deleted_; |
@@ -27,18 +30,50 @@ class DeleteRecorder { |
TEST(ManagedCollect) { |
Isolate* isolate = CcTest::InitIsolateOnce(); |
- bool deleted = false; |
- DeleteRecorder* d = new DeleteRecorder(&deleted); |
- |
+ bool deleted1 = false; |
+ bool deleted2 = false; |
+ DeleteRecorder* d1 = new DeleteRecorder(&deleted1); |
+ DeleteRecorder* d2 = new DeleteRecorder(&deleted2); |
+ Isolate::ManagedLifeline* list_node = |
+ isolate->AddManagedObject(d2, DeleteRecorder::Deleter); |
{ |
HandleScope scope(isolate); |
- auto handle = Managed<DeleteRecorder>::New(isolate, d); |
+ auto handle = Managed<DeleteRecorder>::New(isolate, d1); |
USE(handle); |
} |
CcTest::CollectAllAvailableGarbage(); |
- CHECK(deleted); |
+ CHECK(deleted1); |
+ CHECK(!deleted2); |
+ // we need to delete the node here, because the bools are allocated on the |
+ // stack. |
+ delete list_node; |
+} |
+ |
+TEST(DisposeCollect) { |
+ v8::Isolate::CreateParams create_params; |
+ create_params.array_buffer_allocator = |
+ CcTest::InitIsolateOnce()->array_buffer_allocator(); |
+ |
+ v8::Isolate* isolate = v8::Isolate::New(create_params); |
+ isolate->Enter(); |
+ Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
+ bool deleted1 = false; |
+ bool deleted2 = false; |
+ DeleteRecorder* d1 = new DeleteRecorder(&deleted1); |
+ DeleteRecorder* d2 = new DeleteRecorder(&deleted2); |
+ { |
+ HandleScope scope(i_isolate); |
+ auto handle = Managed<DeleteRecorder>::New(i_isolate, d1); |
+ USE(handle); |
+ } |
+ i_isolate->AddManagedObject(d2, DeleteRecorder::Deleter); |
+ |
+ isolate->Exit(); |
+ isolate->Dispose(); |
+ CHECK(deleted1); |
+ CHECK(deleted2); |
} |
TEST(ManagedCollectNoDelete) { |
@@ -48,7 +83,7 @@ TEST(ManagedCollectNoDelete) { |
{ |
HandleScope scope(isolate); |
- auto handle = Managed<DeleteRecorder>::New(isolate, d, false); |
+ auto handle = Managed<DeleteRecorder>::NewForTesting(isolate, d); |
USE(handle); |
} |