jsFreeRuntime function
Implementation
void jsFreeRuntime(Pointer<JSRuntime> rt) {
final referenceleak = <String>[];
// Keep [runtimeOpaques] until after ref cleanup so nested [destroy]/[free]
// can still [removeRef] (e.g. Future resolve/reject held by _DartObject).
final opaque = runtimeOpaques[rt];
if (opaque != null) {
while (true) {
JSRef? ref;
for (final candidate in opaque._ref.values) {
if (candidate is JSRefLeakable) {
ref = candidate;
break;
}
}
if (ref == null) break;
ref.destroy();
}
while (opaque._ref.isNotEmpty) {
final ref = opaque._ref.values.first;
final objStrs = ref.toString().split('\n');
final objStr = objStrs.isNotEmpty ? objStrs[0] + " ..." : objStrs[0];
referenceleak.add(
" ${identityHashCode(ref)}\t${ref._refCount + 1}\t${ref.runtimeType.toString()}\t$objStr",
);
ref.destroy();
}
runtimeOpaques.remove(rt);
}
_jsFreeRuntime(rt);
if (referenceleak.isNotEmpty) {
throw ('reference leak:\n ADDR\tREF\tTYPE\tPROP\n' +
referenceleak.join('\n'));
}
}