diff options
Diffstat (limited to 'deps/v8/test/cctest/test-managed.cc')
-rw-r--r-- | deps/v8/test/cctest/test-managed.cc | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/deps/v8/test/cctest/test-managed.cc b/deps/v8/test/cctest/test-managed.cc new file mode 100644 index 0000000000..21452b32f8 --- /dev/null +++ b/deps/v8/test/cctest/test-managed.cc @@ -0,0 +1,78 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#include "src/managed.h" + +#include "src/objects-inl.h" +#include "test/cctest/cctest.h" + +using namespace v8::base; +using namespace v8::internal; + +class DeleteRecorder { + public: + explicit DeleteRecorder(bool* deleted) : deleted_(deleted) { + *deleted_ = false; + } + ~DeleteRecorder() { *deleted_ = true; } + static void Deleter(void* value) { + delete reinterpret_cast<DeleteRecorder*>(value); + } + + private: + bool* deleted_; +}; + +TEST(ManagedCollect) { + Isolate* isolate = CcTest::InitIsolateOnce(); + bool deleted1 = false; + bool deleted2 = false; + DeleteRecorder* d1 = new DeleteRecorder(&deleted1); + DeleteRecorder* d2 = new DeleteRecorder(&deleted2); + Isolate::ManagedObjectFinalizer* finalizer = + isolate->RegisterForReleaseAtTeardown(d2, DeleteRecorder::Deleter); + { + HandleScope scope(isolate); + auto handle = Managed<DeleteRecorder>::New(isolate, d1); + USE(handle); + } + + CcTest::CollectAllAvailableGarbage(); + + CHECK(deleted1); + CHECK(!deleted2); + isolate->UnregisterFromReleaseAtTeardown(&finalizer); + CHECK_NULL(finalizer); + delete d2; + CHECK(deleted2); +} + +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->RegisterForReleaseAtTeardown(d2, DeleteRecorder::Deleter); + + isolate->Exit(); + isolate->Dispose(); + CHECK(deleted1); + CHECK(deleted2); +} |