info[0].As<v8::Object>()->ForceSet(info[1], info[2]);
}
+// ================
+// lifecycleTracker
+// ================
+struct LifecycleTrackerWrapper {
+ v8::Global<v8::Object> handle;
+ v8::Global<v8::Function> destructor;
+};
+
void LifecycleTrackerCleanup(
- const v8::WeakCallbackData<v8::Object,
- v8::Persistent<v8::Object> >& data) {
- v8::Isolate* isolate = data.GetIsolate();
- v8::HandleScope handle_scope(isolate);
+ const v8::WeakCallbackInfo<LifecycleTrackerWrapper>& data) {
+ LifecycleTrackerWrapper* wrapper = data.GetParameter();
- v8::Local<v8::Object> tracker = data.GetValue();
- v8::Handle<v8::Value> function =
- tracker->Get(v8::String::NewFromUtf8(isolate, "destructor"));
+ if (!wrapper->destructor.IsEmpty()) {
+ v8::HandleScope handle_scope(data.GetIsolate());
+ v8::Local<v8::Context> context = v8::Context::New(data.GetIsolate());
+ v8::Context::Scope scope(context);
- if (function.IsEmpty() || !function->IsFunction()) {
- LOGGER(WARN) << "Destructor function not set for LifecycleTracker.";
- data.GetParameter()->Reset();
- delete data.GetParameter();
- return;
- }
+ v8::Local<v8::Function> destructor =
+ wrapper->destructor.Get(data.GetIsolate());
- v8::Handle<v8::Context> context = v8::Context::New(isolate);
+ v8::MicrotasksScope microtasks(
+ data.GetIsolate(), v8::MicrotasksScope::kDoNotRunMicrotasks);
- v8::TryCatch try_catch;
- v8::Handle<v8::Function>::Cast(function)->Call(context->Global(), 0, NULL);
- if (try_catch.HasCaught())
- LOGGER(WARN) << "Exception when running LifecycleTracker destructor";
+ v8::TryCatch try_catch(data.GetIsolate());
+ destructor->Call(context->Global(), 0, nullptr);
- data.GetParameter()->Reset();
- delete data.GetParameter();
+ if (try_catch.HasCaught()) {
+ LOGGER(WARN) << "Exception when running LifecycleTracker destructor";
+ }
+ }
}
void LifecycleTracker(const v8::FunctionCallbackInfo<v8::Value>& info) {
- v8::Isolate* isolate = v8::Isolate::GetCurrent();
- v8::HandleScope handle_scope(isolate);
-
- v8::Persistent<v8::Object>* tracker =
- new v8::Persistent<v8::Object>(isolate, v8::Object::New(isolate));
- tracker->SetWeak(tracker, &LifecycleTrackerCleanup);
-
- info.GetReturnValue().Set(*tracker);
+ v8::Isolate* isolate = info.GetIsolate();
+ v8::HandleScope handle_scope(info.GetIsolate());
+
+ v8::Local<v8::Object> tracker = v8::Object::New(isolate);
+ LifecycleTrackerWrapper* wrapper = new LifecycleTrackerWrapper;
+ wrapper->handle.Reset(isolate, tracker);
+ wrapper->handle.SetWeak(wrapper, LifecycleTrackerCleanup,
+ v8::WeakCallbackType::kParameter);
+ info.GetReturnValue().Set(wrapper->handle);
}
} // namespace