feat(phi): Phase 26-E-3 - PhiBuilderOps委譲実装(has-a設計)
Phase 26-E Phase 3 完了: ChatGPT+Claude 合意による委譲設計実装 **設計合意 (ChatGPT + Claude consensus):** - PhiBuilderOps = 低レベル「PHI命令発行」道具箱 - LoopFormOps = 高レベル「ループ構造構築」作業場 - 関係: has-a(委譲) ではなく is-a(継承) - LoopBuilder は両方のインターフェースを個別実装で提供 **実装内容:** 1. LoopFormOps trait 設計コメント更新 - 継承ではなく委譲の設計rationale明記 - 段階的統合方針: If側→Loop側→将来統合 2. LoopBuilder に PhiBuilderOps 委譲実装 (64行) - 委譲パターン: LoopFormOps 既存実装を再利用 - HashSet → Vec 変換 + ソート(決定性保証) - emit_phi: block 引数差を吸収(current_block 設定) - 自己呼び出し回避: <Self as LoopFormOps>::method 明示 **技術的成果:** - 重複コードゼロ: 既存 LoopFormOps 実装に完全委譲 - 決定性保証: pred_vec.sort_by_key(|bb| bb.0) で決定的順序 - シグネチャ差分吸収: PhiBuilderOps/LoopFormOps の違いを吸収 - 破壊的変更なし: 既存コード保護 **委譲実装の利点:** 1. 抽象化レベル分離: 低レベル(PHI発行)と高レベル(ループ構築) 2. 既存コード保護: LoopFormOps 実装は変更なし 3. 段階的統合: If側から先に PhiBuilderOps 安定化 4. テスト容易性: PhiBuilderOps/LoopFormOps それぞれでテスト可能 **関連ファイル:** - src/mir/phi_core/loopform_builder.rs (設計コメント更新) - src/mir/loop_builder.rs (PhiBuilderOps委譲実装, +64行) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -1388,3 +1388,66 @@ impl<'a> LoopFormOps for LoopBuilder<'a> {
|
||||
LoopBuilder::get_variable_at_block(self, name, block)
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 26-E-3: PhiBuilderOps 委譲実装(has-a設計)
|
||||
//
|
||||
// **Design Rationale:**
|
||||
// - PhiBuilderOps = 低レベル「PHI命令発行」道具箱
|
||||
// - LoopFormOps = 高レベル「ループ構造構築」作業場
|
||||
// - 関係: has-a(委譲) - LoopBuilder は両方のインターフェースを提供
|
||||
//
|
||||
// **実装方針:**
|
||||
// - LoopFormOps の既存実装に委譲(重複なし)
|
||||
// - HashSet → Vec 変換 + ソート(決定性保証)
|
||||
// - emit_phi: block 引数差を吸収(current_block 設定)
|
||||
impl<'a> crate::mir::phi_core::phi_builder_box::PhiBuilderOps for LoopBuilder<'a> {
|
||||
fn new_value(&mut self) -> ValueId {
|
||||
// 委譲: LoopFormOps の既存実装を使用
|
||||
<Self as LoopFormOps>::new_value(self)
|
||||
}
|
||||
|
||||
fn emit_phi(
|
||||
&mut self,
|
||||
block: BasicBlockId,
|
||||
dst: ValueId,
|
||||
inputs: Vec<(BasicBlockId, ValueId)>,
|
||||
) -> Result<(), String> {
|
||||
// PhiBuilderOps: block 引数あり
|
||||
// LoopFormOps: block 引数なし(current_block 使用)
|
||||
// 差を吸収: current_block を設定してから LoopFormOps::emit_phi を呼ぶ
|
||||
<Self as LoopFormOps>::set_current_block(self, block)?;
|
||||
<Self as LoopFormOps>::emit_phi(self, dst, inputs)
|
||||
}
|
||||
|
||||
fn update_var(&mut self, name: String, value: ValueId) {
|
||||
// 委譲: LoopFormOps の既存実装を使用
|
||||
<Self as LoopFormOps>::update_var(self, name, value)
|
||||
}
|
||||
|
||||
fn get_block_predecessors(&self, block: BasicBlockId) -> Vec<BasicBlockId> {
|
||||
// LoopFormOps: HashSet<BasicBlockId> 返却
|
||||
// PhiBuilderOps: Vec<BasicBlockId> 返却
|
||||
// 変換: HashSet → Vec + ソート(決定性保証)
|
||||
let pred_set = <Self as LoopFormOps>::get_block_predecessors(self, block);
|
||||
let mut pred_vec: Vec<BasicBlockId> = pred_set.into_iter().collect();
|
||||
pred_vec.sort_by_key(|bb| bb.0); // bb.0 = BasicBlockId の内部値
|
||||
pred_vec
|
||||
}
|
||||
|
||||
fn emit_void(&mut self) -> ValueId {
|
||||
// void 定数を発行
|
||||
let void_id = <Self as LoopFormOps>::new_value(self);
|
||||
let _ = self.emit_const(void_id, ConstValue::Void);
|
||||
void_id
|
||||
}
|
||||
|
||||
fn set_current_block(&mut self, block: BasicBlockId) -> Result<(), String> {
|
||||
// 委譲: LoopFormOps の既存実装を使用
|
||||
<Self as LoopFormOps>::set_current_block(self, block)
|
||||
}
|
||||
|
||||
fn block_exists(&self, block: BasicBlockId) -> bool {
|
||||
// 委譲: LoopFormOps の既存実装を使用
|
||||
<Self as LoopFormOps>::block_exists(self, block)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user