feat(joinir): S-5.2-improved - VM完全意味論統合完了

Phase 27-shortterm S-5.2-improved 実装完了:

## 実装内容
1. **execute_box_call() ラッパー追加**:
   - src/backend/mir_interpreter/mod.rs に公開 API 実装
   - 1_000_000 番台レジスタで一時値管理
   - 適切なクリーンアップ処理実装

2. **handle_box_call 可視性変更**:
   - src/backend/mir_interpreter/handlers/boxes.rs を pub に変更
   - JoinIR Runner からアクセス可能に

3. **JoinIR Runner BoxCall 統合**:
   - src/mir/join_ir_runner.rs の BoxCall 処理を書き換え
   - StringBox 直接呼び出し削除
   - VM の execute_box_call 経由に変更
   - JoinValue ↔ VMValue 変換で統合

4. **不要な関数削除**:
   - expect_str(), expect_int(), box_to_join_value() 削除
   - VMValue 変換に一本化

5. **テスト更新**:
   - joinir_runner_standalone.rs: VM インスタンス追加
   - joinir_runner_min.rs: VM 再利用

## 期待される効果
 Void guards 完全対応 (Void.length() → 0)
 PluginBox/InstanceBox 将来対応可能
 VM の完全な BoxCall 意味論統一
 VM 2号機回避(ガードレール設計成功)

## テスト結果
 joinir_runner_standalone_skip_ws ... ok
 joinir_runner_standalone_trim ... ok
 ビルド成功(0エラー)

## 完了タスク
- [x] MirInterpreter::execute_box_call() 実装
- [x] 1_000_000 レジスタ帯域割り当て
- [x] regs クリーンアップ実装
- [x] JoinIR Runner BoxCall 書き換え
- [x] テスト更新&PASS確認

🎉 VM 完全意味論統合完了!
This commit is contained in:
nyash-codex
2025-11-24 08:37:59 +09:00
parent a8555e67d5
commit 98dadf446f
6 changed files with 129 additions and 91 deletions

View File

@ -65,7 +65,9 @@ static box Runner {
let join_module =
lower_skip_ws_to_joinir(&compiled.module).expect("lower_skip_ws_to_joinir failed");
// S-5.2-improved: Reuse VM instance for JoinIR Runner
let join_result = run_joinir_function(
&mut vm,
&join_module,
JoinFuncId::new(0),
&[JoinValue::Str(" abc".to_string())],
@ -126,7 +128,9 @@ static box Runner {
let join_module = lower_funcscanner_trim_to_joinir(&compiled.module)
.expect("lower_funcscanner_trim_to_joinir failed");
// S-5.2-improved: Reuse VM instance for JoinIR Runner
let join_result = run_joinir_function(
&mut vm,
&join_module,
JoinFuncId::new(0),
&[JoinValue::Str(" abc ".to_string())],

View File

@ -60,8 +60,12 @@ fn joinir_runner_standalone_skip_ws() {
let join_module = build_skip_ws_joinir();
// S-5.2-improved: Create MirInterpreter instance for VM integration
let mut vm = crate::backend::mir_interpreter::MirInterpreter::new();
// Test case 1: " abc" → 3
let result = run_joinir_function(
&mut vm,
&join_module,
JoinFuncId::new(0), // entry function
&[JoinValue::Str(" abc".to_string())],
@ -74,6 +78,7 @@ fn joinir_runner_standalone_skip_ws() {
// Test case 2: "" → 0
let result_empty = run_joinir_function(
&mut vm,
&join_module,
JoinFuncId::new(0),
&[JoinValue::Str("".to_string())],
@ -86,6 +91,7 @@ fn joinir_runner_standalone_skip_ws() {
// Test case 3: "abc" → 0
let result_no_ws = run_joinir_function(
&mut vm,
&join_module,
JoinFuncId::new(0),
&[JoinValue::Str("abc".to_string())],
@ -143,8 +149,12 @@ fn joinir_runner_standalone_trim() {
let join_module = build_trim_joinir();
// S-5.2-improved: Create MirInterpreter instance for VM integration
let mut vm = crate::backend::mir_interpreter::MirInterpreter::new();
// Test case 1: " abc " → "abc " (simplified - only leading whitespace)
let result = run_joinir_function(
&mut vm,
&join_module,
JoinFuncId::new(0), // entry function
&[JoinValue::Str(" abc ".to_string())],
@ -157,6 +167,7 @@ fn joinir_runner_standalone_trim() {
// Test case 2: "" → ""
let result_empty = run_joinir_function(
&mut vm,
&join_module,
JoinFuncId::new(0),
&[JoinValue::Str("".to_string())],
@ -169,6 +180,7 @@ fn joinir_runner_standalone_trim() {
// Test case 3: "abc" → "abc"
let result_no_ws = run_joinir_function(
&mut vm,
&join_module,
JoinFuncId::new(0),
&[JoinValue::Str("abc".to_string())],