Skip to content

Clear karaxEvents after detaching handlers to stop per-redraw closure leak - #303

Merged
Araq merged 1 commit into
karaxnim:masterfrom
martin-c:fix-event-handler-leak-302
Jul 12, 2026
Merged

Clear karaxEvents after detaching handlers to stop per-redraw closure leak#303
Araq merged 1 commit into
karaxnim:masterfrom
martin-c:fix-event-handler-leak-302

Conversation

@martin-c

Copy link
Copy Markdown
Contributor

Fixes #302

removeAllEventHandlers detaches each handler recorded in the node's
karaxEvents bookkeeping array (added in the #139 fix) but never empties
the array, while addEventShell appends on every attach. Since
updateElement runs mergeEvents for every visited event-carrying node on
every redraw, each such node accumulates one wrapped-handler tuple per
redraw, forever:

  • memory: every leaked closure pins its render generation's entire
    VNode tree via wrapEvent's captured n;
  • CPU: the detach loop re-walks the ever-growing array on every redraw.

The fix resets the array after detaching. One line, plus a regression case
in tests/difftest.nim (runs in the existing nim js -d:nodejs -r tests/difftest.nim CI step): it drives mergeEvents 10× against a stub
event target and asserts karaxEvents doesn't grow. On unpatched master it
fails with "karaxEvents grew to 11 entries after 10 event re-merges";
with the fix the suite passes.

… leak

removeAllEventHandlers called removeEventListener for each recorded
handler but never emptied the karaxEvents bookkeeping array, so every
re-attach cycle (mergeEvents, once per event-carrying node per redraw)
appended another wrapped-handler tuple forever. Each leaked closure pins
its render generation's whole VNode tree via wrapEvent's captured n, and
the detach loop re-walks the growing array on every redraw.

Adds a regression case to tests/difftest.nim driving mergeEvents 10x
against a stub event target: karaxEvents must not grow.

Fixes karaxnim#302
@Araq
Araq merged commit fa5fdef into karaxnim:master Jul 12, 2026
1 check passed
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.

Handler closure leaks per redraw per event-carrying node

2 participants