Phase 25.1b: VM undefined-value diagnostics and builder SSA helpers

This commit is contained in:
nyash-codex
2025-11-17 03:19:03 +09:00
parent 4b078e6df9
commit 82b6c4e834
12 changed files with 231 additions and 41 deletions

View File

@ -40,19 +40,24 @@ Status: Step0〜3 実装済み・Step4Method/Extern実装フェーズ
#### StageB と selfhost CLI canaryHakoCli.run/2の現状
- selfhost CLI の最小ケース(`tools/smokes/v2/profiles/quick/core/phase251/selfhost_cli_run_basic_vm.sh` が生成する HakoCli.run サンプル)に対しては、現状 StageB 実行中に VM エラー:
- `❌ VM error: Invalid value: use of undefined value ValueId(N)` が発生し、Program(JSON v0) が 1 行としては出力されな`tools/hakorune_emit_mir.sh` が Program 抽出に失敗する)。
- `NYASH_VM_VERIFY_MIR=1` を立てて `lang/src/compiler/entry/compiler_stageb.hako` を直接叩くと、StageB が生成した MIR に対して:
- selfhost CLI の最小ケース(`tools/smokes/v2/profiles/quick/core/phase251/selfhost_cli_run_basic_vm.sh` が生成する HakoCli.run サンプル)に対しては、修正前は StageB 実行中に VM エラー:
- `❌ VM error: Invalid value: use of undefined value ValueId(N)`%0 / 97842 / 22 など)が発生し、Program(JSON v0) が 1 行としては出力されなかった`tools/hakorune_emit_mir.sh` が Program 抽出に失敗する)。
- `NYASH_VM_VERIFY_MIR=1` を立てて `lang/src/compiler/entry/compiler_stageb.hako` を直接叩くと、修正前は StageB が生成した MIR に対して:
- `Stage1UsingResolverBox._collect_using_entries/1`
- `ParserStringUtilsBox.skip_ws/2`
- `ParserIdentScanBox.scan_ident/2`
- `ParserBox.parse_stmt2/2`
- などに `Undefined value %0 used in block ...` が多数報告されることが確認できる(詳細は `docs/private/roadmap/phases/phase-20.33/DEBUG.md` の「Invalid value: use of undefined value ValueId(N)」節を参照)。
- などに `Undefined value %0 used in block ...` が多数報告されていた(詳細は `docs/private/roadmap/phases/phase-20.33/DEBUG.md` の「Invalid value: use of undefined value ValueId(N)」節を参照)。
- Task先生による Rust MIR builder 側の修正ValueId 割り当て統一loop PHI/pinned 変数の扱い修正)後は:
- `%0` / 97842 / 22 に起因する Undefined value / Invalid value エラーは `NYASH_VM_VERIFY_MIR=1` / 実行時ともに解消済み。
- pinned 変数(`__pin$*@recv` など)も loop header/exit で正しく PHI に乗るようになり、ループ後のメソッドレシーバーが未定義になる問題も再現しなくなった。
- 現時点で selfhost CLI サンプルに対して残っている課題は:
- 1) Rust VM 実行時に `❌ VM error: Invalid value: use of undefined value ValueId(17)` が発生しており、拡張済みエラーメッセージ(`fn=Main.main, last_block=Some(BasicBlockId(3419)), last_inst=Some(Call { ... ParserBox.length() [recv: %17] ... })`から「StageB Main.main 内の `ParserBox.length()` 呼び出しにおいて recv スロットValueId(17)) が定義されていない」ことが分かっている。これは verifier がまだチェックしていない「Callee.receiver 側の SSA 漏れ」であり、Phase 25.1c の StageB / LoopBuilder / LocalSSA 整理タスクで修正する前提。
- 2) `if args { ... }` まわりの truthy 判定ArrayBox を boolean 条件に使っている部分)の扱いに起因する型/意味論の揺れが残っており、こちらも 25.1c の型システム整理タスクで `ArrayBox` の truthy 規約を明文化した上で揃える想定。
- 3) `NewBox HakoCli` が plugin 前提で解決されてしまう問題は、VM 側の static box factory 統合(静的 Box を User factory にも広告する)により解消済みであり、`NYASH_DISABLE_PLUGINS=1` でも静的 Box として HakoCli を生成できるようになっているselfhost CLI canary では NewBox 自体はもはやブロッカーではない)。
- 対応方針Phase 25.1b 時点):
- BoxTypeInspector / multicarrier LoopForm 経路とは独立した **StageB/MIR 側の構造バグ** として扱い、selfhost CLI canaryHakoCli.run/2 loweringはこの問題が解消されるまで「StageB 側の既知の未修正バグ」として保留する
- `tools/hakorune_emit_mir.sh` には `diagnose_stageb_failure()` を追加し、StageB の標準出力に `Invalid value: use of undefined value` が含まれている場合に:
- `[stageb/diagnose] VM reported 'use of undefined value' during StageB execution.` などのタグを出しつつ、
- `NYASH_VM_VERIFY_MIR=1``compiler_stageb.hako` 直叩き、および `docs/private/roadmap/phases/phase-20.33/DEBUG.md` への導線を表示するようにした。
- BoxTypeInspector / multicarrier LoopForm 経路とは独立した **StageB/MIR 側の SSA型システムBox 解決の構造問題** として扱い、selfhost CLI canaryHakoCli.run/2 loweringはこれらが片付くまでは「25.1c の構造タスク待ち」として扱う
- `tools/hakorune_emit_mir.sh` `diagnose_stageb_failure()` は維持し、StageB の標準出力に `Invalid value: use of undefined value` が含まれている場合に`NYASH_VM_VERIFY_MIR=1``compiler_stageb.hako` 直叩き、および `docs/private/roadmap/phases/phase-20.33/DEBUG.md` への導線を表示する。加えて、VM 側の `MirInterpreter::reg_load``fn` / `last_block` / `last_inst` を含めてエラー文字列を出すようになったため、StageB 由来の undefined value は「どの関数のどの Callどの recv」で発生しているかを 1 行で特定できる。
### Rust provider (`env.mirbuilder.emit`)