fix(env): improve Environment::set scope resolution (partial)
Fixed:
- Environment::set now properly searches ancestor chain before creating new binding
- Added exists_in_chain_locked() helper for explicit existence checking
- Simple {} blocks now correctly update outer scope variables
Verified Working:
- local x = 10; { x = 42 }; print(x) → prints 42 ✅
Still Broken:
- else blocks don't update outer scope variables
- local x = 10; if flag { x = 99 } else { x = 42 }; print(x) → prints 10 ❌
Root Cause Identified:
- Issue is in MIR Builder (compile-time), not Environment (runtime)
- src/mir/builder/if_form.rs:108 resets variable_map before else block
- PHI generation at merge doesn't use else_var_map_end correctly
- MIR shows: phi [%32, bb1], [%1, bb2] where %1 is original value, not else value
Next: Fix else block variable merging in if_form.rs
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bash
|
||||
set -uo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
ROOT_DIR="$(cd "$SCRIPT_DIR/../../../../../.." && pwd)"
|
||||
source "$ROOT_DIR/tools/smokes/v2/lib/test_runner.sh" || true
|
||||
source "$ROOT_DIR/tools/smokes/v2/lib/result_checker.sh" || true
|
||||
|
||||
require_env || { echo "[SKIP] env not ready"; exit 0; }
|
||||
|
||||
test_vm_llvm_scope_assign() {
|
||||
local code='static box Main { method main(args) { local x = 0 { if (1==1) { x = 42 } } return x } }'
|
||||
# Stage-3 parse is required for `local`
|
||||
NYASH_PARSER_STAGE3=1 check_parity -c "$code" "vm_llvm_scope_assign"
|
||||
}
|
||||
|
||||
run_test "vm_llvm_scope_assign" test_vm_llvm_scope_assign
|
||||
Reference in New Issue
Block a user