Skip to content

Collect WeakMap entries with ephemeron semantics - #582

Open
jluxenberg wants to merge 2 commits into
bellard:masterfrom
jluxenberg:weakmap-ephemeron-gc.2
Open

jluxenberg wants to merge 2 commits into
bellard:masterfrom
jluxenberg:weakmap-ephemeron-gc.2

Conversation

@jluxenberg

Copy link
Copy Markdown

Fixes #581

jluxenberg and others added 2 commits October 27, 2026 15:47
WeakMap values were marked as reachable during gc_scan() regardless of
whether their key was reachable, and entries were only removed once
their key's refcount reached zero before a GC pass. As a result, an
entry whose value references its own key was never collected, and a
chain of N entries (each value referencing the next key) needed N GC
passes to be freed.

gc_scan() now only keeps a weak map value once its key has been found
live, continuing the scan until no new object is kept. The reference
to the values that are not kept is dropped so that they are freed with
the cycles; the records are removed by the next GC as their key is no
longer live.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Checks that a WeakMap entry whose value references its own key, and a
chain of entries where each value references the next key, are freed
by a single GC, and that the value of a live key is kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Collecting WeakMap keys requires multiple GC passes

1 participant