From 46259cd0b82455c6a97dc7a70198f842c4ef02ff Mon Sep 17 00:00:00 2001 From: Ryan McConnell Date: Fri, 5 Jun 2026 10:37:00 -0400 Subject: [PATCH] fix sortVTableDispatchers KeyError on re-entrant method registration via when isMainModule (#25856) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- compiler/vtables.nim | 2 ++ tests/method/mvtables_reentry_a.nim | 5 +++++ tests/method/mvtables_reentry_b.nim | 7 +++++++ tests/method/tvtable_reentry.nim | 19 +++++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 tests/method/mvtables_reentry_a.nim create mode 100644 tests/method/mvtables_reentry_b.nim create mode 100644 tests/method/tvtable_reentry.nim diff --git a/compiler/vtables.nim b/compiler/vtables.nim index 9274aa103e..5b05daa868 100644 --- a/compiler/vtables.nim +++ b/compiler/vtables.nim @@ -152,6 +152,8 @@ proc sortVTableDispatchers*(g: ModuleGraph) = rootItemIdCount.inc(baseType.itemId) for idx in 0..