Files
hakorune/docs/reference/plugin-system/nyash-toml-v2_1-spec.md

56 lines
2.4 KiB
Markdown
Raw Normal View History

# nyash.toml v2.1 拡張仕様(最小)
目的: プラグインBoxのメソッド引数として、他のBoxを不透明参照BoxRefで安全に受け渡す。
## 変更点v2 → v2.1
- メソッド引数型に `kind = "box"` を追加(当面は `category = "plugin"` のみ)
- TLVに BoxRefHandleを追加tag = 8
- payload: `type_id: u32 (LE)`, `instance_id: u32 (LE)`合計8バイト
- 既存タグは不変1=Int64, 2=String(UTF-8), 3=Bool
## 例: libraries セクション
```toml
[libraries]
[libraries."libnyash_filebox_plugin.so"]
boxes = ["FileBox"]
path = "./target/release/libnyash_filebox_plugin.so"
[libraries."libnyash_filebox_plugin.so".FileBox]
type_id = 6
abi_version = 1
[libraries."libnyash_filebox_plugin.so".FileBox.methods]
# 既存
birth = { method_id = 0 }
open = { method_id = 1 }
close = { method_id = 4 }
# 追加例: Box引数を1つ受け取る
copyFrom = { method_id = 7, args = [ { kind = "box", category = "plugin" } ] }
```
備考:
- `args` を省略した場合は引数なしゼロ引数とみなすv2互換
- 複数引数は配列で列挙(例: 2引数なら2要素
- ユーザー定義Boxや複雑なビルトインBoxは当面対象外将来のvtable/retain-release設計で拡張
## 呼び出し時のTLVエンコード
- 先頭ヘッダ `[ver:1, argc:1, rsv:2]` の後、各引数を `tag + payload` で列挙
- `tag=8 (Handle/BoxRef)`: payload = `type_id(4) + instance_id(4)` LE
- 未対応Box種別に対してはエラーを返す開発時のみ toString フォールバックを許容可能)
## 戻り値v2.1→v2.2
- v2.1: Int/String/Bool1/6/3とVoid(9)
- v2.2: BoxRef(Handle, tag=8) の「返り値」対応を追加(同一/別Box型どちらも可
- payload: `type_id:u32` + `instance_id:u32`
- Loaderは `type_id` から `lib_name/box_name` を逆引きし、`PluginBoxV2` を生成して返す
## 互換性
- `args` 宣言がない既存v2設定はそのまま利用可
- BoxRefを使わないメソッドは従来通り Int/String/Bool のみで動作
## 実装メモ(参考)
- Loader: invoke時の引数エンコードに `tag=4` を追加(`category=plugin` のみ)
- プラグイン側: 受領した `type_id` と期待型を照合し、不一致ならエラー
- 所有権: 呼び出し中の一時借用(保持は将来の retain/release で対応)