diff --git a/docs/private/roadmap/phases/phase-20.33/CHECKLIST.md b/docs/private/roadmap/phases/phase-20.33/CHECKLIST.md index 3d786ccb..492b7795 100644 --- a/docs/private/roadmap/phases/phase-20.33/CHECKLIST.md +++ b/docs/private/roadmap/phases/phase-20.33/CHECKLIST.md @@ -14,6 +14,7 @@ - [ ] v1→v0 最小ダウングレード(任意・`HAKO_NYVM_V1_DOWNCONVERT=1`)。未対応命令は Fail‑Fast。 - [x] Bridge 正規化: `HAKO_BRIDGE_INJECT_SINGLETON` 実装(Array/Map len → Method 化、Fail‑Fast 付き)。 - [x] Bridge 正規化: `HAKO_BRIDGE_EARLY_PHI_MATERIALIZE` 実装(φ をブロック先頭へ移動、順序保護)。 +- [ ] 静的Boxメソッドの self 先頭統一(LLVM 命令Boxを含む)。互換が必要な経路は `HAKO_BRIDGE_INJECT_SINGLETON=1` で補完。 - [x] Gate‑C file/pipe × Plugins ON/OFF の対称性スモーク(数値出力=終了コード)。 - [ ] Stage‑A map リテラルの堅牢化(エスケープ/Unicode/{}/不正形診断)。 - [x] スモーク実行権限(core/* に chmod +x 反映)。 diff --git a/docs/private/roadmap/phases/phase-20.33/README.md b/docs/private/roadmap/phases/phase-20.33/README.md index 0900930e..adb059bf 100644 --- a/docs/private/roadmap/phases/phase-20.33/README.md +++ b/docs/private/roadmap/phases/phase-20.33/README.md @@ -68,6 +68,12 @@ - 現状: `HAKO_NYVM_CORE=1` 時に v1(JSON) を `json_v1_bridge` で `MirModule` へ変換し、MIR Interpreter で実行(const/binop/compare/branch/jump/phi 対応)。 - NyVmDispatcher 直行は別タスクとして扱う(既定OFF・将来対応)。 +- 静的Boxの Singleton(self)規約の明文化と整備 + - 背景: 静的Boxのメソッドは「先頭に self(Singleton)を持つ」前提。MIR/Verifier もこの arity を期待する。 + - 現状: 一部の LLVM 命令Box相当(例: `LLVMPhiInstructionBox.lower_phi` 等)が self 非対応の設計で呼び出されるケースがあり、Verifier が「Singleton+引数…」の期待と不一致になる。 + - 対応: 本フェーズで「メソッド定義側を self 先頭に揃える」ことを原則とし、互換が必要な経路には `HAKO_BRIDGE_INJECT_SINGLETON=1`(opt-in)で受理・補完する。 + - Fail‑Fast: 期待 arity と不一致の呼び出しは静かなフォールバックを行わず、安定化メッセージで失敗させる。 + - v1→v0 ダウングレード(Runner 側)が未実装(任意) - 代表命令(const/binop/compare/ret/branch/jump/phi)の最小降格を `HAKO_NYVM_V1_DOWNCONVERT=1` で opt‑in。 - 未対応命令は Fail‑Fast。Core 直行が有効な場合は直行を優先。 @@ -84,6 +90,8 @@ Bridge 正規化 仕様(案/このフェーズで凍結) - 変換(最小): - 形状: `ModuleFunction { name: "ArrayBox.len" , args:[X] }` → `Method { receiver:X, method:"size" }` - 形状: `ModuleFunction { name: "MapBox.len" , args:[X] }` → `Method { receiver:X, method:"len" }` + - 形状: `ModuleFunction { name: "LLVMPhiInstructionBox.lower_phi", args:[dst,incoming] }` + → `Method { receiver:Singleton(LLVMPhiInstructionBox), method:"lower_phi", args:[dst,incoming] }`(将来の静的Box命令群に一般化) - 前提: `args` が 1 要素の数値(レジスタID)。それ以外は変換せず Fail。 - 変換は命令 JSON の当該オブジェクトのみを書き換え、周囲の命令順や値定義順には触れない。 - 未対応: push/pop/get/set の ModuleFunction 形(将来拡張)。 diff --git a/docs/reference/language/LANGUAGE_REFERENCE_2025.md b/docs/reference/language/LANGUAGE_REFERENCE_2025.md index b5946a55..f7130605 100644 --- a/docs/reference/language/LANGUAGE_REFERENCE_2025.md +++ b/docs/reference/language/LANGUAGE_REFERENCE_2025.md @@ -132,6 +132,12 @@ static box Main { } ``` +注意(静的Boxのメソッド引数規約) +- 静的Boxのメソッドは先頭に暗黙の `self`(= Singleton)が存在する。 +- つまり呼び出し側は `Main.main()` のように書いても、意味論上は `Main.main(self, ...)` の形になる。 +- VM/MIR/LLVM いずれのバックエンドでも、この規約に基づき引数個数(arity)を判定する。 +- 開発時のガイドライン: 静的Box内に定義する全メソッドは「先頭に `self` を取る」形で設計すること(将来の最適化や検証で一貫性を保つため)。 + ### **2.2 変数宣言** #### **基本パターン**