feat(loop-phi): Add body-local variable PHI generation for Rust AST loops
Phase 25.1c/k: Fix ValueId undefined errors in loops with body-local variables **Problem:** - FuncScannerBox.scan_all_boxes/1 and BreakFinderBox._find_loops/2 had ValueId undefined errors for variables declared inside loop bodies - LoopFormBuilder only generated PHIs for preheader variables, missing body-locals - Example: `local ch = s.substring(i, i+1)` inside loop → undefined on next iteration **Solution:** 1. **Rust AST path** (src/mir/loop_builder.rs): - Detect body-local variables by comparing body_end_vars vs current_vars - Generate empty PHI nodes at loop header for body-local variables - Seal PHIs with latch + continue snapshot inputs after seal_phis() - Added HAKO_LOOP_PHI_TRACE=1 logging for debugging 2. **JSON v0 path** (already fixed in previous session): - src/runner/json_v0_bridge/lowering/loop_.rs handles body-locals - Uses same strategy but for JSON v0 bridge lowering **Results:** - ✅ FuncScannerBox.scan_all_boxes: 41 body-local PHIs generated - ✅ Main.main (demo harness): 23 body-local PHIs generated - ⚠️ Still some ValueId undefined errors remaining (exit PHI issue) **Files changed:** - src/mir/loop_builder.rs: body-local PHI generation logic - lang/src/compiler/entry/func_scanner.hako: debug logging - /tmp/stageb_funcscan_demo.hako: test harness 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -4,7 +4,7 @@
|
||||
// Scope: method <name>(params) { ... } outside of main (same box Main)
|
||||
// Output: [{"name":"<name>","params":[...],"body_json":"<Program JSON>","box":"Main"}]
|
||||
|
||||
using lang.compiler.parser.box as ParserBox
|
||||
using "lang.compiler.parser.box" as ParserBox
|
||||
|
||||
static box FuncScannerBox {
|
||||
// Scan source for method definitions (excluding Main.main)
|
||||
@ -19,6 +19,8 @@ static box FuncScannerBox {
|
||||
local defs = new ArrayBox()
|
||||
local s = "" + source
|
||||
local n = s.length()
|
||||
// DEBUG: 一時的に常時トレースを有効化(Stage‑B fib 用の挙動観測)
|
||||
print("[funcscan/scan_all_boxes] source_len=" + ("" + n))
|
||||
local i = 0
|
||||
local in_str = 0
|
||||
local esc = 0
|
||||
@ -55,6 +57,13 @@ static box FuncScannerBox {
|
||||
if ch2 == "*" { in_block = 1 i = i + 2 continue }
|
||||
}
|
||||
|
||||
// DEBUG: "box" キーワード候補をチェック(Stage‑B fib 用)
|
||||
if i + 3 <= n {
|
||||
local candidate = s.substring(i, i + 3)
|
||||
if candidate == "box" {
|
||||
print("[funcscan/box_candidate] i=" + ("" + i) + " candidate=" + candidate)
|
||||
}
|
||||
}
|
||||
if s.substring(i, i + 3) == "box" && me._kw_boundary_before(s, i) == 1 && me._kw_boundary_after(s, i + 3) == 1 {
|
||||
local cursor = i + 3
|
||||
cursor = me._skip_whitespace(s, cursor)
|
||||
|
||||
Reference in New Issue
Block a user