fix(mir): SSA違反修正 & StringBox is_space/starts_with実装

Task A: ローカル変数SSA違反修正
- src/mir/builder/stmts.rs: Copy命令で一意ValueId割り当て
- 元のエラー "Invalid value: use of undefined value" 解決
- using_resolver_box.hako が正常動作確認

Task B: StringBox新メソッド実装
- plugins/nyash-string-plugin: is_space/starts_with追加
- M_IS_SPACE (7), M_STARTS_WITH (8) 実装
- string_helpers.hako仕様に準拠

残存問題: do_break()のunreachableブロック生成
→ 次のコミットで修正予定

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-18 02:32:43 +09:00
parent 4ff9bd4791
commit 4aea27891d
2 changed files with 67 additions and 3 deletions

View File

@ -193,18 +193,32 @@ impl super::MirBuilder {
let mut last_value = None;
for (i, var_name) in variables.iter().enumerate() {
let var_id = if i < initial_values.len() && initial_values[i].is_some() {
// Use initializer's ValueId directly to avoid SSA aliasing/undefined use
// Evaluate the initializer expression
let init_expr = initial_values[i].as_ref().unwrap();
let init_val = self.build_expression(*init_expr.clone())?;
init_val
// FIX: Allocate a new ValueId for this local variable
// and emit a Copy instruction to establish SSA form
let var_id = self.value_gen.next();
self.emit_instruction(crate::mir::MirInstruction::Copy {
dst: var_id,
src: init_val
})?;
// Propagate metadata (type/origin) from initializer to variable
crate::mir::builder::metadata::propagate::propagate(self, init_val, var_id);
var_id
} else {
// Create a concrete register for uninitialized locals (Void)
crate::mir::builder::emission::constant::emit_void(self)
};
self.variable_map.insert(var_name.clone(), var_id);
last_value = Some(var_id);
}
Ok(last_value.unwrap_or_else(|| self.next_value_id()))
Ok(last_value.unwrap_or_else(|| self.value_gen.next()))
}
// Return statement