Phase 20.22 — String/Array C‑ABI(MVP / P1: Deferred unless FFI required)
前提
- Phase 20.21 完了(C‑ABI メモリ管理の SSOT が確立)。
目的(FFI用途)
- C 側へ安全にコピーアウトする最小 API を提供(所有権=呼び出し側)。
- from_c/ビュー(借用)は扱わず、読み出し専用で進める。
ステータス
- セルフホスト優先のため P1(後回し)。FFI が必要になった時点で着手する。
API(MVP)
- 文字列(読み出し専用)
char* hako_string_to_c_copy(HakoHandle str);(caller owns;hako_mem_free必須)
- 配列(i64 限定の最小)
typedef struct { int64_t* data; size_t length; } HakoArrayI64;HakoArrayI64* hako_array_i64_to_c_copy(HakoHandle arr);(caller owns;hako_mem_free(data),hako_mem_free(self))
設計原則
- Box‑First(Opaque Handle 経由のみ)。
- Fail‑Fast: NULL/長さ不整合/OOB は安定タグで失敗。
- 既定OFF・CLI優先。ENVは短命(TTL)。
受入れ基準
.o + .hを C からリンクし、hako_string_to_c_copy/hako_array_to_c_copyが期待どおり動作すること。- quick(opt‑in)にスモーク追加、回帰なし。
範囲外(本フェーズ)
- from_c(C string→Nyash StringBox)。
- ビュー(borrow/ptr+len の寿命管理)。
- 文字コード変換/ロケール依存の扱い。
タイムライン(3–4週間)
- Week1–2: String(copy‑out)実装+スモーク+ヘッダ生成拡張。
- Week3–4: Array(copy‑out)実装+スモーク+負例テスト(NULL/len=0/OOB)。