// 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 #include #include #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(Isolate::ManagedObjectFinalizer* finalizer) { delete *reinterpret_cast(finalizer); } 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(d2, DeleteRecorder::Deleter); isolate->RegisterForReleaseAtTeardown(&finalizer); { HandleScope scope(isolate); auto handle = Managed::New(isolate, d1); USE(handle); } CcTest::CollectAllAvailableGarbage(); CHECK(deleted1); CHECK(!deleted2); isolate->UnregisterFromReleaseAtTeardown(&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(isolate); bool deleted1 = false; bool deleted2 = false; DeleteRecorder* d1 = new DeleteRecorder(&deleted1); DeleteRecorder* d2 = new DeleteRecorder(&deleted2); { HandleScope scope(i_isolate); auto handle = Managed::New(i_isolate, d1); USE(handle); } Isolate::ManagedObjectFinalizer finalizer(d2, DeleteRecorder::Deleter); i_isolate->RegisterForReleaseAtTeardown(&finalizer); isolate->Exit(); isolate->Dispose(); CHECK(deleted1); CHECK(deleted2); }