diff --git a/native_mate/wrappable.cc b/native_mate/wrappable.cc index 005c83b8dc0a..8a284b764459 100644 --- a/native_mate/wrappable.cc +++ b/native_mate/wrappable.cc @@ -17,7 +17,7 @@ WrappableBase::WrappableBase() WrappableBase::~WrappableBase() { if (wrapper_.IsEmpty()) return; - + GetWrapper()->SetAlignedPointerInInternalField(0, nullptr); wrapper_.ClearWeak(); wrapper_.Reset(); @@ -38,7 +38,9 @@ void WrappableBase::InitWith(v8::Isolate* isolate, wrapper->SetAlignedPointerInInternalField(0, this); wrapper_.Reset(isolate, wrapper); wrapper_.SetWeak(this, FirstWeakCallback, v8::WeakCallbackType::kParameter); - wrapper_.MarkIndependent(); + + if (high_memory_) + wrapper_.MarkIndependent(); // Call object._init if we have one. v8::Local init; @@ -48,6 +50,12 @@ void WrappableBase::InitWith(v8::Isolate* isolate, AfterInit(isolate); } +void WrappableBase::MarkHighMemoryUsage() { + high_memory_ = true; + if (!wrapper_.IsEmpty()) + wrapper_.MarkIndependent(); +} + // static void WrappableBase::FirstWeakCallback( const v8::WeakCallbackInfo& data) { diff --git a/native_mate/wrappable_base.h b/native_mate/wrappable_base.h index 17a10fc0d8bc..ba0087fa06d1 100644 --- a/native_mate/wrappable_base.h +++ b/native_mate/wrappable_base.h @@ -46,7 +46,7 @@ class WrappableBase { // Marks wrapped object as high memory usage // Deletes the wrapped object on the first round of GC callbacks - void MarkHighMemoryUsage() { high_memory_ = true; } + virtual void MarkHighMemoryUsage(); private: friend struct internal::Destroyable;