Files
hakorune/docs/reference/abi/nyrt_c_abi_v0.md

76 lines
2.0 KiB
Markdown
Raw Normal View History

# NyRT C ABI v0 (JIT/AOT/Plugin 共通)
- 命名規則:
- コア: `nyrt_*`
- プラグイン: `nyplug_{name}_*`
- 呼出規約: x86_64 SysV / aarch64 AAPCS64 / Win64Cranelift `call_conv` と一致)
- 型: `i32/i64/u64/double/void*` に限定。`bool``u8`。構造体は不透明ハンドル。
- 互換性: `nyrt_abi_version()` / `nyplug_{name}_abi_version()`v0=1で fail-fast。
## 最小ヘッダ例(コア: nyrt.h
```c
#pragma once
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct NyBox { void* data; uint64_t typeid; uint32_t flags; uint32_t gen; } NyBox;
int32_t nyrt_abi_version(void);
// Box 基本
NyBox nyrt_box_new(uint64_t typeid, uint64_t size);
void nyrt_box_free(NyBox b);
int32_t nyrt_adopt(NyBox parent, NyBox child);
int32_t nyrt_release(NyBox parent, NyBox child, NyBox* out_weak);
NyBox nyrt_weak_load(NyBox weak);
// GC/Safepoint
void nyrt_epoch_collect(void);
// Sync最小
void* nyrt_mutex_lock(NyBox sync);
void nyrt_mutex_unlock(void* guard);
// Bus
int32_t nyrt_bus_send(NyBox port, NyBox msg);
#ifdef __cplusplus
}
#endif
```
## プラグインヘッダ例nyplug_array.h
```c
#pragma once
#include "nyrt.h"
#ifdef __cplusplus
extern "C" {
#endif
int32_t nyplug_array_abi_version(void);
NyBox nyplug_array_new(void);
int32_t nyplug_array_get(NyBox arr, uint64_t i, NyBox* out);
int32_t nyplug_array_set(NyBox arr, uint64_t i, NyBox v);
uint64_t nyplug_array_len(NyBox arr);
#ifdef __cplusplus
}
#endif
```
## AOT静的リンクの流れ
- CLIF から `.o` を出力(未解決: `nyrt_*` / `nyplug_*`)。
- リンクLinux/macOS の例):
```bash
cc app.o -static -L. -lnyrt -lnyplug_array -o app
```
- 実行: `./app`
## 注意
- 例外/パニックの越境は不可(戻り値/エラーコードで返す)。
- C++ 側は必ず `extern "C"`、ELF は `visibility("default")`
- ABI 破壊変更は `*_v1` などの別シンボルで導入v0は凍結