Files
hakorune/docs/archive/cleanup/QUICK_REFERENCE.md
nyash-codex 2dfe363365 refactor(joinir): Phase 242-EX-A - Delete legacy Pattern3 lowerer
Remove hardcoded Pattern3 PoC implementation (loop_with_if_phi_minimal.rs)
and enhance if-sum mode to handle complex conditions like `i % 2 == 1`.

Key changes:
- condition_pattern.rs: Accept BinaryOp in comparison operands (+58 lines)
- loop_with_if_phi_if_sum.rs: Dynamic complex condition lowering (+147 lines)
- pattern3_with_if_phi.rs: Remove lower_pattern3_legacy() (-130 lines)
- loop_with_if_phi_minimal.rs: Delete entire file (-437 lines)
- loop_patterns/with_if_phi.rs: Update stub (-45 lines)
- mod.rs: Remove module reference (-4 lines)

Net reduction: -664 lines of hardcoded PoC code

Test results: 909/909 PASS (legacy mode completely removed)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 01:27:08 +09:00

4.7 KiB
Raw Blame History

Status: Historical

重複コード削減 - クイックリファレンスカード

📊 一目で分かる状況

現状: 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ヶ所 集約

💡 実装のコツ

  1. 最小ファイルから: boxes_array.rs (63行) がおすすめ
  2. 1ファイルずつ: 都度テストして確実に
  3. コピペOK: 実装ガイドのコードをそのまま使える
  4. 小さな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 { /* ... */ }
}

📚 詳細ドキュメント


🎯 今日から始める

# 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行削減

今すぐ始めましょう! 🚀