Files
hakorune/docs/reference/plugin-system/nyash-toml-v2_1-spec.md
Moe Charm cc2a820af7 feat(plugin): Fix plugin BoxRef return and Box argument support
- 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>
2025-08-21 00:41:26 +09:00

2.4 KiB
Raw Blame 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 セクション

[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 で対応)