# Phase 29y: ABI SSOT(lifecycle / RC / weak) Status: Ready (docs-first, post self-host) Scope: “脱Rustランタイム(NyRT/.hako)” を進める前提で、lifecycle/RC/weak の境界を ABI として固定する。 この文書は「実装の現状」を説明するのではなく、**将来の置換(NyRT/.hako化)に耐える契約**を先に固定する。 ## 0. 目的(SSOT) - backend(VM/LLVM/wasm/others)が “同じ意味” を実装できる最小 ABI を定義する - “言語意味論” と “実装都合(VMのregs等)” を切り離し、hidden root を再発しにくくする ## 1. 前提(言語意味論) ここでの weak は観測可能: - `weak_to_strong()` が成功/失敗を返す(失敗は `null`) - したがって「SSA last-use = 寿命」を意味論にしてはいけない ## 2. ハンドル/値の表現(最低限) ### 2.1 Box handle - `BoxHandle` は runtime 管理の参照(opaque)とする - 返値/引数は「0 = null」を許す(`null` を表す) ### 2.2 Weak handle(token identity) weak の等価性(identity)は backend 差が出にくい token を SSOT として固定する: - `alloc_id + generation` を含む token(概念) - ログ表示も token を使う(例: `WeakRef(#1234:g7)`) 比較(`==`)の扱い: - `WeakRef` の `==` は token 同一性比較(Alive/Dead/Freed に依存しない) ## 3. 関数 ABI(最小契約) 推奨 SSOT: - **args borrowed / return owned** 契約: - 引数は borrowed(callee は retain/release しない) - 戻り値は owned(caller が release 責務を持つ) - borrowed を保存/捕獲/フィールド格納/返す等の “escape” を行う場合のみ、compile 側が acquire(retain)を挿入する ## 4. NyRT lifecycle ABI(最小セット案) ここでは “名前” より契約を SSOT とする(既存の実装名が異なる場合は shim で吸収)。 ### 4.1 strong - `retain(h: BoxHandle) -> BoxHandle` - `h == 0` のときは `0` を返す(no-op) - `release(h: BoxHandle) -> void` - `h == 0` のときは no-op - 物理解放のタイミングは runtime 実装に委譲(言語意味論では規定しない) ### 4.2 weak - `weak_new(h: BoxHandle) -> WeakHandle` - `h == 0` はエラー(または `0` weak を禁止) - `weak_drop(w: WeakHandle) -> void` - `weak_to_strong(w: WeakHandle) -> BoxHandle` - 成功: Alive のときだけ non-null を返す - 失敗: Dead/Freed は `0`(null)を返す ## 5. 非目標(このABIで扱わない) - finalizer の自動実行(RC/GC が勝手に `fini()` を呼ばない) - GCアルゴリズム(cycle回収等)の規定 ## 6. 関連(参考リンク) - ABIの既存ドキュメント(参考): - `docs/reference/abi/nyrt_c_abi_v0.md` - `docs/reference/abi/NYASH_ABI_MIN_CORE.md` - 言語意味論 SSOT(参照のみ): - `docs/reference/language/lifecycle.md`