feat(joinir): L-2.2 Step-2 - Add Stage-B to VM bridge dispatch

Add Stage-B BodyExtractor and FuncScanner to JoinIR VM bridge dispatch:
- Import stageb_body and stageb_funcscanner lowering functions
- Add routing for StageBBodyExtractorBox.build_body_src/2
- Add routing for StageBFuncScannerBox.scan_all_boxes/1
- Add try_run_stageb_body() and try_run_stageb_funcscanner() (lowering verification only)

Also cleanup unused imports in funcscanner_trim.rs and stage1_using_resolver.rs

Note: Stage-B functions use lowering verification pattern (like Stage-1)
because ArrayBox/MapBox args are not yet supported in JoinValue.

🤖 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-26 11:02:21 +09:00
parent 9d769e9217
commit e61e7a2be6
3 changed files with 71 additions and 4 deletions

View File

@ -48,8 +48,6 @@ use crate::mir::join_ir::{
BinOpKind, CompareOp, ConstValue, JoinContId, JoinFuncId, JoinFunction, JoinInst, JoinModule,
LoopExitShape, LoopHeaderShape, MirLikeInst,
};
use crate::mir::loop_form::LoopForm;
use crate::mir::query::MirQuery;
use crate::mir::ValueId;
/// Phase 27.9: Toggle dispatcher for trim lowering

View File

@ -47,8 +47,7 @@ use crate::mir::join_ir::lowering::common::{
};
use crate::mir::join_ir::lowering::value_id_ranges::stage1_using_resolver as vid;
use crate::mir::join_ir::JoinModule;
use crate::mir::loop_form::LoopForm;
use crate::mir::query::{MirQuery, MirQueryBox};
use crate::mir::query::MirQueryBox;
/// Phase 27.12: Stage1UsingResolverBox.resolve_for_source の JoinIR loweringpublic dispatcher
///

View File

@ -6,6 +6,8 @@
//! 判定に差し替え可能な設計になっている。
use crate::config::env::{joinir_experiment_enabled, joinir_vm_bridge_enabled};
use crate::mir::join_ir::lowering::stageb_body::lower_stageb_body_to_joinir;
use crate::mir::join_ir::lowering::stageb_funcscanner::lower_stageb_funcscanner_to_joinir;
use crate::mir::join_ir::lowering::stage1_using_resolver::lower_stage1_usingresolver_to_joinir;
use crate::mir::join_ir::{lower_funcscanner_trim_to_joinir, lower_skip_ws_to_joinir, JoinFuncId};
use crate::mir::join_ir_ops::JoinValue;
@ -78,6 +80,16 @@ pub fn try_run_joinir_vm_bridge(module: &MirModule, quiet_pipe: bool) -> bool {
return try_run_stage1_usingresolver(module);
}
// Stage-B BodyExtractorまだ実行には対応せず、lowering 検証のみ)
if module.functions.contains_key("StageBBodyExtractorBox.build_body_src/2") {
return try_run_stageb_body(module);
}
// Stage-B FuncScannerまだ実行には対応せず、lowering 検証のみ)
if module.functions.contains_key("StageBFuncScannerBox.scan_all_boxes/1") {
return try_run_stageb_funcscanner(module);
}
false
}
@ -183,3 +195,61 @@ fn try_run_stage1_usingresolver(module: &MirModule) -> bool {
}
}
}
/// StageBBodyExtractorBox.build_body_src/2 用 JoinIR ブリッジ(検証のみ)
///
/// Note: ArrayBox/MapBox 引数がまだ JoinValue でサポートされていないため、
/// lowering の検証のみ行い、実際の実行は通常 VM にフォールバックする。
fn try_run_stageb_body(module: &MirModule) -> bool {
eprintln!(
"[joinir/vm_bridge] Attempting JoinIR path for StageBBodyExtractorBox.build_body_src"
);
match lower_stageb_body_to_joinir(module) {
Some(join_module) => {
eprintln!(
"[joinir/vm_bridge] ✅ Stage-B Body JoinIR module generated ({} functions)",
join_module.functions.len()
);
eprintln!(
"[joinir/vm_bridge] Note: ArrayBox/MapBox args not yet supported in JoinValue"
);
eprintln!("[joinir/vm_bridge] Falling back to normal VM path for actual execution");
false // 実行はまだサポートしていない
}
None => {
eprintln!("[joinir/vm_bridge] lower_stageb_body_to_joinir returned None");
eprintln!("[joinir/vm_bridge] Falling back to normal VM path");
false
}
}
}
/// StageBFuncScannerBox.scan_all_boxes/1 用 JoinIR ブリッジ(検証のみ)
///
/// Note: ArrayBox/MapBox 引数がまだ JoinValue でサポートされていないため、
/// lowering の検証のみ行い、実際の実行は通常 VM にフォールバックする。
fn try_run_stageb_funcscanner(module: &MirModule) -> bool {
eprintln!(
"[joinir/vm_bridge] Attempting JoinIR path for StageBFuncScannerBox.scan_all_boxes"
);
match lower_stageb_funcscanner_to_joinir(module) {
Some(join_module) => {
eprintln!(
"[joinir/vm_bridge] ✅ Stage-B FuncScanner JoinIR module generated ({} functions)",
join_module.functions.len()
);
eprintln!(
"[joinir/vm_bridge] Note: ArrayBox/MapBox args not yet supported in JoinValue"
);
eprintln!("[joinir/vm_bridge] Falling back to normal VM path for actual execution");
false // 実行はまだサポートしていない
}
None => {
eprintln!("[joinir/vm_bridge] lower_stageb_funcscanner_to_joinir returned None");
eprintln!("[joinir/vm_bridge] Falling back to normal VM path");
false
}
}
}