- Add internal access tracking to distinguish me.field from external.field access - Interpreter correctly allows methods to access their own private fields - VM tracks object class context during method calls for visibility checks - Fix VM nested box declaration collection in collect_box_declarations - Both interpreter and VM now pass all visibility tests consistently Test results: - visibility_ok.nyash: ✅ Internal private access allowed in methods - visibility_error.nyash: ✅ External private access correctly blocked - All private fields accessible from within their own methods - Public fields remain accessible from anywhere 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2.8 KiB
2.8 KiB
BoxRef/Handle Behavior (v2.1–v2.2)
本書は、プラグインBoxの引数/返り値としてのBox参照(BoxRef/Handle)の扱いと、VM/インタプリタ/ローダ/プラグインにまたがる設計上の注意点をまとめます。
1. TLV仕様(BID-1)
- ヘッダ:
ver:u16=1, argc:u16 - エントリ:
tag:u8, rsv:u8=0, size:u16, payload... - 主要タグ:
6 = String(UTF-8),7 = Bytes8 = Handle(BoxRef)→ payload:type_id:u32 + instance_id:u32(計8バイト, LE)2 = I32,3 = I64,1 = Bool,9 = Void
2. nyash.toml(v2.1〜)
- 引数宣言に
args=[{ kind="box", category="plugin" }]を追加可能。 - 例:
[libraries."libnyash_filebox_plugin.so".FileBox.methods] copyFrom = { method_id = 7, args = [ { kind = "box", category = "plugin" } ] } cloneSelf = { method_id = 8 } - ローダは
argsの型宣言に基づいて実引数を検証。型不一致はInvalidArgs。
3. 返り値(v2.2)
- プラグインが
tag=8を返した場合、ローダはtype_idをnyash.tomlで逆引きし、PluginBoxV2 { box_type, type_id, invoke_fn, instance_id, fini_method_id }を構築して返す。
4. VM/インタプリタの扱い
- メソッド呼び出しはローダ経由に統一(TLV/Handle処理もローダ側)。
- MIR Loweringは以下を厳守:
- ユーザー定義Boxのみ関数化(Call)最適化可。
- プラグイン/ビルトインは常に
BoxCallを出す(VMでローダに委譲)。
- VMのBoxRefは共有ハンドルとして扱う:
clone_box()ではなくshare_box()を使用(不意のbirth回避)。
5. プラグイン実装の注意
openのモードによってはreadができない(例: "w")。copyFromはfile.readが失敗したらbufferにフォールバックする。write実装では、成功後にbufferを更新しておくとcopyFromのフォールバックで活きる。- 典型メソッドID(例: FileBox)
0=birth,1=open,2=read,3=write,4=close,0xFFFFFFFF=fini,7=copyFrom,8=cloneSelf
6. トラブルシュート
- rc=-4
Invalid argumentsargs型宣言と実引数が不一致。ローダログの引数エンコードを確認(String化フォールバックが出ていないか)。
- rc=-5
Plugin internal error- プラグイン内部のread/write/lock失敗など。
copyFromのfile→bufferフォールバック不備を疑う。
- プラグイン内部のread/write/lock失敗など。
- rc=-8
Invalid handle- 存在しない
instance_idに対する呼び出し。VMでclone_boxを使っていないか(share_boxへ)。
- 存在しない
7. 参考
- 仕様:
docs/reference/plugin-system/nyash-toml-v2_1-spec.md - 実装:
src/runtime/plugin_loader_v2.rs(引数検証/Handle戻り値復元) - 例:
docs/examples/plugin_boxref_return.nyash