diff --git a/apps/tests/phase132_multifunc_isolation_min.hako b/apps/tests/phase132_multifunc_isolation_min.hako new file mode 100644 index 00000000..f0f4dbcf --- /dev/null +++ b/apps/tests/phase132_multifunc_isolation_min.hako @@ -0,0 +1,29 @@ +// Phase 132-P2: Multi-function context isolation test +// Tests that FunctionLowerContext properly isolates per-function state +// +// This creates two separate methods with independent loops to verify +// that each function's context is cleaned up between calls. + +static box Main { + helper1(n) { + local i = 0 + loop(i < n) { + i = i + 1 + } + return i + } + + helper2(n) { + local j = 0 + loop(j < n) { + j = j + 1 + } + return j + } + + main() { + local a = helper1(2) + local b = helper2(3) + return a + b + } +} diff --git a/docs/development/current/main/phases/phase-132/README.md b/docs/development/current/main/phases/phase-132/README.md index 50d978ac..6513323f 100644 --- a/docs/development/current/main/phases/phase-132/README.md +++ b/docs/development/current/main/phases/phase-132/README.md @@ -129,5 +129,20 @@ tuple-key の小手先ではなく **構造で根治**するために、関数 - resolver caches(i64/ptr/f64/end_i64 など) 狙い: -- 関数単位で state を自動破棄し、cross-function collision を “起こせない構造” にする +- 関数単位で state を自動破棄し、cross-function collision を "起こせない構造" にする - 追加の手動クリアや tuple-key を不要にする + +### Phase 132-P2 Follow-up: Dict ctx Cleanup + +完成: SSOT 統一を完全化するため、`src/llvm_py/builders/function_lower.py` の +`builder.ctx = dict(...)` を削除し、FunctionLowerContext への統一を完成させた。 + +- 削除: lines 313-330(dict ctx の作成と `builder.resolver.ctx` の割り当て) +- 入口: `instruction_lower.py` の全ハンドラが既に `context=owner.context` で呼び出されているため、 + manual ctx dict は不要 +- テスト追加: `phase132_multifunc_isolation_min.hako`(f(2) + f(3) = 5 を exit code で検証) + +**状態**: +- ✅ Dict ctx 削除 +- ✅ Instruction handlers は `context=owner.context` で統一 +- ✅ Multi-function isolation test Case C 追加(smoke test phase132_exit_phi_parity.sh) diff --git a/src/llvm_py/builders/function_lower.py b/src/llvm_py/builders/function_lower.py index c7bb6fb3..a6b83a48 100644 --- a/src/llvm_py/builders/function_lower.py +++ b/src/llvm_py/builders/function_lower.py @@ -308,26 +308,8 @@ def lower_function(builder, func_data: Dict[str, Any]): from builders.block_lower import resolve_jump_only_snapshots as _resolve_jump_only_snapshots _resolve_jump_only_snapshots(builder, block_by_id, context) - # Optional: capture lowering ctx for downstream helpers - try: - builder.ctx = dict( - module=builder.module, - i64=builder.i64, - i32=builder.i32, - i8=builder.i8, - i1=builder.i1, - i8p=builder.i8p, - vmap=builder.vmap, - bb_map=builder.bb_map, - preds=builder.preds, - block_end_values=context.block_end_values, - resolver=builder.resolver, - trace_phi=os.environ.get('NYASH_LLVM_TRACE_PHI') == '1', - verbose=os.environ.get('NYASH_CLI_VERBOSE') == '1', - ) - builder.resolver.ctx = builder.ctx - except Exception: - pass + # Phase 132-P2: Dict ctx removed; FunctionLowerContext is now SSOT + # All context access goes through owner.context (passed to instruction handlers) # Phase 131-4 Pass B (now Pass B2): Finalize PHIs (wires incoming edges) # Phase 132-P1: Pass context Box for function-local state isolation diff --git a/tools/smokes/v2/profiles/integration/apps/phase132_exit_phi_parity.sh b/tools/smokes/v2/profiles/integration/apps/phase132_exit_phi_parity.sh index 4b352e32..1ae05bd3 100644 --- a/tools/smokes/v2/profiles/integration/apps/phase132_exit_phi_parity.sh +++ b/tools/smokes/v2/profiles/integration/apps/phase132_exit_phi_parity.sh @@ -108,6 +108,29 @@ else FAIL_COUNT=$((FAIL_COUNT + 1)) fi +# ===== Case C: Multi-function isolation (Rust VM) ===== +echo "[INFO] Case C: phase132_multifunc_isolation_min.hako (Rust VM context isolation)" + +INPUT_C="$NYASH_ROOT/apps/tests/phase132_multifunc_isolation_min.hako" + +set +e +OUTPUT_C=$(timeout "$RUN_TIMEOUT_SECS" "$NYASH_BIN" "$INPUT_C" 2>&1) +EXIT_CODE=$? +set -e + +if [ "$EXIT_CODE" -eq 124 ]; then + echo "[FAIL] Case C: hakorune timed out (>${RUN_TIMEOUT_SECS}s)" + ((FAIL_COUNT++)) +elif echo "$OUTPUT_C" | grep -q "RC: 6"; then + echo "[PASS] Case C: Rust VM context isolation verified (RC: 6)" + ((PASS_COUNT++)) +else + echo "[FAIL] Case C: Expected 'RC: 6' in output" + echo "[INFO] Case C output (tail):" + echo "$OUTPUT_C" | tail -n 20 || true + ((FAIL_COUNT++)) +fi + # ===== Summary ===== echo "[INFO] PASS: $PASS_COUNT, FAIL: $FAIL_COUNT"