feat(joinir): Phase 34-6 MethodCall 構造と本物の substring 意味論
**Phase 34-6 実装完了**: MethodCall 構造を JoinIR に追加し、本物の substring
呼び出しを通すことに成功。
## 主要変更
### 1. MethodCall 構造追加 (34-6.1)
- `src/mir/join_ir/mod.rs`: JoinInst::MethodCall バリアント (+8 lines)
- 構造: `{ dst, receiver, method, args }`
- 設計原則: JoinIR は構造のみ、意味論は MIR レベル
### 2. extract_value 更新 (34-6.2)
- `src/mir/join_ir/frontend/ast_lowerer.rs`: Method 処理本物化 (+37 lines)
- receiver/args を extract_value で再帰処理
- ダミー Const(0) 削除 → 本物の MethodCall 生成
- cond 処理修正: ValueId(0) ハードコード → extract_value で取得
### 3. JoinIR→MIR 変換実装 (34-6.3)
- `src/mir/join_ir_vm_bridge.rs`: MethodCall → BoxCall 変換 (+12 lines)
- `src/mir/join_ir/json.rs`: MethodCall JSON シリアライゼーション (+16 lines)
- `src/mir/join_ir_runner.rs`: MethodCall 未対応エラー (+7 lines)
### 4. テスト更新 (34-6.4)
- `docs/.../fixtures/json_shape_read_value.program.json`: 本物の substring 構造
- `src/tests/joinir_frontend_if_select.rs`: run_joinir_via_vm 使用
- テスト成功: v="hello", at=3 → "hel" ✅
## 成果
- ✅ テスト全通過(1 passed; 0 failed)
- ✅ 設計原則確立: JoinIR = 構造 SSOT、意味論 = MIR レベル
- ✅ Phase 33-10 原則との整合性: Method でも同じ原則適用
**ドキュメント更新**: CURRENT_TASK.md + TASKS.md(Phase 34-6 完了記録)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -33,6 +33,9 @@ pub mod verify;
|
||||
// Phase 30.x: JSON serialization (jsonir v0)
|
||||
pub mod json;
|
||||
|
||||
// Phase 34-1: Frontend (AST→JoinIR) — skeleton only
|
||||
pub mod frontend;
|
||||
|
||||
// Re-export lowering functions for backward compatibility
|
||||
pub use lowering::{
|
||||
lower_funcscanner_trim_to_joinir, lower_min_loop_to_joinir, lower_skip_ws_to_joinir,
|
||||
@ -162,6 +165,17 @@ impl JoinFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/// Phase 33-6: 複数変数を merge する if/else のペア
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct MergePair {
|
||||
/// merge 先の変数
|
||||
pub dst: VarId,
|
||||
/// then 分岐での値
|
||||
pub then_val: VarId,
|
||||
/// else 分岐での値
|
||||
pub else_val: VarId,
|
||||
}
|
||||
|
||||
/// JoinIR 命令セット(最小版)
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum JoinInst {
|
||||
@ -185,7 +199,7 @@ pub enum JoinInst {
|
||||
/// ルート関数 or 上位への戻り
|
||||
Ret { value: Option<VarId> },
|
||||
|
||||
/// Phase 33: If/Else の単純な値選択
|
||||
/// Phase 33: If/Else の単純な値選択(単一値)
|
||||
/// cond が true なら then_val、false なら else_val を dst に代入
|
||||
Select {
|
||||
dst: VarId,
|
||||
@ -194,6 +208,25 @@ pub enum JoinInst {
|
||||
else_val: VarId,
|
||||
},
|
||||
|
||||
/// Phase 33-6: If/Else の複数変数 merge
|
||||
/// cond が true なら各 dst に then_val を、false なら else_val を代入
|
||||
/// 複数の PHI ノードを一括で表現する
|
||||
IfMerge {
|
||||
cond: VarId,
|
||||
merges: Vec<MergePair>,
|
||||
k_next: Option<JoinContId>,
|
||||
},
|
||||
|
||||
/// Phase 34-6: メソッド呼び出し構造
|
||||
/// receiver.method(args...) の構造を JoinIR で表現
|
||||
/// 意味論(BoxCall/Call への変換)は JoinIR→MIR ブリッジで実装
|
||||
MethodCall {
|
||||
dst: VarId,
|
||||
receiver: VarId,
|
||||
method: String,
|
||||
args: Vec<VarId>,
|
||||
},
|
||||
|
||||
/// それ以外の演算は、現行 MIR の算術/比較/boxcall を再利用
|
||||
Compute(MirLikeInst),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user