refactor(json_v0_bridge): Phase 25.1p - FunctionDefBuilder箱化+me予約修正

【変更内容】
1. FunctionDefBuilder 箱化(SSOT化)
   - インスタンスメソッド判定の一元化
   - パラメータ ValueId 生成の統一
   - 変数マップ初期化の統一

2. ValueId(0) me 予約バグ修正
   - is_instance_method() で box_name != "Main" 判定
   - インスタンスメソッドは me を ValueId(0) に予約
   - variable_map["me"] = ValueId(0) を自動設定

3. コード削減・可読性向上
   - 60行 → 40行(関数定義処理)
   - 重複ロジック削除
   - デバッグログ追加(is_instance表示)

【効果】
- json_v0_bridge 経路の ValueId(0) 未定義エラー解消
- Stage-B compiler で static box メソッドが正しく動作
- 設計の一貫性向上(me の扱いが明確)

【非スコープ】
- Rust MirBuilder 側は未修正(Phase 26で統一予定)
- lower_static_method_as_function は現状維持

関連: Phase 25.1m (静的メソッド修正), Phase 25.1c/k (SSA修正)

🐱 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-19 10:08:04 +09:00
parent 75f3df2505
commit 1747ec976c
5 changed files with 306 additions and 33 deletions

View File

@ -435,14 +435,21 @@ Status: Step0〜3 実装済み・Step4Method/Extern実装フェーズ
- `args[0]` の MIR(JSON v0) 文字列を受け取り、ny-llvmc ラッパ (`llvm_codegen::mir_json_to_object`) で object (.o) のパスを返す。
- BridgeJSON v0 → MIRの特別扱い:
- `src/runner/json_v0_bridge/lowering/expr.rs`:
- `src/runner/json_v0_bridge/lowering/expr.rs` / `lowering.rs`:
- `MapVars::resolve`:
- `hostbridge` / `env` を特殊変数として扱い、それぞれ Const(String) `"hostbridge"` / `"env"` を生成するMethod チェーンを降ろすためのプレースホルダ)。
- `me` については、Bridge 環境の `allow_me_dummy` が ON のときだけ NewBox を注入する(通常は JSON defs 側で明示パラメータとして扱う)。
- `lower_expr_with_scope`:
- `ExprV0::Extern { iface, method, args }` → `MirInstruction::ExternCall { iface_name, method_name, ... }`。
- `ExprV0::Method` の特別ケース:
- `ConsoleBox` の `print/println/log` → `ExternCall env.console.log`。
- `env.box_introspect.kind(value)` パターン → `ExternCall env.box_introspect.kind` に正規化。
- defs 降下(`lowering.rs`:
- JSON v0 の `defs` に対して、`box_name != "Main"` の関数を **インスタンスメソッド** とみなし、
- `signature.params` に「暗黙 `me` + 明示パラメータ」を載せる。
- `func_var_map` に `me` → `func.params[0]` を、残りのパラメータ名を `params[1..]` にバインドする。
- これにより StageB / Stage1 側で `_build_module_map()` のような「params: [] だが `me` を使う」メソッドでも、
Rust VM 実行時に `me` 未定義にならず、BoxCall が正しく解決されるようになった。
- Selfhost への移植指針Rust SSOT に沿った箱設計):
- `MethodCall`: