Conversation
nim ic
There was a problem hiding this comment.
Pull request overview
This PR fixes a crash in the NIF-based incremental compilation workflow (used by nim ic via the nim m / nim nifc steps) by properly persisting and reloading enum-to-string procs through the NIF index, and adds a regression test covering object variants.
Changes:
- Serialize
EnumToStrEntrylog entries into NIF (ast2nif.nim) so enum-to-string procs are recorded in module NIFs. - Load
EnumToStrEntryentries from the NIF index into the module graph and makegetToStringProcfall back to key-based lookup (modulegraphs.nim). - Add an
icregression test for enum discriminants in case objects (tests/ic/tenum.nim).
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| tests/ic/tenum.nim | Regression test reproducing the enum/case-object scenario that previously crashed under nim ic. |
| compiler/modulegraphs.nim | Adds a key-based cache for enum-to-string procs loaded from NIF and uses it as a fallback in getToStringProc. |
| compiler/ast2nif.nim | Implements writing EnumToStrEntry into the NIF output so it can be restored later. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| if result == nil and g.config.cmd in {cmdNifC, cmdM}: | ||
| let key = typeKey(t, g.config, loadTypeCallback, loadSymCallback) | ||
| result = g.loadedEnumToStringProcs.getOrDefault(key) | ||
| assert result != nil |
|
There is an error |
I find the cause of it => #25619 |
|
Thanks for your hard work on this PR! Hint: mm: orc; opt: speed; options: -d:release |
…types for `nim ic` (#25621) fixes #25620 This pull request includes a fix to the type key generation logic in the compiler and updates to a test file to cover additional language features. The most important changes are summarized below: ### Compiler logic fix * In `compiler/typekeys.nim`, the `typeKey` procedure was updated to iterate over all elements in `t.sonsImpl` starting from index 0 instead of 1, ensuring that all type sons are considered during type key generation. ### Test suite improvements * The test file `tests/ic/tenum.nim` was renamed to `tests/ic/tmiscs.nim`, and its output expectations were updated to reflect the new test cases. * Added new test cases to `tests/ic/tmiscs.nim` to cover sink and move semantics, including the definition of a `BigObj` type and a `consume` procedure that demonstrates moving and consuming large objects. ```nim # Sink and move semantics type BigObj = object data: seq[int] proc consume(x: sink BigObj) = echo x.data.len var b = BigObj(data: @[1, 2, 3, 4, 5]) consume(move b) ``` gives ``` error: passing 'tySequence__qwqHTkRvwhrRyENtudHQ7g' (aka 'struct tySequence__qwqHTkRvwhrRyENtudHQ7g') to parameter of incompatible type 'tySequence__cTyVHeHOWk5jStsToosJ8Q' (aka 'struct tySequence__cTyVHeHOWk5jStsToosJ8Q') 84 | eqdestroy___sysma2dyk_u75((*dest_p0).data); ``` follows up #25614
gives
unhandled exception: key not found: (module: 68, item: 3) [KeyError]