feat(joinir): Phase 201-5 Pattern 2 lowerer uses JoinValueSpace

Key changes to prevent ValueId collision between frontend and lowerer:

1. loop_step params now use ConditionEnv ValueIds (Param region: 100+)
   - i_param = env.get(loop_var_name) - ensures condition lowering works
   - carrier_param_ids from CarrierInfo.join_id

2. main() params and intermediate values use alloc_local() (Local region: 1000+)
   - No collision with frontend's param allocations

3. CarrierInfo.join_id is now properly set in frontend
   - carrier.join_id = Some(carrier_join_id) during allocation

This fixes the "use of undefined value" error where frontend allocated
ValueId(100+) but lowerer used ValueId(0+), causing remapper mismatch.

Test results:
- All 821 library tests pass
- E2E: phase200d_capture_minimal.hako outputs 30 ✓
- Pattern 4: loop_continue_pattern4.hako outputs 25 ✓
- Multi-carrier: loop_continue_multi_carrier.hako outputs 100,10 ✓

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-09 18:56:07 +09:00
parent 1af53f82a4
commit 17152bafff
2 changed files with 36 additions and 19 deletions

View File

@ -207,12 +207,14 @@ impl MirBuilder {
}
}
// Phase 201: Allocate carrier ValueIds from Param region
// Phase 201: Allocate carrier ValueIds from Param region and SET join_id
// This ensures carriers are also in the safe Param region
for carrier in &carrier_info.carriers {
let _carrier_join_id = join_value_space.alloc_param();
// CRITICAL: We must set join_id so the lowerer can access it
for carrier in &mut carrier_info.carriers {
let carrier_join_id = join_value_space.alloc_param();
carrier.join_id = Some(carrier_join_id);
eprintln!("[pattern2/phase201] Allocated carrier '{}' param ID: {:?}",
carrier.name, _carrier_join_id);
carrier.name, carrier_join_id);
}
// Phase 191: Create empty body-local environment
@ -396,6 +398,7 @@ impl MirBuilder {
&carrier_updates,
analysis_body, // Phase 191/192: Pass normalized body AST for init lowering
Some(&mut body_local_env), // Phase 191: Pass mutable body-local environment
&mut join_value_space, // Phase 201: Unified ValueId allocation (Local region)
) {
Ok((module, meta)) => (module, meta),
Err(e) => {