• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "src/objects/managed.h"
6 
7 #include "src/handles/global-handles-inl.h"
8 
9 namespace v8 {
10 namespace internal {
11 
12 namespace {
13 // Called by the GC in its second pass when a Managed<CppType> is
14 // garbage collected.
ManagedObjectFinalizerSecondPass(const v8::WeakCallbackInfo<void> & data)15 void ManagedObjectFinalizerSecondPass(const v8::WeakCallbackInfo<void>& data) {
16   auto destructor =
17       reinterpret_cast<ManagedPtrDestructor*>(data.GetParameter());
18   Isolate* isolate = reinterpret_cast<Isolate*>(data.GetIsolate());
19   isolate->UnregisterManagedPtrDestructor(destructor);
20   int64_t adjustment = 0 - static_cast<int64_t>(destructor->estimated_size_);
21   destructor->destructor_(destructor->shared_ptr_ptr_);
22   delete destructor;
23   data.GetIsolate()->AdjustAmountOfExternalAllocatedMemory(adjustment);
24 }
25 }  // namespace
26 
27 // Called by the GC in its first pass when a Managed<CppType> is
28 // garbage collected.
ManagedObjectFinalizer(const v8::WeakCallbackInfo<void> & data)29 void ManagedObjectFinalizer(const v8::WeakCallbackInfo<void>& data) {
30   auto destructor =
31       reinterpret_cast<ManagedPtrDestructor*>(data.GetParameter());
32   GlobalHandles::Destroy(destructor->global_handle_location_);
33   // We need to do the main work as a second pass callback because
34   // it can trigger garbage collection. The first pass callbacks
35   // are not allowed to invoke V8 API.
36   data.SetSecondPassCallback(&ManagedObjectFinalizerSecondPass);
37 }
38 
39 }  // namespace internal
40 }  // namespace v8
41