fix(joinir): Phase 220-C condition variable remap and self-copy skip
- Pre-populate remap with condition_bindings (join_value → host_value) - Skip self-copy param bindings to avoid `%6 = copy %6` - ConditionEnv remap verified: ValueId(101) → ValueId(6) correctly Note: RC=0 issue remains - ExprResult routing to be investigated in Phase 221 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -70,6 +70,12 @@ JoinIR ラインで守るべきルールを先に書いておくよ:
|
||||
- LoopBuilder は物理削除済み。JoinIR を OFF にする経路やフォールバックは存在しない。
|
||||
- `NYASH_JOINIR_CORE` は deprecated(0 を指定しても警告して無視)。JoinIR の OFF トグルは提供しない。
|
||||
|
||||
11. **Parser の直後に JoinIR 正規化ゲートを置く**
|
||||
- `.hako → AST` のあと、必ず JoinIR Frontend(Pattern 検出+ lowering)を通してから MIR/LLVM に進むのを基本線とする。
|
||||
- dev/ci/strict 系プロファイルでは、この JoinIR 正規化がビルドゲートになる(ここで `[joinir/freeze]` が出たらビルド失敗)。
|
||||
- relaxed / 実験用プロファイルでは、一時的に JoinIR 正規化をスキップすることはあっても、最終的な「言語としての安全域」は
|
||||
JoinIR Frontend が受理できる構造で定義する。
|
||||
|
||||
---
|
||||
|
||||
## 1.9 ValueId Space Management (Phase 201)
|
||||
@ -118,6 +124,33 @@ Local Region (1000+):
|
||||
| Pattern 2 lowerer | Local (1000+) | `alloc_local()` | 中間値(Const, BinOp, etc.) |
|
||||
| Pattern 3 lowerer | Local (1000+) | `alloc_local()` | 中間値(PHI, Select, etc.) |
|
||||
| Pattern 4 lowerer | Local (1000+) | `alloc_local()` | 中間値(Select, BinOp, etc.) |
|
||||
|
||||
---
|
||||
|
||||
## 7. 将来の拡張(例外 / async / try-catch)
|
||||
|
||||
現状の JoinIR は「同期・正常系」のループ/if/更新を扱う芯としてはほぼ完成しており、
|
||||
LoopBuilder 完全削除後も P1–P5 + 各種 UpdateKind で JsonParser/selfhost の代表ケースを安全に lowering できている。
|
||||
|
||||
一方で、言語としては将来的に `throw/try/catch` や async/await 相当の表現も必要になる。その扱いについては、
|
||||
以下の方針をここに固定しておく(まだ実装フェーズには入っていない):
|
||||
|
||||
1. **ErrorCarrier(Result 風キャリア)の導入(将来フェーズ)**
|
||||
- 関数/ループのキャリアに `err_flag` / `err_value` を追加し、「エラーが発生したら err キャリアを立てて継続を上に抜けていく」
|
||||
という形で throw 相当を表現する。
|
||||
- catch 側は「ある関数境界で err キャリアを inspect して処理する」箱として実装し、構文の try/catch はこの箱への sugar として扱う。
|
||||
- これにより core JoinIR(ループ骨格・PHI・ExitLine)は変更せず、ErrorCarrier を 1 本足すだけで例外伝播を表現できる。
|
||||
|
||||
2. **async/await は state machine 箱として後置する**
|
||||
- async 関数は `.hako AST → state machine JoinIR` へ変換する専用の箱で表現し、その state machine 自体は
|
||||
既存の JoinIR(ループ+if+キャリア)で実装する。
|
||||
- これにより、JoinIR のコア設計を同期用に保ったまま、外側に async 用の変換レイヤーを追加する形にする。
|
||||
|
||||
3. **導入タイミング**
|
||||
- まずは JsonParser/selfhost の同期ループ/if が JoinIR Pattern 群でほぼ全部通る状態を優先して作る。
|
||||
- ErrorCarrier や try/catch/async の実装は、その後の「第2章」として Phase 23x 以降に扱う(現在は設計メモのみ)。
|
||||
|
||||
この方針により、「例外や async のために JoinIR の芯を崩さず、外側に箱を足す」拡張戦略を維持する。
|
||||
| LoopHeaderPhiBuilder | PHI Reserved (0-99) | `reserve_phi()` | PHI dst ID 保護(上書き防止) |
|
||||
|
||||
### 1.9.4 設計原則
|
||||
|
||||
Reference in New Issue
Block a user