jsFreeRuntime function

void jsFreeRuntime(
  1. Pointer<JSRuntime> rt
)

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'));
  }
}