2.6 KiB
2.6 KiB
Status, Scope, Related
| Status | Scope | Related | |||
|---|---|---|---|---|---|
| Active | code(仕様不変、Feature合成の導線整備) |
|
Phase 29an P12: CanonicalLoopFacts に ExitMap projection を追加(仕様不変)
Date: 2025-12-29
Status: Ready for execution
Scope: ExitMapFacts を normalize 側で “参照しやすい形” に投影する(挙動不変)
Objective
CanonicalLoopFactsにexit_kinds_presentの projection を追加し、planner がfacts.facts.features.exit_mapを深掘りしないで済むようにする- P8(exit_usage invariants)と同様に、将来の Feature 合成で “入口が1箇所” になる土台を整える
Non-goals
- 既存ルーティング/候補集合/順序/ログ/エラー文字列の変更
- 新しい Freeze 発火(gate を壊さない)
- cleanup/value_join の実装(P13+)
Implementation
Step 1: CanonicalLoopFacts を拡張(projection追加)
Update:
src/mir/builder/control_flow/plan/normalize/canonicalize.rs
Add:
pub exit_kinds_present: std::collections::BTreeSet<ExitKindFacts>
Populate:
facts.features.exit_map.as_ref().map(|m| m.kinds_present.clone()).unwrap_or_default()
注意:
ExitKindFacts/ExitMapFactsはsrc/mir/builder/control_flow/plan/facts/feature_facts.rsの語彙を使うcanonicalize_loop_factsは pure transform のまま(副作用/ログ禁止)
Step 2: planner の invariants / gate を projection へ寄せる(挙動不変)
Update:
src/mir/builder/control_flow/plan/planner/build.rs
Change:
ExitUsageFactsを参照している箇所はそのまま維持してよい(P12は projection を増やすだけ)- ただし
debug_assert_exit_usage_matches_plan()の引数にexit_kinds_presentを追加して、exit_usageとexit_kinds_presentの整合(presence)を debug-only で確認するhas_break == exit_kinds_present.contains(Break)等
Step 3: unit tests(normalize側で固定)
Add tests in canonicalize.rs:
exit_kinds_presentが empty のとき empty- break/continue/return を含む facts で
exit_kinds_presentに3種入る
Verification(required)
cargo build --release./tools/smokes/v2/run.sh --profile quick./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh
Commit
git add -A && git commit -m "phase29an(p12): project exitmap kinds into canonical facts"