Phase 259 P0: Pattern8 (BoolPredicateScan) 完全完了 is_integer/1 を Pattern8 で受理し、VM/LLVM EXE 両方で動作確認完了。 次の大工事(block-parameterized CFG への移行)前のマイルストーンとして記録。 ## Key Fixes Applied 1. **skipped_entry_redirects** (instruction_rewriter.rs) - k_exit のスキップ時、entry block 参照を exit_block_id へリダイレクト - BasicBlockId not found エラーを根治 2. **loop_var_name** (pattern8_scan_bool_predicate.rs) - merge_entry_block 選択に使用(`Some(parts.loop_var.clone())`) - 未設定時の誤った entry block 選択を修正 3. **loop_invariants** (pattern8_scan_bool_predicate.rs) - PHI-free 不変量パラメータ(`[(me, me_host), (s, s_host)]`) - loop_var_name 設定時、BoundaryInjector が join_inputs Copy を全スキップするため必要 - Pattern6 と同じ設計(header PHI で不変量を保持) 4. **expr_result** (pattern8_scan_bool_predicate.rs) - k_exit からの返り値を明示設定(`Some(join_exit_value)`) - Pattern7 style(推測ではなく明示) 5. **Smoke test scripts** - set +e パターンで exit code 7 をキャプチャ - LLVM EXE スクリプトにコメント追加(tools/build_llvm.sh 経由の明記) ## Contract Documentation - join-explicit-cfg-construction.md に Pattern8 契約の具体例を追加 - "pattern増でも推測増にしない" の実例として記録 - loop_var_name / loop_invariants / expr_result / jump_args_layout の契約を明示 - 20-Decisions.md に正規化(Semantic/Plumbing)の分離方針を追記 - DOCS_LAYOUT.md に重要ドキュメントへの参照を追加 ## Test Results - ✅ VM smoke test: `[PASS] phase259_p0_is_integer_vm` (exit 7) - ✅ LLVM EXE: tools/build_llvm.sh 経由で exit 7 確認 - ✅ --verify: PASS ## Next FAIL (Phase 260+) - Function: `Main.main/0` in `apps/examples/json_lint/main.hako` - Error: `[cf_loop/pattern2] Failed to extract break condition from loop body` - Pattern: Nested loop(外側 loop + 内側 loop with break) 🚀 次の大工事: block-parameterized CFG への移行を開始します。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2.8 KiB
2.8 KiB
Self Current Task — Decisions (main)
2025‑12‑13
- JoinIR lowering の name-based 変数解決は、dev-only(
normalized_dev)で BindingId-based に段階移行する(dual-path を維持)。 - promoted carriers(DigitPos/Trim などの synthetic name)は、
BindingId(original) → BindingId(promoted) → ValueId(join)の鎖で接続し、by-name ルール分岐は導入しない。 - debug/観測は既存のフラグ(例:
NYASH_JOINIR_DEBUG)に集約し、新しい環境変数のスパローは避ける。
2025‑12‑19
- return の表現力拡張は「パターン総当たり」ではなく、pure expression を扱う
NormalizedExprLowererBox(AST walker)へ収束させる(Phase 140)。 - Call/MethodCall は effects + typing の論点が増えるため、pure とは分離して Phase 141+ で段階投入する。
- out-of-scope は
Ok(None)で既存経路へフォールバックし、既定挙動不変を維持する(strict は “close-but-unsupported” のみ fail-fast)。
2025‑12‑20
- Phase 256 の詰まり(Jump/continuation/params/jump_args)を「暗黙 ABI の分裂」と捉え、契約を
JoinIR ABI/Contractとして明文化していく(SSOT を 1 箇所へ集約)。 - continuation の識別は ID を SSOT(String は debug/serialize 用)とし、
join_func_Nの legacy は alias で隔離する。 jump_argsは意味論の SSOT なので、最終的には MIR terminator operand に統合して DCE/CFG から自然に追える形へ収束させる(Phase 256 を緑に戻した後に段階導入)。- 上記の収束先(north star)を “Join-Explicit CFG Construction” と命名し、段階移行(案1→案2→必要なら案3)で進める。
- 正規化(normalized)を Semantic/Plumbing に分離し、
NormalizeBox(意味SSOT)/AbiBox(役割SSOT)/EdgeArgsPlumbingBox(配線SSOT)の最小セットで “推測禁止 + Fail-Fast” を維持する。 - spans は並行 Vec を最終的に廃止し、
Vec<Spanned<_>>へ収束(段階導入: 編集APIの一本化 → 内部表現切替)。 - edge-args の参照 API は
JumpだけでなくBranchを含むため、単発edge_args()ではなくout_edges()/edge_args_to(target)のような “複数 edge” 前提の参照点を SSOT にする。
2025‑09‑08
- ループ制御は既存命令(Branch/Jump/Phi)で表現し、新命令は導入しない。
- Builder に loop_ctx({head, exit})を導入し、continue/break を分岐で降ろす。
- Verifier の支配関係/SSA を崩さないよう、単一 exit と post‑terminated 後の emit 禁止を徹底。
- VInvoke(vector 経路)の戻り値は、短期は「既知メソッドの整数返り」を特例扱いで保持し、 中期は nyash.toml の戻り型ヒント or NyRT シムの期待フラグで正道化。