Scope Tables clone resolution to current table#966
Merged
GregHib merged 1 commit intoGregHib:mainfrom Apr 30, 2026
Merged
Conversation
readTableRow resolved `clone = "rowId"` via a global firstOrNull over
every row in every loaded table, keyed by `stringId.substringAfterLast('.')`.
Two tables defining a row with the same trailing name (e.g. spells.bind
and spell_projectiles.bind) silently collide; the winner is whichever
file Files.newDirectoryStream returns first, which is FS-dependent and
varies between machines. When the wrong row wins, copying its smaller
data array into the larger template throws AIOOBE during boot.
Replace the global scan with an O(1) lookup of "table.rowId" against
the existing `ids` map. The error message at this site already promises
table-scoped semantics ("not found in table '\$key'"); this just makes
the implementation match.
Adds a regression test that loads two tables sharing rowId "row" and
verifies the clone resolves to the same-table source. Without the fix
the test fails with AIOOBE, matching the production crash.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GregHib
approved these changes
Apr 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
readTableRowresolvedclone = "rowId"against a global cross-table list, returning the first match by trailing name. Two tables with a same-named row (e.g.spells.bind/spell_projectiles.bind) collided;Files.newDirectoryStreamorder picked the winner, so boot succeeded or ArrayIndexOutOfBoundsException depending on the host filesystem.ids["$table.$rowId"]lookup, restoring the intra-table semantics the existing error message already promised.Test plan
./gradlew :engine:testgreen (existingTest loading a tablestill passes; newClone resolves within own table when rowId collides across tablespasses)../gradlew :game:compileKotlinclean.