56 lines
2.4 KiB
Markdown
56 lines
2.4 KiB
Markdown
|
|
# nyash.toml v2.1 拡張仕様(最小)
|
|||
|
|
|
|||
|
|
目的: プラグインBoxのメソッド引数として、他のBoxを不透明参照(BoxRef)で安全に受け渡す。
|
|||
|
|
|
|||
|
|
## 変更点(v2 → v2.1)
|
|||
|
|
- メソッド引数型に `kind = "box"` を追加(当面は `category = "plugin"` のみ)
|
|||
|
|
- TLVに BoxRef(Handle)を追加(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/Bool(1/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 で対応)
|