46 lines
2.3 KiB
Markdown
46 lines
2.3 KiB
Markdown
# 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)。
|
||
|