tasks: update CURRENT_TASK with containment plan; add minimal VM drivers for JSON roundtrip/null and scanner is_eof tracing

This commit is contained in:
nyash-codex
2025-09-26 14:17:16 +09:00
parent cf4b615afb
commit ecd46161b3

View File

@ -7,6 +7,229 @@ Quick status
- Smokes v2: quick/core PASS、integration/parity PASSPython LLVM harness
- Parser: TokenCursor 統一 Step2/3 完了env ゲート)
- PHI: if/else の incoming pred を exit ブロックへ修正VM 未定義値を根治)
- Resolver: using 先を DFS で事前ロードする共通ヘルパー導入common/vm_fallback 両経路で `resolve_prelude_paths_profiled` を採用済み)
- LoopForm: ループ低下を LoopBuilder 正規形preheader→header(φ)→body→latch→exitに統一cf_loop 経由)
Todays update20250927 pm
- LoopForm if 入口の PHI 入力を pre_if スナップショット参照に固定then/else の相互汚染を禁止)。
- if トレース追加(`NYASH_IF_TRACE=1`: then/else 入口PHI・合流PHIの var/pre/dst/preds を可視化。
- VM InstanceBox dispatcher 強化BoxCall→関数
- 候補順: `Class.method/Arity``ClassInstance.method/Arity``Class.method/(Arity+1)` → 一意な「`.method/Arity`」末尾一致。
- `toString/0``stringify/0` 特別フォールバック。
- 追跡ログ: `NYASH_VM_TRACE=1` で候補・命中名を出力。
- JsonScanner のフィールド getField 補強(内部が Null/None の場合に開発用デフォルトを適用)。
- ビルダー側のインスタンス書き換えは既定OFF、検証時のみ `NYASH_BUILDER_REWRITE_INSTANCE=1` で有効化。
追加の微修正20250927 late
- JsonParser.parse/1 の戻り型を安定化Builder 注釈)
- `annotate_call_result_from_func_name` に特例を追加し、署名が Unknown/Void の場合でも `MirType::Box("JsonNode")` を付与。
- 署名が取得できない場合も最小ヒューリスティックで同注釈を適用Builder DEBUG ログ対応)。
- VM InstanceBox ディスパッチの一意尻一致フォールバックをナローイング
- 多候補時は受け手クラス接頭(`<Class>.`/`<Class>Instance.`で再絞り込み、1件ならヒットとする。
- `NYASH_VM_TRACE=1` でナローイング経路をログ出力。
微修正20250927 latelate
- VM: `length` 呼出しのディスパッチ簡易ログを追加(`NYASH_VM_TRACE=1` 時のみ)
- 受け手型の表示と、命中したハンドラobject_fields / instance_box / string_box / array_box / map_box / fallbackを出力。
- 目的: Compare(Lt) 直前で RHS が Void になる事象の切り分け(どの経路で 0/未定義になっているか)。
- Builder: メソッド呼出しの受け手receiverを追加で pin`@recv`)。
- `handle_standard_method_call` の先頭で `pin_to_slot` を適用し、条件式内での分岐横断利用でも定義点が安定するよう補強。
封じ込め20250927 night
- 関数側 tail 一意解決を既定OFF`NYASH_BUILDER_TAIL_RESOLVE=1` でのみ有効化)
- me.method() を囲み Box 名で優先バインド(曖昧関数化の抑止)
- 戻り型注釈の追加:
- `JsonParser.current_token/0``Box(JsonToken)`
- `JsonTokenizer.tokenize/0``Box(ArrayBox)`
- VM 狭域ガードJsonParser.length → tokens.length() ブリッジ(開発用)
- VM 受信時の JsonScanner デフォルト注入(開発用)
スモーク(抜粋)
- `json_nested_vm.sh` は PASSdev+AST
- `json_roundtrip_vm.sh` は FAILGe on Void, Void→ is_eof で position/length の Void が混入
次のアクションWIP 計画)
1) getField 最終安全弁の狭域強化(呼び出し元関数が `JsonScanner.is_eof/0` の場合に position/length を補う)
2) 追加の注釈と pin/PHI を Builder に最小追加merge 直前の Undefined を撲滅)
3) 緑化後、VM 狭域ブリッジJsonParser.length/JsonScanner デフォルト)を撤去
最小再現ドライバ(追跡用)
- 追加: `tmp/json_rt_null_vm.nyash`JSON null のVMラウンドトリップ
- 追加: `tmp/json_scanner_is_eof_min.nyash`Scanner 単体で `is_eof` 経路を観測)
本日後半 — Builder 書き換えの既定dev/ci
- 変更: MirBuilder のインスタンス→関数書き換えを dev/ci プロファイルで既定ON、prodは既定OFFのまま。
- 明示オーバーライド: `NYASH_BUILDER_REWRITE_INSTANCE={1|true|on}` で強制ON、`{0|false|off}` で強制OFF。
- 実装: `src/mir/builder/method_call_handlers.rs` 内の `rewrite_enabled` 判定を `using_profile` に連動させた。
- 目的: VM 側の JsonNodeInstance 狭域ブリッジ撤去に向けた段階移行。既定挙動prodは不変。
- 観測: `arithmetic_ops` は PASS。JSON VM 系は従前の失敗が残存(今回の切替による悪化は未観測)。
続き — VM 狭域ブリッジJsonNodeInstanceの撤去第一弾
- 変更: `try_handle_instance_box` から JsonNodeInstance 固有の分岐(`array_push/array_size/object_{get,set,keys}`)を削除。
- File: `src/backend/mir_interpreter/handlers/boxes.rs`(約 527 行〜)
- 依存: Builder のインスタンス→関数書き換え既定ONdev/ci VM 側の汎用インスタンスディスパッチで代替。
- birth の no-op は維持Builder が明示生成する birth 呼び出しの互換保険)。
- 結果: `json_roundtrip_vm.sh` / `json_nested_vm.sh` は PASS を維持dev+AST
- 次: quick を通しで再確認 → 問題なければ stringify/unique-tail のナローイング経路のログも静音filter側→ 残るVM特例を段階撤去。
SSOT 徹底 — file using を全プロファイル既定禁止(パッケージ内のみ許容)
- 変更: `src/config/env.rs::allow_using_file()` をデフォルト false に(明示オーバーライドのみ true
- 変更: `collect_using_and_strip()` に「パッケージ内ソースの内部 file-using は許容」の例外を追加package root 配下のファイルに限る)。
- 効果: メイン/アプリ側は必ず `nyash.toml` の packages/aliases 経由で参照。パッケージ実装内部は相対/明示パスで自己構成可能。
- スモーク更新:
- `using_profiles_ast.sh`: dev でも file-using 禁止を期待に変更。
- `using_relative_file_ast.sh`: 相対パス → alias 参照に変更(パッケージ相対)。
- LLVM 経路: `runner/modes/llvm.rs` に AST using 処理と PyVM フォールバックSMOKES_USE_PYVM=1を追加。
- 既知: VM quick の JSON ラインで "Integer vs Void" 比較が再発(サンプルループの `length()` が Void になるケース。LoopForm/IF の構造は維持済みで、ArrayBox の `length` 実装は存在。次のデバッグで Compare 発生点length の解決経路)をトレースして原因を特定する。
リファクタリング計画(ふるまい不変・段階)
- 目的: 追跡容易化とソース整頓(根治パッチの前段)。挙動は変えない。
- ステップ:
1) VM handlers の分割boxes.rs の肥大解消)
- 抽出: `try_handle_array_box` / `try_handle_string_box` / `try_handle_map_box` を個別ファイルへ。
- 影響: 関数名・シグネチャは不変。呼び出し元handle_box_callは変更なし。
2) getField 既定JsonScanner の最終フォールバック)を専用箇所に集約(現状ロジックは不変)。
3) トレース整備: compare 失敗ログに関数名/ブロック/最後の命令を出力済み。length 呼出し経路の型ログを追加予定。
- 受け入れ: quick が従前と同等(現状の赤は赤のまま)。差分は構造とログのみ。
直近の受け入れ確認(要再実行)
- 単体ドライバ: `r = JsonParser().parse("{\"a\":1}"); print(r.toString())``JsonNode.stringify/0` に命中VM トレースで確認)。
- v2 quick: `NYASH_USING_PROFILE=dev NYASH_USING_AST=1 bash tools/smokes/v2/profiles/quick/core/json_roundtrip_vm.sh` が完走。
Resolved — Integer stringify shortens (42 → 4)
- Symptom: In JSON VM quick, the integer sample "42" prints as "4" while other types (null/bool/float/array/object) stringify correctly.
- Hypotheses:
- Value truncation during convert_number → create_int flow, or parse_integer returns incorrect value in some path.
- Field bridging is not the culprit (InstanceBox getField/setField already maps NyashValue::Integer i64 correctly), but will confirm via trace.
Fix (20250927):
- Root cause: StringUtils.parse_integer parsed only the first digit; multi-digit accumulation was incorrect.
- Patch: Rewrote perdigit loop using an index_of lookup over "0123456789" and `acc = acc * 10 + d`; kept sign handling and integer validation.
- Also unified stringify(int) on both static/instance JsonNode to use `me.value.toString()`.
- Result: Minimal drivers A/B now print "42"; `json_roundtrip_vm` passes under dev+AST.
Open item — json_nested_vm (VM) fails (debug in progress)
- Symptom (quick/core/json_nested_vm.sh):
- Expected: `[1,[2,3],{"x":[4]}]`, `{\"a\":{\"b\":[1,2]},\"c\":\"d\"}`, `{\"n\":-1e-3,\"z\":0.0}`
- Actual: `null` for all three samples under VM path (AST counterparts pass)
- Notes:
- Earlier, a stray semicolon at block endings triggered a tokenizer parse error. For smoke stability only, we added a dev-only ASI-like strip in test_runner to remove trailing `;` before VM run (SMOKES_ASI_STRIP_SEMI=1 default). After that, error turns into `null` results => true parse failures remain.
- AST-based tests for nested JSON pass; issue is specific to VM execution path for nested structures.
- Hypotheses:
1) Number tokenization edge (exponent + sign: `-1e-3`, `0.0`) in VM path.
2) Nested object/array boundary handling (Tokenizer.read_string_literal / read_number / structural tokens) differs under VM fallback.
3) validate_number_format too strict in VM path relative to AST expectations.
- Plan (do not force green; debug methodically):
1) Repro with diagnostic driver printing parser errors per sample (`p.print_errors()`).
2) Enable targeted traces: `NYASH_VM_TRACE=1`, optional tokenizer-local prints if needed.
3) Inspect JsonTokenizer.read_number and validate_number_format for exponent and decimal handling; align with AST behavior.
4) Fix narrowly (number validation or structural token sequence) and re-run only json_nested_vm; then re-run quick profile.
- Acceptance:
- json_nested_vm prints expected three lines; no other quick tests regress.
現状観測after fixes
- 未定義PHIは解消。`r.toString()` 出力が `JsonNodeInstance()` のまま残るケースあり。
- `object_set` 呼び出しも VM 側で動的解決の一意尻一致フォールバックを追加済みだが、引っかからないケースがある(受け値の型/起源が落ちている可能性)。
JSON VM 根治WIP
- 症状: `json_roundtrip_vm`VM fallback`TypeError: unsupported compare ... on Void` で停止(以前は `Integer vs Void`、現在は `Void vs Void` まで改善)。
- 原因(一次): ユーザー Box のフィールドが VM 側の外部マップobj_fieldsに保存され、インスタンス同一性の継ぎ目で取りこぼすことがある。
- 施した修正(最小・仕様不変):
- VM インタープリタ `getField/setField` を優先的に `InstanceBox` の内部フィールド(`fields_ng: NyashValue`)へ委譲。
- NyashValue ↔ VMValue の最小ブリッジを実装(数値/真偽/文字列/Null→Void
- dev 導線: `NYASH_VM_VERIFY_MIR=1` で VM fallback 前に関数単位の MIR 検証(`MirVerifier.verify_function`)を走らせてヒントを出力。
- 現状の観測:
- `JsonScanner.birth` による `length/line/column/position` 初期化は安定min 再現で確認)。
- `json_roundtrip_vm` は別箇所(比較)で Void が混入。未初期化フィールドNull→Voidまたは merge 付近の値流れの可能性。
- 次の対処(局所・点修正で緑化):
1) Verifier ログで該当関数の merge/支配関係違反を特定dev 環境のみ)。
2) 比較/条件構築のピン不足箇所に `ensure_slotified_for_use` を追加(漏れ潰し)。
3) 必要なら「スキャナの数値系フィールド」の既定値0/1を dev フラグ下で補う(`NYASH_VM_SCANNER_DEFAULTS=1` 追加検討)。
4) 緑化後に dev 安全弁Void 許容)を撤去/既定 OFF 固定。
受け入れ: `tools/smokes/v2/profiles/quick/core/json_roundtrip_vm.sh` が dev/prodAST usingで緑。
追加タスク(インスタンス呼び出しの最終詰め)
- 目的: `JsonNode.stringify/0` / `JsonNode.object_set/2` などが確実に関数呼びに正規化され、`JsonNodeInstance()` 表示が JSON 文字列へ置換されること。
- 手順(診断→修正の順):
1) 単体ドライバでトレース取得:
- 実行: `NYASH_VM_TRACE=1 NYASH_BUILDER_REWRITE_INSTANCE=1``instance-dispatch class=... method=toString/0` 等の候補/命中ログを確認。
- 関数表: `NYASH_DUMP_FUNCS=1`vm_fallback`JsonNode.stringify/0` / `JsonNode.object_set/2` の存在確認。
2) 命中しない場合:
- `handle_box_call``recv` の型名(`recv_box.type_name()`をログ出し、InstanceBox 判定漏れを特定。
- 末尾一致の一意解決が多候補なら、`JsonNode` 系に限定するナローイングを追加。
3) 緑化確認: `json_roundtrip_vm.sh` が期待出力に一致。
受け入れ基準(今回のスライス)
- if/LoopForm の入口PHIが常に pre_if スナップショットから生成される(`NYASH_IF_TRACE=1` で確認)。
- `json_roundtrip_vm` が VM で完走し、 `JsonNodeInstance()` ではなく JSON 文字列を出力。
- VM トレースで `instance-dispatch hit -> JsonNode.stringify/0` 等の命中が確認できる。
根治テーマ(新規) — birth 呼び出しの責務分離と生成位置の是正
問題の本質(層の責務分離違反)
- 現状(暫定パッチ):
- VM 実行器が `NewBox` 実行時に自動で `birth` を探して呼び出す(`handle_new_box` 内で `Class.birth[/Arity]` を探索・実行)。
- 目的はユーザー Box の初期化だが、これは本来コンパイラMIR ビルダー)の責務。
- 正しい設計:
- using 層/コンパイラが `new MyBox(args)` を MIR へ明示展開する。
- 期待する MIR 例:
- `dst = NewBox MyBox(args...)`
- `Call { callee = Global("MyBox.birth/N"), args = [dst, args...] }`
- 以後 `dst` を使用
- VM 実行器は MIR を忠実に実行するだけ(自動 birth 呼び出しは不要)。
- リスク(現状パッチの副作用):
- 層を跨いだ肩代わりで制御不能(無限再帰/二重初期化/順序依存の温床)。
- デバッグ困難化birth 呼び出しが MIR に現れない)。
方針(根治)
1) MIR ビルダー側で `new` の正規展開を実装birth 明示呼び出しの生成)
- 対象: `ASTNode::New`(既存の new ノード)または同等の生成箇所。
- 生成:
- `dst = NewBox <Class>(args...)`
- 存在する場合: `Call Global("<Class>.birth/N"), argv = [dst, args...]`
- birth 不存在時は Call を省略(既存互換)。
- 併せて、ユーザー定義メソッドの関数名規約 `<Class>.<method>/<Arity>` に統一し、birth 検索も同規約で行う。
2) VM 実行器の自動 birth 呼び出しを段階的に撤去
- StepA即時: dev フラグで既定 OFF`NYASH_VM_AUTO_BIRTH=0` 既定)。
- StepBビルダー実装安定後: 自動呼び出しコードを削除。
3) 付随の整合
- 静的名→インスタンス別名(`JsonNode``JsonNodeInstance`)の alias は vm_fallback の簡易ファクトリで保持(当面)。
- 将来は宣言解析で静的/インスタンスの関連付けを明示して alias 依存を解消。
テスト計画 / 受け入れ条件
- MIR 生成の確認:
- `--dump-mir`/`NYASH_VM_TRACE=1``NewBox <Class>` の直後に `Call <Class>.birth/N` が現れる。
- VM 実行ログからは `handle_new_box` 内での自動 birth 呼び出しが消えている(実行器は NewBox のみ)。
- 機能スモーク:
- `json_roundtrip_vm` が dev/prodAST usingで完走。少なくとも null/bool/int/string の基本ケースが期待出力。
- `new JsonParser()` などのユーザー Box 生成で未初期化フィールド由来の Void 混入が再発しない。
- 回帰抑止:
- birth 不存在な Box でも従来通り動作Call を生成しない)。
作業ステップ(詳細)
1) Builder: `new` 正規展開
- ファイル: `src/mir/builder/exprs.rs``ASTNode::New` 分岐)、必要なら専用モジュール。
- 実装: NewBox emit → `module.functions``<Class>.birth/N` を探索 → あれば Global Call emit先頭 arg に me=dst
- 備考: 既存の「メソッド→関数」低下 (`lower_method_as_function`) の規約に合わせる。
2) VM: 自動 birth を dev 既定 OFF に変更 → 後で削除
- ファイル: `src/backend/mir_interpreter/handlers/boxes.rs``handle_new_box`)。
- StepA: `if env(NYASH_VM_AUTO_BIRTH)==1 のみ` birth を試行(既定 0
- StepB: Builder 安定後に完全削除。
3) スモーク/検証の整備
- 新規: mini birth 展開テスト(`new Box(x);``NewBox``Call birth` が生成されるか)。
- 既存: `json_roundtrip_vm` / `mini_call_starts_with` を AST usingdev/prodで確認。
リスクとロールバック
- 万一 Builder 実装で birth が生成されない場合でも、dev では env=1 で VM 自動 birth を一時的に再有効化可能。
- ただし最終到達点は VM 自動 birth の完全撤去。CURRENT_TASK で管理し段階的に外す。
MIR/VM 進捗SSA/短絡/ユーザーBox
- 短絡(&&/||: 分岐+PHI で正規低下RHS 未評価)を実装済み。
@ -23,6 +246,54 @@ MIR/VM 進捗SSA/短絡/ユーザーBox
- 観測: 関数一覧に `JsonScanner.current/0` が存在しないケースがある(環境差/順序の可能性)。
- 以前の実行では `JsonScanner.current/0` が列挙されていたため、低下順または条件分岐の取りこぼしが疑わしい。
## 方向修正(複雑性の抑制と安定化) — 20250927
- 遅延注釈・保険フック・VM 側の大改造は一旦見送り、シンプルな導線で解消する。
- 根治の順序:
1) Resolver 強化nested using を DFS で AST 事前ロード)
2) 低下順の一貫化(宣言インデックス後に関数群が常に materialize
3) 書き換えは「関数存在」の一点で採否(既に実装済み)
4) 必要箇所のみ LoopFormBuilder 側、flag 付き)
ロールバック(安定化のため)
- VM インタプリタの一時変更は元に戻す:
- obj_fields のキー安定化Arc ptr ベース)を撤回し、暫定的に従来挙動へ復帰。
- host_api の BoxRef → NyashValue 変換や戻り値の挙動変更は撤回(既定の最小仕様に戻す)。
- 目的は無限ループ/非停止の芽を確実に摘むこと(後段の Resolver 強化で書き換えが安定すれば、ここを再度検討可能)。
次のステップ(最小)
1) 上記ロールバックを反映して quick/core JSON を再実行(ハングがないことの確認)。
2) Resolver: using 先の再帰nestedを DFS で事前 AST 化し、その結果を `index_declarations` 前に連結。
3) `NYASH_DUMP_FUNCS=1``JsonScanner.current/0` の存在、`NYASH_BUILDER_DEBUG=1` で userbox 書き換え採用ログを確認。
4) json_roundtrip_vm を再実行。完走したら、VM 側の臨時ガードや余計な保険を段階的に外す。
受け入れ条件(このスライス)
- nested using の AST 事前ロードにより依存関数が常に materialize。
- userbox 書き換えは「関数存在」の一点で採否(ブレなし)。
- json_roundtrip_vm が完走(無限ループなし)。
- 遅延注釈・保険フックなどの複雑化を増やしていない。
## 根治戦略(確定方針)
結論:
- 制御フロー/SSA の根治は OptionBLoopForm 導入)が本命。
- ただし今回の「起源未伝搬→書き換え不発」は依存解決/宣言順の問題が主因のため、まず Resolver 側を確立し、その上で LoopForm を段階導入する。
進め方(順序)
1) Resolver 根治(小規模・点修正) — ✅ 20250927 実装済み
- `resolve_prelude_paths_profiled` を canonicalize+DFS 化し、common/vm_fallback 両経路で採用。
- nested using も AST 事前ロードに含まれるよう整理済み(書き換えは既存の「関数存在」基準を継続)。
2) LoopFormPHI根治 — ✅ 20250927 既定経路へ切替
- 低下経路を loop_api(簡易) から LoopBuilder正規形: preheader→header(φ)→body→latch→exitに統一。
- 変更: `src/mir/builder_modularized/control_flow.rs::build_loop_statement``self.cf_loop(..)` に切替。
- 既存の `src/mir/loop_builder.rs` + `mir/phi_core/loop_phi.rs` の φ 生成/封止を活用continue/break の取り込みと latch wiring を保証)。
- 目的: SSA 支配関係の事故・未定義参照・分岐合流のゆらぎを構造的に排除。
受け入れ条件LoopForm スライス)
- 代表ループtokenizer/scanner の whileで header φ が生成され、continue/break が latch/exit に束ねられていること(`--dump-mir` で確認)。
- json_roundtrip_vmVM fallbackで未定義参照・無限ループが再発しない既存の短絡/if の diamond と整合)。
- フラグ OFF 時は従来どおり(既定挙動は変えない)。
## ADR 受理: No CoreBox & Everything is PluginProvider/Type 分離)
- CoreBox は戻さない。Kernel は最小GC/Handle/TLV/Extern/PluginRegistry/ABI
@ -359,6 +630,19 @@ Phase 1完了
- v2 スモークローカル任意・CIに入れない:
- `tools/smokes/v2/run.sh --profile quick --filter "json_native"`
---
## Delta (today)
- MIR builder: annotate call results (type + origin)
- Added `annotate_call_result_from_func_name` and applied to Global/Method/me-call paths so static/instance function calls propagate `MirType` and `value_origin_newbox`.
- Cross-function field origin
- New `field_origin_by_box: (BaseBoxName, field) -> FieldBoxName` recorded on assignment; used on field access to recover origin across methods.
- Builder debug
- `NYASH_BUILDER_DEBUG=1` logs pin ops and call-result annotations.
- Next focus
- Verify `me.scanner` origin hit in `JsonTokenizer.next_token` and ensure method-call rewrite precedes BoxCall fallback. If still VoidBox at runtime, inspect VM BoxCall InstanceBox dispatch.
トグル/導線
- env: `NYASH_JSON_PROVIDER=ny`既定OFF
- nyash.toml 例:
@ -1581,3 +1865,53 @@ Trigger: nyash_vm の安定(主要スモーク緑・自己ホスト経路が
- 追加検証
- トレース: `NYASH_VM_TRACE=1` で未定義参照箇所を特定し、漏れ箇所に局所 Pin を追加
- Verifier任意: 非 PHI 命令オペランドが使用ブロックに支配されるかの簡易チェックdev
# CURRENT_TASK — condensed (2025-09-27)
このファイルは簡潔版だよ。従来の長大なメモはアーカイブへ退避したにゃ:
- docs/development/current_task_archive/CURRENT_TASK_2025-09-27.md
目的Phase15+
- using の SSOTnyash.toml+ AST プレリュード統合の安定運用dev/ci/prod プロファイル)。
- Parser/Lower の「宣言≻式」徹底と seam 取りこぼし根絶(静的ボックスメンバー)。
- LoopForm 正規化preheader→header(φ)→body→latch→exitと IF/PHI の不変条件維持。
- JSON ネイティブTokenize/Parse/Stringifyの VM 走行を最小差分で安定化。
最近の達成20250927
- Tokenizer 入力消失を修正: `new JsonScanner(input)` で初期化VM 経路で EOF 固定になる問題を解消)。
- JsonNodeInstance に不足メソッド追加: `array_push/1`, `array_size/0`, `object_get/1`。
- VM getField/setField の順序/保持を是正: fields_ngNyashValue優先、欠損時の JsonScanner 既定値を局所適用。
- 狭域ブリッジ(暫定): JsonNodeInstance の `array_*`/`object_*` を内部 value に直結(静的フォールバック回避)。
- スモーク: `json_nested_vm.sh` / `json_roundtrip_vm.sh` が PASSdev+AST, VM
次にやる(高優先)
1) if/Loop 生成の点検MIR 側)
- 入口 PHI を pre_if/preheader スナップショットから生成できているかを `NYASH_IF_TRACE=1`/`NYASH_LOOP_TRACE=1` で継続確認。
- merge で未定義値が混入しないか `NYASH_VM_VERIFY_MIR=1` を常時有効化dev
2) JsonNodeInstance ブリッジの段階撤去計画
- 関数表インスタンス関数整備後、VM 特例を削除。まずはインスタンス側 stringify/集合操作の関数を常備。
- Builder のインスタンス→関数書き換えは現状 env ゲート(`NYASH_BUILDER_REWRITE_INSTANCE=1`。dev/ci で十分に緑化したら既定ON→最終的に VM 特例を削除。
3) using SSOT+AST の一貫化
- dev/ci は AST 既定ON、prod は toml 限定。レガシー前置き経路は削除候補として隔離維持。
受け入れ基準(このスライス)
- JSON quick: `json_roundtrip_vm.sh` / `json_nested_vm.sh` PASSdev+AST, VM
- if/Loop のトレース上、入口 PHI が pre_if/preheader から生成され、未定義参照が Verifier に検出されない。
- 変更は局所・既定挙動不変prod 既定は SSOT/toml のみ)。
- MapBox.keys は安定化のため昇順ソートを行い stringify の順序が安定(期待出力と一致)。
実行メモ(よく使うコマンド)
- ビルド: `cargo build --release`
- JSONVM, dev+AST:
- `NYASH_USING_PROFILE=dev NYASH_USING_AST=1 bash tools/smokes/v2/profiles/quick/core/json_roundtrip_vm.sh`
- `NYASH_USING_PROFILE=dev NYASH_USING_AST=1 bash tools/smokes/v2/profiles/quick/core/json_nested_vm.sh`
- 詳細トレース: `NYASH_VM_TRACE=1 NYASH_VM_VERIFY_MIR=1 NYASH_IF_TRACE=1 NYASH_LOOP_TRACE=1 ...`
主な変更ファイル(直近)
- apps/lib/json_native/lexer/tokenizer.nyash — scanner 初期化修正
- apps/lib/json_native/core/node.nyash — インスタンスAPI追加
- src/backend/mir_interpreter/handlers/boxes.rs — getField/setField 是正 + JsonNode 狭域ブリッジ
- src/boxes/map_box.rs — Instance 取得の共有優先(副作用低)
備考
- 大きな仕様追加はポーズ中Nyash VM bootstrap 完了まで)。今回の差分は安定化・局所修正のみ。
- 旧 CURRENT_TASK の全内容はアーカイブ参照(必要なら git でもたどれる)。