# NyRT C ABI v0 (JIT/AOT/Plugin 共通) - 命名規則: - コア: `nyrt_*` - プラグイン: `nyplug_{name}_*` - 呼出規約: x86_64 SysV / aarch64 AAPCS64 / Win64(Cranelift `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 #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 # 1) NyRT静的ライブラリをビルド (cd crates/nyrt && cargo build --release) # 2) プラグイン静的ライブラリ(必要なもの)をビルド (cd plugins/nyash-array-plugin && cargo build --release) (cd plugins/nyash-string-plugin && cargo build --release) (cd plugins/nyash-integer-plugin && cargo build --release) # 3) ObjectModuleで生成した app.o を NyRT + plugins と静的リンク cc app.o \ -L crates/nyrt/target/release \ -L plugins/nyash-array-plugin/target/release \ -L plugins/nyash-string-plugin/target/release \ -L plugins/nyash-integer-plugin/target/release \ -static -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive \ -lnyash_array_plugin -lnyash_string_plugin -lnyash_integer_plugin \ -o app ``` - 実行: `./app` 補足(Phase 10.2 暫定→10.2b) - `.o` には暫定シム `nyash_plugin_invoke3_i64` が未解決として現れますが、`crates/nyrt` の `libnyrt.a` がこれを実装します。 - 将来的に `nyrt_*` 命名へ整理予定(後方互換シムは残す)。 ## 注意 - 例外/パニックの越境は不可(戻り値/エラーコードで返す)。 - C++ 側は必ず `extern "C"`、ELF は `visibility("default")`。 - ABI 破壊変更は `*_v1` などの別シンボルで導入(v0は当面固定=長期安定化)。