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]) {