Skip to content

fix sortVTableDispatchers KeyError on re-entrant method registration via when isMainModule#25856

Open
Graveflo wants to merge 1 commit into
nim-lang:develfrom
Graveflo:vtable_keyerr
Open

fix sortVTableDispatchers KeyError on re-entrant method registration via when isMainModule#25856
Graveflo wants to merge 1 commit into
nim-lang:develfrom
Graveflo:vtable_keyerr

Conversation

@Graveflo
Copy link
Copy Markdown
Contributor

@Graveflo Graveflo commented Jun 1, 2026

Encountered in realistic scenario. Didn't really look at this one. AI one shot it lol

When a module defines method-bearing types and a when isMainModule
block imports additional modules that also define methods on the same
type hierarchy, sortVTableDispatchers crashes with:

Error: unhandled exception: key not found: (module: N, item: M) [KeyError]

Root cause: the itemTable built during vtable sorting is populated
from g.objectTree[baseType], which only contains types from the
current compilation pass. When when isMainModule triggers re-import
of method-bearing modules, the method bucket contains types from both
passes. Types from the first pass have ItemIds not present in the
second pass's object tree, so itemTable[obj.itemId] raises KeyError
at line 155.

Fix: if obj.itemId is missing from itemTable, create an empty slot
array of the correct length. The entry is a local temporary — the
second loop in sortVTableDispatchers only calls setMethodsPerType
for types in the current object tree, so types from the prior pass
retain their already-established dispatch. The entry exists solely to
prevent the KeyError during the assignment loop.

The methodIndexLen used for the new entry is the bucket's slot count,
which is correct for any type in the hierarchy.

Added test tests/method/tvtable_reentry.nim that defines methods
across three types in two compilation passes and verifies dispatch
correctness for all three.

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.

1 participant