# 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)。