fix(jit): NewBoxのJIT安全化とDebugBox Phase 1実装

- NewBoxのJIT扱いを安全化(src/jit/lower/core.rs)
  - NYASH_USE_PLUGIN_BUILTINS=1 && args.is_empty() かつ StringBox/IntegerBox のみJIT許可
  - ArrayBox/MapBox等のプラグインBoxまたは引数ありはunsupportedとしてカウント
  - unsupported>0の関数はJIT対象外となりVM実行にフォールバック(Segfault回避)

- DebugBox Phase 1実装(JITトレース機能)
  - tracePluginCalls(bool)でJITシムトレースON/OFF
  - getJitEvents()で直近のJITイベント取得
  - src/jit/shim_trace.rs追加でトレース基盤実装

- Printのサポート
  - PrintはJIT非対応に戻しVM経路で確実に出力(出力消失解消)

- テストとサンプル追加
  - examples/jit_plugin_invoke_param_array.nyash: 最小JITスモークテスト
  - examples/py_result_*.nyash: Python plugin結果チェーン処理デモ

- PyRuntimeBox拡張
  - str()メソッドでPyObjectのstring表現を取得可能に
  - エラーハンドリング改善とResultチェーンサポート

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-08-29 13:46:18 +09:00
parent a9e82933cc
commit 3d8ba3f3ec
26 changed files with 1384 additions and 100 deletions

View File

@ -73,15 +73,26 @@ Phase 10.10 は完了DoD確認済。**重大な発見**:プラグイン
- `PyRuntimeBox.birth()` 正常実行instance_id=1
- VM側委譲: `PluginBoxV2` メソッドを `PluginHost.invoke_instance_method` に委譲BoxCallでも実体plugin_invoke実行
- E2Eデモ: `py.import("math").getattr("sqrt").call(9).str()` がVM経路で実行`examples/py_math_sqrt_demo.nyash`
- R系API: `evalR/importR/getattrR/callR/callKwR` がResultOk/Errで安定エラーメッセージの保持確認済
- 自動デコードオプトイン: `NYASH_PY_AUTODECODE=1` eval/getattr/call/callKw の数値/文字列/bytesがTLVで直接返る
- kwargs対応: `callKw` 実装TLVで key:string value のペア)、`examples/py_kw_round_demo.nyash` を追加builtins.intで検証
### JIT強化10.2 連携の下ごしらえ)
- 追加: i64シムの戻りdecode拡張I32/I64/Bool/F64[暫定]
- 追加: f64専用シム `nyash_plugin_invoke3_f64` `emit_plugin_invoke` 切替ENV=`NYASH_JIT_PLUGIN_F64`
- 目的: Python含むプラグインのROで数値/Bool/f64選択)」戻りをJIT/AOT経路で受ける足場を整備
- 追加: シムトレースENV=`NYASH_JIT_SHIM_TRACE=1`)とカナリー検査(出力バッファのオーバーラン検出)
- 追加: レシーバ自動解決フォールバックa0<0時はVM引数を走査してPluginBoxV2を特定
### 方針決定Built-inとの関係
- いまはビルトインBoxを削除しない余計な変更を避けプラグイン優先の運用で干渉を止める
- テストCIをプラグイン経路に寄せ十分に安定してから段階的に外す
### 次アクション(小さく通す)
1) Loaderのエンコード強化v2: Bool/F64/BytesArray<u8>)を正式サポート → kwargsや一般引数を堅牢化
2) 戻り値自動デコード(オプトイン): `NYASH_PY_AUTODECODE=1` 設計(数値/文字列/bytesのTLV変換。段階的に導入。
3) 例外のResult化: returns_resultの扱い整理成功文字列とエラー文字列の判別手段の仕様化
1) DebugBoxPhase 1: JITシムイベント取得getJitEvents/プラグイン呼び出し履歴トレースtracePluginCalls
2) JIT typedシムの拡張: f64の自動選択Lowerer型ヒント)→ Handle/String返却シムの導入ハンドルID/文字列返却
3) AOTスモーク: Python数値戻りの .o 生成をもう1本追加f64/Bool/i64いずれか
4) ガイド: R系APIとNYASH_PY_AUTODECODEの使い分けJITシムトレースの使い方を追記
## すぐ試せるコマンド(現状維持の確認)
```bash
@ -123,6 +134,13 @@ NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_math_sqrt_de
# kwargsデモbuiltins.int
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_kw_round_demo.nyash
# 自動デコードevalの数値/文字列が直接返る)
NYASH_PY_AUTODECODE=1 NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_eval_autodecode_demo.nyash
# JITf64戻りのシム選択: type_id:method_id を指定)
# 例: PyObjectBox.callR(=12) を f64 扱いにする(実験用)
NYASH_JIT_PLUGIN_F64="41:12" NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_math_sqrt_demo.nyash
# kwargsデモbuiltins.int
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_kw_round_demo.nyash