From 4ea1e95201d9fe87e322fc91b41652f298606c09 Mon Sep 17 00:00:00 2001 From: nyne Date: Mon, 11 Nov 2024 15:10:44 +0800 Subject: [PATCH] make JSFunction Finalizable --- lib/src/ffi.dart | 7 ++++++- lib/src/object.dart | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/src/ffi.dart b/lib/src/ffi.dart index f667520..f7c8d36 100644 --- a/lib/src/ffi.dart +++ b/lib/src/ffi.dart @@ -27,9 +27,14 @@ abstract class JSRef { _refCount++; } + bool _released = false; + void free() { _refCount--; - if (_refCount < 0) destroy(); + if (_refCount < 0 && !_released){ + _released = true; + destroy(); + } } void destroy(); diff --git a/lib/src/object.dart b/lib/src/object.dart index c81d311..e939489 100644 --- a/lib/src/object.dart +++ b/lib/src/object.dart @@ -150,8 +150,12 @@ class _JSObject extends JSRef { } /// JS function wrapper -class _JSFunction extends _JSObject implements JSInvokable, _IsolateEncodable { - _JSFunction(Pointer ctx, Pointer val) : super(ctx, val); +class _JSFunction extends _JSObject implements JSInvokable, _IsolateEncodable, Finalizable { + _JSFunction(Pointer ctx, Pointer val) : super(ctx, val) { + _finalizer.attach(this, this); + } + + static final _finalizer = Finalizer<_JSFunction>((f) => f.free()); @override invoke(List arguments, [dynamic thisVal]) {