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:
@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user