Phase A cleanup - Safe deletions with zero risk: ## Deleted Files (6 files, 373 lines total) 1. Cranelift/JIT Backend (321 lines): - src/runner/modes/cranelift.rs (45 lines) - src/runner/modes/aot.rs (55 lines) - src/runner/jit_direct.rs (152 lines) - src/tests/core13_smoke_jit.rs (42 lines) - src/tests/core13_smoke_jit_map.rs (27 lines) 2. Legacy MIR Builder (52 lines): - src/mir/builder/exprs_legacy.rs - Functionality inlined into exprs.rs (control flow constructs) ## Module Reference Cleanup - src/backend/mod.rs: Removed cranelift feature gate exports - src/runner/mod.rs: Removed jit_direct module reference - src/runner/modes/mod.rs: Removed aot module reference - src/mir/builder.rs: Removed exprs_legacy module ## Impact Analysis - Build: Success (cargo build --release) - Tests: All passing - Risk Level: None (feature already archived, code unused) - Related: Phase 15 JIT archival (archive/jit-cranelift/) ## BID Copilot Status - Already removed in previous cleanup - Not part of this commit Total Reduction: 373 lines (~0.4% of codebase) Next: Phase B - Dead code investigation Related: #phase-21.0-cleanup Part of: Legacy Code Cleanup Initiative
4.6 KiB
4.6 KiB
重複コード削減 - クイックリファレンスカード
📊 一目で分かる状況
現状: 3,335行(Handlers)
↓
Phase 1実装後: 2,965行 (-11%)
↓
Phase 2実装後: 2,715行 (-19%)
↓
Phase 3実装後: 2,415行 (-28%)
🎯 Phase 1: 今すぐできる改善(5-8時間)
3つのヘルパー関数
1. Destination書き込み (49箇所 → 1行化)
// ❌ Before (3-4行)
if let Some(d) = dst {
this.regs.insert(d, VMValue::from_nyash_box(ret));
}
// ✅ After (1行)
this.write_box_result(dst, ret);
2. 引数検証 (55箇所 → 1行化)
// ❌ Before (3行)
if args.len() != 1 {
return Err(VMError::InvalidInstruction("push expects 1 arg".into()));
}
// ✅ After (1行)
this.validate_args_exact("push", args, 1)?;
3. Receiver変換 (5箇所 → 1行化)
// ❌ Before (4行)
let recv_box = match recv.clone() {
VMValue::BoxRef(b) => b.share_box(),
other => other.to_nyash_box(),
};
// ✅ After (1行)
let recv_box = this.convert_to_box(&recv);
📂 実装する新ファイル
src/backend/mir_interpreter/utils/
├── mod.rs # モジュール定義
├── register_ops.rs # write_result, write_void, etc.
├── validation.rs # validate_args_exact, validate_args_range
└── conversions.rs # convert_to_box
✅ 実装チェックリスト
ステップ1: インフラ (1-2時間)
utils/ディレクトリ作成- 3つのファイル実装(register_ops, validation, conversions)
- ユニットテスト追加
- コンパイル&テスト確認
ステップ2: Handler更新 (3-5時間)
小→大の順で1ファイルずつ:
boxes_array.rs(63行 → 50行)boxes_map.rs(134行 → 110行)boxes_string.rs(208行 → 170行)boxes_plugin.rs(217行 → 180行)boxes_instance.rs(153行 → 125行)boxes_object_fields.rs(399行 → 330行)boxes.rs(307行 → 250行)calls.rs(907行 → 750行)
各更新後: コンパイル → テスト → コミット
ステップ3: 検証 (1時間)
- 古いパターン残存確認
- スモークテスト実行
- ドキュメント更新
🔍 確認コマンド
# 重複パターン検索
grep -rn "if let Some(d) = dst { this.regs.insert" src/backend/mir_interpreter/handlers/
grep -rn "args.len() !=" src/backend/mir_interpreter/handlers/
grep -rn "match recv.clone()" src/backend/mir_interpreter/handlers/
# Phase 1実装後(残存チェック)
grep -rn "if let Some(d) = dst { this.regs.insert" src/backend/mir_interpreter/handlers/ | wc -l
# → 0になるはず
# テスト実行
./tools/jit_smoke.sh
# 変更行数確認
git diff --stat
📈 期待される効果
| 指標 | Before | After | 改善 |
|---|---|---|---|
| 行数 | 3,335 | 2,965 | -11% |
| 重複箇所 | 260 | 109 | -58% |
| 保守対象 | 散在 | 3ヶ所 | 集約 |
💡 実装のコツ
- 最小ファイルから:
boxes_array.rs(63行) がおすすめ - 1ファイルずつ: 都度テストして確実に
- コピペOK: 実装ガイドのコードをそのまま使える
- 小さなPR: レビュー負荷を軽減
🚨 トラブルシューティング
コンパイルエラー「method not found」
// src/backend/mir_interpreter/mod.rs に追加
mod utils;
テストエラー「MirInterpreter::new_for_test not found」
// テスト用ビルダー関数を追加
#[cfg(test)]
impl MirInterpreter {
fn new_for_test() -> Self { /* ... */ }
}
📚 詳細ドキュメント
- 実装手順:
PHASE1_IMPLEMENTATION_GUIDE.md - 詳細分析:
DUPLICATION_ANALYSIS_REPORT.md - 全体サマリー:
CLEANUP_SUMMARY_2025-11-06.md
🎯 今日から始める
# 1. ドキュメント確認(5分)
cat docs/development/cleanup/PHASE1_IMPLEMENTATION_GUIDE.md
# 2. ディレクトリ作成(1分)
mkdir -p src/backend/mir_interpreter/utils
# 3. ファイル作成&実装(1-2時間)
touch src/backend/mir_interpreter/utils/{mod,register_ops,validation,conversions}.rs
# → 実装ガイドからコピペ
# 4. 最小ファイルで試す(30分)
# → boxes_array.rs を更新
# 5. テスト実行(5分)
./tools/jit_smoke.sh
# 6. 残りのファイルも順次更新(2-4時間)
所要時間: 5-8時間 リスク: 低 効果: 高(270-380行削減)
今すぐ始めましょう! 🚀