Files
hakorune/src/mir/join_ir_vm_bridge/mod.rs
tomoaki e7f9adcfed refactor(joinir): Phase 260 P0.3 Phase 1 - extract terminator_builder + block_finalizer
Extracts shared utilities from joinir_block_converter.rs to prepare for
handler extraction (Phase 2):

**terminator_builder.rs** (207 lines):
- create_branch_terminator() - Branch with empty edge_args
- emit_branch_and_finalize() - Branch + block finalization
- create_jump_terminator() - Jump with empty edge_args
- create_return_terminator() - Return terminator
- Eliminates 4x Branch terminator duplication

**block_finalizer.rs** (246 lines):
- finalize_block() - Add instructions + terminator (PHI-preserving)
- finalize_remaining_instructions() - Flush pending instructions
- Phase 189 FIX: Critical PHI preservation logic
- PHI instructions remain at block start for SSA correctness

Pattern reduction: ~90 lines duplicated 4x → 2 utility modules

All utilities fully tested with comprehensive unit tests.
Phase 1 complete - utilities ready for Phase 2 handler extraction.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 07:40:05 +09:00

93 lines
2.9 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! Phase 27-shortterm S-4: JoinIR → Rust VM Bridge
//!
//! 目的: JoinIR正規化された IRを Rust VM で実行するブリッジ層
//!
//! ## Architecture
//! ```text
//! JoinIR (normalized) → MirModule → Rust VM → Result
//! ↑ ↑ ↑
//! PHI bugs VM input Execution
//! eliminated format (GC, plugins)
//! ```
//!
//! ## Design Principles
//! - JoinIR の正規化構造を保持したまま VM に渡す
//! - マッピングだけで済ませるJoinIR でやった正規化は消えない)
//! - VM の機能GC、プラグイン、エラーハンドリングを活用
//!
//! ## Minimal Instruction Set (S-4.3)
//! - **Compute**: Const, BinOp, Compare
//! - **BoxCall**: StringBox メソッド呼び出し
//! - **Call/Jump/Ret**: 制御フロー
//!
//! Phase 27-shortterm scope: skip_ws で green 化できれば成功
use crate::backend::VMError;
use crate::mir::join_ir::JoinFuncId;
#[macro_use]
mod logging {
macro_rules! debug_log {
($($arg:tt)*) => {
if crate::config::env::joinir_vm_bridge_debug() {
eprintln!($($arg)*);
}
};
}
}
mod convert;
// Phase 190: Modular converters
mod block_allocator; // Phase 260 P0.2: Block ID allocation utility
mod block_finalizer; // Phase 260 P0.3: PHI-preserving block finalization
mod bridge;
mod call_generator; // Phase 260 P0.2: Call instruction generation utility
mod handlers; // Phase 260 P0.2: Modularized JoinIR instruction handlers
mod joinir_block_converter;
mod joinir_function_converter;
mod merge_variable_handler; // Phase 260 P0.2: Merge copy emission utility
mod meta;
mod terminator_builder; // Phase 260 P0.3: Terminator creation utility
#[cfg(feature = "normalized_dev")]
mod normalized_bridge;
mod runner;
#[cfg(test)]
mod tests;
// Phase 190: Use modularized converters
pub(crate) use bridge::{bridge_joinir_to_mir, bridge_joinir_to_mir_with_meta};
#[allow(unused_imports)]
pub(crate) use convert::convert_joinir_to_mir;
pub(crate) use convert::convert_mir_like_inst; // helper for sub-modules
pub(crate) use joinir_function_converter::JoinIrFunctionConverter;
pub use meta::convert_join_module_to_mir_with_meta;
#[cfg(feature = "normalized_dev")]
pub(crate) use normalized_bridge::lower_normalized_to_mir_minimal;
pub use runner::run_joinir_via_vm;
/// Phase 27-shortterm S-4 エラー型
#[derive(Debug, Clone)]
pub struct JoinIrVmBridgeError {
pub message: String,
}
impl JoinIrVmBridgeError {
pub fn new(msg: impl Into<String>) -> Self {
Self {
message: msg.into(),
}
}
}
impl From<VMError> for JoinIrVmBridgeError {
fn from(err: VMError) -> Self {
JoinIrVmBridgeError::new(format!("VM error: {:?}", err))
}
}
/// JoinFuncId から MIR 用の関数名を生成
pub(crate) fn join_func_name(id: JoinFuncId) -> String {
format!("join_func_{}", id.0)
}