Phase 20.21 — Manual Memory Management(C‑ABI/MVP)
目的
- C‑ABI におけるメモリ管理の単一規約(SSOT)を定義し、安全な最小APIを提供する。
- 将来の hakmem(独自アロケータ)統合を見据えつつ、既定は libc(malloc/free)で運用する。
設計原則
- 既定OFF・Fail‑Fast・SSOT(ドキュと実装を一致)。
- Box‑First(Opaque Handle で境界を切る): C から内部表現(Box/GC)に触れさせない。
- 段階導入: MVP はコピー/解放の最小規約に限定(ビュー/借用は次フェーズ)。
API(MVP)
- 低レベル(libc 既定)
void* hako_alloc(size_t size);void hako_free(void* ptr);// optional: void* hako_realloc(void* ptr, size_t new_size);(後回し推奨)
- Opaque Handle(将来の Box/GC を見据える)
typedef uint64_t HakoHandle;HakoHandle hako_retain(HakoHandle h);(ref++/atomic)void hako_release(HakoHandle h);(ref--→0で解放)
所有権ルール(SSOT)
- 返却された C バッファ(
void*/文字列/配列)は呼び出し側の所有。呼び出し側がhako_freeで解放。 - 入力ポインタの所有権は関数が奪取しない(unless 明示)。
- Handle は「所有=参照カウント保有」と定義。
retain/releaseでカウント管理。
実装方針
- 既定: libc(malloc/free)。
- 切替:
HAKO_C_ABI_ALLOC={libc|hakmem}(既定 libc、hakmem は将来の差し替え点)。 - 並行性: retain/release は atomic。競合時は Fail‑Fast で診断。
受入れ基準
- スモーク: alloc→write→free の基本、二重解放の Fail、NULL 安全。
- (任意)ASan/Valgrind オプトインでリーク/double‑free を検出。
- ドキュ: ルール・API・ENV・エラーポリシーを SSOT に記載。
範囲外(本フェーズ)
- 借用ビュー(ptr+len)の提供。
- from_c(C 文字列から Nyash 文字列へ)の所有権問題。
- OS/プラットフォームごとの可視性(次以降)。
タイムライン(2–3週間)
- Week1: API スケルトン+libc 実装+最小スモーク。
- Week2: ドキュ仕上げ+ASan/Valgrind スモーク(任意)+hakmem 差し替え導線(ENV)。