@@ -14,6 +14,7 @@ using v8::Context;
1414using v8::EscapableHandleScope;
1515using v8::FinalizationGroup;
1616using v8::Function;
17+ using v8::Global;
1718using v8::HandleScope;
1819using v8::Isolate;
1920using v8::Local;
@@ -77,13 +78,39 @@ static MaybeLocal<Value> PrepareStackTraceCallback(Local<Context> context,
7778 return result;
7879}
7980
81+ class FinalizationGroupCleanupTask final {
82+ public:
83+ FinalizationGroupCleanupTask (Environment* env, Local<FinalizationGroup> group)
84+ : env_(env), group_(env->isolate (), group) {}
85+
86+ inline Environment* env () { return env_; }
87+ inline Local<FinalizationGroup> group () {
88+ return group_.Get (env_->isolate ());
89+ }
90+
91+ private:
92+ Environment* env_;
93+ Global<FinalizationGroup> group_;
94+ };
95+
96+ void HostCleanupFinalizationGroupMicrotask (void * data) {
97+ FinalizationGroupCleanupTask* t =
98+ reinterpret_cast <FinalizationGroupCleanupTask*>(data);
99+ TryCatchScope try_catch (t->env ());
100+ if (!FinalizationGroup::Cleanup (t->group ()).FromMaybe (false )) {
101+ TriggerUncaughtException (t->env ()->isolate (), try_catch);
102+ }
103+ }
104+
80105static void HostCleanupFinalizationGroupCallback (
81106 Local<Context> context, Local<FinalizationGroup> group) {
82107 Environment* env = Environment::GetCurrent (context);
83108 if (env == nullptr ) {
84109 return ;
85110 }
86- env->RegisterFinalizationGroupForCleanup (group);
111+ env->isolate ()->EnqueueMicrotask (
112+ HostCleanupFinalizationGroupMicrotask,
113+ new FinalizationGroupCleanupTask (env, group));
87114}
88115
89116void * NodeArrayBufferAllocator::Allocate (size_t size) {
0 commit comments