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

84 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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フラグ:
```bash
# 人間向け表示
nyash --backend vm --vm-stats program.nyash
# JSON出力
nyash --backend vm --vm-stats --vm-stats-json program.nyash
```
環境変数(直接指定):
```bash
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.nyash``acceptTimeout/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)` は接続なしで `void``recvTimeout(ms)` は空文字を返す
- 簡易E2E: `local_tests/socket_timeout_server.nyash``socket_timeout_client.nyash`
- Void 比較の扱いVM
- `Void` は値を持たないため、`Eq/Ne` のみ有効。`Void == Void` は真、それ以外の型との `==` は偽(`!=` は真)。
- 順序比較(`<, <=, >, >=`)は `TypeError`
## E2E 実行例HTTPのResult挙動
代表ケースを `tools/run_vm_stats.sh` で実行できます。`--vm-stats-json` により命令プロファイルも取得可能です。
```bash
# 別ターミナルでサーバ起動
./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.md``docs/examples/http_result_patterns.md` を参照。