Files
hakorune/docs/VM_README.md
Moe Charm 2949648e71 fix: MIR builder me resolution for static box methods
- Fixed me ValueId inconsistency in static box methods
- Previously, each me reference generated a new const __me__ ValueId
- Now caches the first me ValueId in variable_map for reuse
- This ensures RefSet and RefGet operate on the same object
- ArrayBox get/set/push now working correctly in VM mode
- Test results: 1, 42, 3 (as expected)

🔧 Technical Details:
- build_me_expression() now stores fallback ValueId in variable_map
- Subsequent me references reuse the same ValueId
- VM BoxCall debug logs confirm ArrayBox methods dispatch correctly

Co-Authored-By: ChatGPT5
Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-23 21:13:02 +09:00

4.2 KiB
Raw Blame History

Nyash VM 実行基盤ガイド(更新)

  • プラグインBox引数の最小対応を追加TLV: BoxRef
  • TLVタグ: 1=Bool, 2=I32, 3=I64, 4=F32, 5=F64, 6=String, 7=Bytes, 8=Handle(BoxRef)
    • BoxRefはプラグインBox参照type_id:u32, instance_id:u32を8バイトでエンコード
    • ユーザー定義Box・複雑なビルトインは当面非対応toStringフォールバック

現状のルーティング:

  • User-defined: MIR関数{Box}.{method}/{N}) にCall化関数存在時。それ以外はBoxCall。
  • Builtin: BoxCall → VM内の簡易ディスパッチ。
  • Plugin: BoxCall → PluginLoaderV2.invoke_instance_method。

今後のタスク:

  • VM側のfrom Parent.method対応Builder/VM両対応
  • TLVの型拡張Float/配列/BoxRef戻り値など

🧮 VM実行統計NYASH_VM_STATS / JSON

VMは命令カウントと実行時間を出力できます。

使い方CLIフラグ:

# 人間向け表示
nyash --backend vm --vm-stats program.nyash

# JSON出力
nyash --backend vm --vm-stats --vm-stats-json program.nyash

環境変数(直接指定):

NYASH_VM_STATS=1 ./target/debug/nyash --backend vm program.nyash
NYASH_VM_STATS=1 NYASH_VM_STATS_JSON=1 ./target/debug/nyash --backend vm program.nyash
# 代替: NYASH_VM_STATS_FORMAT=json

出力は total(総命令数), elapsed_ms(経過時間), counts(命令種別→回数), top20上位20種を含みます。

既知の制約とTipsVM×プラグイン

  • NetプラグインHTTP
    • unreachable接続不可/タイムアウト)は Result.Err(ErrorBox)
    • HTTP 404/500 は Result.Ok(Response)(アプリ側で response.status を確認)。
    • デバッグ: NYASH_NET_LOG=1 NYASH_NET_LOG_FILE=net_plugin.log
  • FileBox
    • close()Ok(Void)match Ok(_) で受けるか、戻り値を無視してよい。
  • HandleBoxRef戻り
    • TLV tag=8type_id:u32, instance_id:u32。Loaderが返り値typeに対応する fini_method_id を設定し PluginBoxV2 を構築。
    • scope_tracker がスコープ終了時に fini() を呼ぶ(メモリ安全)。
  • 大きいボディ/多ヘッダー/タイムアウト
    • 逐次拡張中。異常時の挙動は上記Result規約に従う。実行ログと --vm-stats を併用して診断。
  • 反復タイムアウト: local_tests/socket_repeated_timeouts.nyashacceptTimeout/recvTimeout の連続ケース確認
  • BoxCallデバッグ: NYASH_VM_DEBUG_BOXCALL=1 でBoxCallの受け手型・引数型・処理経路enter/fastpath/unified・結果型をstderr出力
    • 例: NYASH_VM_DEBUG_BOXCALL=1 ./target/release/nyash --backend vm local_tests/test_vm_array_getset.nyash
  • SocketBoxVM
    • 基本API: bind/listen/accept/connect/read/write/close/isServer/isConnected
    • タイムアウト: acceptTimeout(ms) は接続なしで voidrecvTimeout(ms) は空文字を返す
    • 簡易E2E: local_tests/socket_timeout_server.nyashsocket_timeout_client.nyash
  • Void 比較の扱いVM
    • Void は値を持たないため、Eq/Ne のみ有効。Void == Void は真、それ以外の型との == は偽(!= は真)。
    • 順序比較(<, <=, >, >=)は TypeError

E2E 実行例HTTPのResult挙動

代表ケースを tools/run_vm_stats.sh で実行できます。--vm-stats-json により命令プロファイルも取得可能です。

# 別ターミナルでサーバ起動
./target/release/nyash local_tests/http_server_statuses.nyash

# クライアント(別ターミナル)
tools/run_vm_stats.sh local_tests/vm_stats_http_ok.nyash vm_stats_ok.json
tools/run_vm_stats.sh local_tests/vm_stats_http_404.nyash vm_stats_404.json
tools/run_vm_stats.sh local_tests/vm_stats_http_500.nyash vm_stats_500.json

# 到達不能(サーバ不要)
tools/run_vm_stats.sh local_tests/vm_stats_http_err.nyash vm_stats_err.json

期待されるResultモデル

  • unreachable接続不可/タイムアウト): Result.Err(ErrorBox)
  • 404/500 等のHTTPエラー: Result.Ok(Response)(アプリ側で response.status を評価)

詳細: docs/reference/architecture/mir-to-vm-mapping.mddocs/examples/http_result_patterns.md を参照。