From 625d424199340bd54ee13d97fb2d79e74d86451d Mon Sep 17 00:00:00 2001 From: egrs Date: Wed, 11 Mar 2026 07:27:39 +0100 Subject: [PATCH] remove ranges from live list on GC finalization Add a weak finalizer to Range that removes its linked list node from Page._live_ranges when V8 garbage-collects the JS Range object. This prevents the list from growing unboundedly and avoids iterating over stale entries during mutation updates. --- src/browser/webapi/Range.zig | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/browser/webapi/Range.zig b/src/browser/webapi/Range.zig index 66ce1c93..e3b8bc41 100644 --- a/src/browser/webapi/Range.zig +++ b/src/browser/webapi/Range.zig @@ -680,6 +680,10 @@ fn getContainerElement(self: *const Range) ?*Node.Element { return parent.is(Node.Element); } +pub fn deinit(self: *Range, _: bool, page: *Page) void { + page._live_ranges.remove(&self._proto._range_link); +} + pub const JsApi = struct { pub const bridge = js.Bridge(Range); @@ -687,6 +691,8 @@ pub const JsApi = struct { pub const name = "Range"; pub const prototype_chain = bridge.prototypeChain(); pub var class_id: bridge.ClassId = undefined; + pub const weak = true; + pub const finalizer = bridge.finalizer(Range.deinit); }; // Constants for compareBoundaryPoints