- Fixed deadlock in FileBox plugin copyFrom implementation (single lock) - Added TLV Handle (tag=8) parsing in calls.rs for returned BoxRefs - Improved plugin loader with config path consistency and detailed logging - Fixed loader routing for proper Handle type_id/fini_method_id resolution - Added detailed logging for TLV encoding/decoding in plugin_loader_v2 Test docs/examples/plugin_boxref_return.nyash now works correctly: - cloneSelf() returns FileBox Handle properly - copyFrom(Box) accepts plugin Box arguments - Both FileBox instances close and fini correctly 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2.4 KiB
2.4 KiB
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バイト)
- payload:
- 既存タグは不変:1=Int64, 2=String(UTF-8), 3=Bool
例: libraries セクション
[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を生成して返す
- payload:
互換性
args宣言がない既存v2設定はそのまま利用可- BoxRefを使わないメソッドは従来通り Int/String/Bool のみで動作
実装メモ(参考)
- Loader: invoke時の引数エンコードに
tag=4を追加(category=pluginのみ) - プラグイン側: 受領した
type_idと期待型を照合し、不一致ならエラー - 所有権: 呼び出し中の一時借用(保持は将来の retain/release で対応)