Files
hakorune/docs/development/current/CURRENT_TASK.md
Moe Charm e54561e69f Phase 10.7 - JIT統計とイベント機能の完成
主要な実装:
- PHI(b1)統計追跡: phi_total_slots/phi_b1_slotsをJSON出力
- 関数単位統計API: JitStatsBox.perFunction()で詳細統計取得
- JITイベントシステム: compile/execute/fallback/trapをJSONL形式で記録
- Store/Load命令対応: ローカル変数を含む関数のJIT実行が可能に

新しいBox:
- JitStatsBox: JIT統計の取得
- JitConfigBox: JIT設定の管理(将来用)
- JitEventsBox: イベントのJSONL出力(将来用)
- JitPolicyBox: 実行ポリシー管理(将来用)

CLI拡張:
- --jit-exec, --jit-stats, --jit-dump等のフラグ追加
- --jit-directモードでの独立JIT実行
- NYASH_JIT_*環境変数によるきめ細かい制御

ドキュメント:
- Phase 10.7実装計画の詳細化
- Phase 10.9 (ビルトインBox JIT) の計画追加
- JIT統計JSONスキーマ v1の仕様化

ChatGPT5との共同開発により、JIT基盤が大幅に強化されました。
次はPhase 10.9でビルトインBoxのJIT対応を進め、
Python統合(Phase 10.1)への道を開きます。

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-28 09:26:58 +09:00

22 KiB
Raw Blame History

🎯 CURRENT TASK - 2025-08-27Phase 10_b → 10_c → 10_4/10_6横串

フェーズ10はJIT実用化へCore-1 Lowerの雛形を固めつつ、呼出/フォールバック導線を整えるよ。

🆕 Quick Hot Update2025-08-27-2

  • JitStatsBox: perFunction() 追加関数単位の統計をJSON配列で取得
  • b1 PHI格子 強化Compare/Const/Cast(TypeOp)/Branch/Copy/PHI/Store/Loadの固定点伝播
  • 独立JIT: --jit-direct に引数対応(NYASH_JIT_ARGS をMIR型にcoerce、結果の型名も表示
  • b1 ABI切替の下地: NYASH_JIT_ABI_B1_SUPPORT=1 でcapを強制ONできるように将来のtoolchain更新に備えたスイッチ
  • リンク: JSONスキーマ(v1) → docs/reference/jit/jit_stats_json_v1.md

⏱️ 今日のサマリ10_c実行経路の堅牢化10_7分岐/PHI/独立ABIGC/スケジューラ導線)

  • 目的: JIT実行を安全に通す足場を仕上げつつ、GC/スケジューラ導線を整備し回帰検出力を上げる。
    • 10_c: panic→VMフォールバックcatch_unwind/ JIT経路のroot区域化 / Core-1 i64 param minimal passemit_param_i64 + LowerCoreで供給 完了
    • 10_4a/10_4b: GC導線 + Write-Barrier挿入ArraySet/RefSet/BoxCall、root APIenter/pin/leave
    • 10_4c: CountingGcカウンタ出力roots/BoxRef内訳、depth2リーチャビリティ観測NYASH_GC_TRACE=1/2/3 完了
    • 10_4d: STRICTバリア検証CountingGc前後比較で漏れ即検出 完了(NYASH_GC_BARRIER_STRICT=1
    • 10_6b: シングルスレ・スケジューラspawn/spawn_after/poll、Safepointでpoll()連携、NYASH_SCHED_POLL_BUDGET対応 完了
    • 10_7: JIT分岐配線Cranelift— MIR Branch/Jump→CLIFブロック配線、条件b1保持、分岐b1/i64!=0両対応feature: cranelift-jit
    • 10_7: 最小PHI単純ダイアモンドNYASH_JIT_PHI_MIN=1 で有効、ブロック引数で合流値を受け渡し 初期対応
    • 10_7: JIT独立ABI導入 — JitValuei64/f64/bool/handle + VMValue↔JitValueアダプタ、TLS分離legacy VMArgs / JIT Args 完了
    • ベンチ: CLIベンチへJIT比較追加ウォームアップありbranch_returnケース追加、スクリプト版examples/ny_bench.nyash追加TimerBoxでops/sec

🆕 追加アップデート10_7進捗

  • ハンドルレジストリ + スコープ管理JIT呼び出し単位で自動クリーンアップ

  • HostCallブリッジハンドル経由・read-only中心

    • Array/Map/String: length/isEmpty、Map: has、String: charCodeAt
    • Array/Map get/set/push/size: 既存PoCをハンドル経由に段階移行
  • 多値PHIの配線then/else/jumpで順序つき引数渡し

    • DOT可視化NYASH_JIT_DOT=path.dot でCFG出力 初期対応
    • 引数ネイティブ型10_7hの前段: MIRシグネチャから Float→F64, Bool→I64(0/1) を反映(NYASH_JIT_NATIVE_F64/BOOL 初期対応
  • ダンプの簡潔化CFG/PHI要点表示、f64/boolネイティブ有効フラグ表示

  • CFG/PHIダンプの詳細化NYASH_JIT_DUMP=1 初期強化

    • 例: phi: bb=3 slots=2 preds=1|2 に続けて dst vX <- pred:val, ... を列挙(合流値の源が一目で分かる)
  • JIT設定の集約Rust側 初期導入

    • src/jit/config.rsJitConfig を追加し、RunnerからCLIと環境変数を一元反映
  • JitConfigBox 追加10_7f 初期対応

    • new JitConfigBox()exec/stats/dump/phi_min/hostcall/.../threshold を操作し apply() でenv反映
    • toJson()/fromJson() で再現性確保、summary() で状態確認
  • f64ネイティブ最小経路NYASH_JIT_NATIVE_F64=1

    • f64定数、F64同士の四則、F64戻りシグネチャ・トランポリン
    • トランポリンはdesired_ret_is_f64を捕捉env依存のズレを排除
  • Boolネイティブ最小経路NYASH_JIT_NATIVE_BOOL=1)↗ 準備済み

    • 比較はb1で保持し分岐に直接供給既定戻りは当面i64(0/1)で正規化将来b1戻りに拡張
  • 細かな修正: P2PBoxでtransportコールバック登録時の借用期間エラーを修正lock解放順を明示

  • Bugfix: Cranelift push_block_param_i64_atswitch_to_block 未呼出によるpanicを修正CFG/PHI経路の安定化

  • LowerCore小型足場追加

    • ret_boolヒント: 返り値がBoolの関数で builder.hint_ret_bool(true) を呼ぶ切替点を用意現状no-op、将来1行で切替
    • Castの最小下ろし: I::Cast を値供給+既知整数の継承で安全通過(副作用なし領域)
  • 観測強化

    • b1正規化カウンタ: b1_norm_count分岐条件・b1ブロック引数の正規化で加算
    • JitStatsBox: {abi_mode, abi_b1_enabled, abi_b1_supported, b1_norm_count}toJson() で取得可能BoxFactory登録済み
    • 統合JIT統計テキスト/JSONabi_mode/…/b1_norm_count を追加
  • 便利CLI

    • --emit-cfg <DOT_FILE> 追加(NYASH_JIT_DOT のCLI版。NYASH_JIT_DUMPも自動オン)
  • 重要: Cranelift未有効時の挙動を是正

    • 以前: NYASH_JIT_EXEC=1 でJITスタブが0を返すことがあり、結果が変わり得た
    • 変更: Cranelift未有効では「未コンパイル扱い」にしてVMへ完全フォールバックJIT有効でも結果は不変
  • 独立JITモード 追加

    • --jit-direct: VM実行ループを介さず、JITエンジンで main を直接コンパイル実行Cranelift有効時
    • --jit-only: フォールバック禁止JIT未コンパイル/失敗は即エラー)— 独立性検証に最適
  • b1 PHIの型/格子解析 強化

    • Compare/Const Bool起点Copy/PHIに加え、Load/Storeヒューリスティックを導入固定点伝播
    • PHI統計は常時計測phi_total_slots/phi_b1_slots)→ JSON/ダンプ一致
  • 関数単位JIT統計

    • LowerCore→JitEngine→JitManagerで phi_total/phi_b1/ret_bool_hint/hits/compiled/handle を集約
    • JitStatsBox.summary()perFunction 配列を追加(関数ごとの明細)
  • f64 E2Eと簡易ベンチCranelift向け 追加

    • 例: examples/jit_f64_e2e_add_compare.nyash / ベンチ: examples/ny_bench_f64.nyash
    • 注意: VM単体ではf64演算/比較は未対応。--features cranelift-jit + NYASH_JIT_EXEC=1 NYASH_JIT_NATIVE_F64=1 で実行
  • JSONスキーマの文書化

    • 参照: docs/reference/jit/jit_stats_json_v1.mdversion=1
    • 統一JSON/Box JSONともに version フィールドを付与
  • f64 E2Eと簡易ベンチCranelift向け 追加

    • 例: examples/jit_f64_e2e_add_compare.nyash
    • ベンチ: examples/ny_bench_f64.nyash
    • 注意: VM単体ではf64演算/比較は未対応。--features cranelift-jit + NYASH_JIT_EXEC=1 NYASH_JIT_NATIVE_F64=1 で実行
  • JSONスキーマの文書化 追加

    • 参照: docs/reference/jit/jit_stats_json_v1.mdversion=1
    • 統一JSON/Box JSONともに version フィールドを付与
  • PHI統計常時計測

    • phi_total_slots/phi_b1_slots をLowerCoreで常時計測し、JSONに出力
  • Cranelift互換性修正

    • b1シグネチャを使用せず、戻りはi64に正規化select(b1,1,0))。types::B1/bint 非依存でビルド安定化

直近タスク(小さく早く)

  1. 10_b: Lower/Core-1 最小化(進行中 → ほぼ完了)
    • IRBuilder抽象 + NoopBuilderemit数カウント 完了
    • CraneliftBuilder 雛形feature cranelift-jit 完了
    • LowerCoreConst/Copy/BinOp/Cmp/Branch/Ret 完了emit→Builder
    • Engine.compile: builder選択feature連動Lower実行JIT handle発行 完了
    • JIT関数テーブルstub: handle→ダミー関数 完了
    • 残: 最小emitconst/binop/retをCLIFで生成し、関数ポインタをテーブル登録feature有効時 → 実装: CraneliftBuilderでi64用のconst/binop/retを生成し、JIT関数テーブルへクロージャとして登録完了i64引数0〜6個対応bool,f64はi64正規化 更新
  2. 10_c: 呼出/フォールバック(最小経路) 完了
    • VM側の疑似ディスパッチログcompiled時/実行時ログ)
    • JIT実行→VMValue返却、panic時VMフォールバック engine.execute_handlecatch_unwind
    • Core-1最小: i64 param/return、Const(i64/bool→0/1)、BinOp/Compare/Return
    • HostCall最小Array/Map: len/get/set/push/sizeゲートNYASH_JIT_HOSTCALL=1
    • Branch/JumpはCranelift配線導入済みfeature cranelift-jit。副作用命令は未lowerのためVMへフォールバック
  3. 10_7: 分岐/PHI/独立ABICranelift— 進捗中
    • LowerCore: BB整列・マッピング→builderのprepare_blocks/switch/seal/br_if/jump呼出
    • CraneliftBuilder: ブロック配列管理、brif/jump実装、条件b1/i64!=0両対応
    • 最小PHI単純ダイアモンド導入NYASH_JIT_PHI_MIN=1ガード) 初期対応
    • JIT独立化: JitValue ABI + 変換アダプタ + TLS分離でVM内部へ非依存化 完了
    • 残: 副作用命令の扱い方針当面VMへ、CFG可視化の追加改善ブロック引数の整形など
    • 検証: --features cranelift-jit 有効ビルドで examples/jit_branch_demo.nyash / jit_phi_demo.nyash がJIT経路で正常動作を確認NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1

🆕 追加2025-08-28

  • JitStatsBox: perFunction() をVMディスパッチへ実装JSON配列で name/hits/phi_total/phi_b1/ret_bool_hint/compiled/handle を返却)
  • PHI(b1)読出しの安定化(最小)
    • NYASH_JIT_PHI_MIN=1 有効時、ブールと推定されたPHIは b1 としてブロック引数を読み出し(分岐に直結)
    • 分岐条件をブール格子のシードに追加pre-scanで condition をbooleanとして扱う
  • デモ更新: examples/jit_stats_summary_demo.nyashperFunction() 出力を追加
  • jit-direct独立JIT足場の強化
    • read-onlyガードWriteHeap検出で明示エラー/ 統一エラーJSONNYASH_JIT_ERROR_JSON=1
    • 最小E2E: examples/jit_direct_local_store_load.nyash / jit_direct_bool_ret.nyash / jit_direct_f64_ret.nyash
    • 参考: Box-First運用キット docs/engineering/box_first_enforcement.mdPR/CIはアドバイザリ導入

🔜Phase 10.9 Builtin-Box JITBox-Firstで最小から

目的: VMとJITでビルトインBoxの読み取り系を同等動作にし、後続生成/書き込み)へ進む足場を固める。

必要な箱(最小セット)

  • JitPolicyBoxポリシー箱
    • 役割: read-onlyゲート/書き込み検出/HostCall許可リストの一本化1箇所で切替
    • 経路: runner/jit-direct/engine/lower が参照env直読みはしない
  • JitEventsBox観測箱
    • 役割: compile/execute/fallback/trapを JSONL へAppend{fn, abi_mode, reason, ms}
    • 経路: 既存statsと共存。回帰の目視を容易に。
  • HostcallRegistryBoxread-only
    • 役割: 許可HostCallと引数/戻りの種別を宣言。型検査の単一点にする。
    • 初期: String.length/isEmpty/charCodeAt, Array.length/isEmpty/get, Map.size/has
  • FrameSlotsBoxスロット箱
    • 役割: ptr→slot の管理と型注釈今はi64のみ。LowerCoreから委譲。
  • CallBoundaryBox呼出し境界箱薄い
    • 役割: JIT↔JIT/JIT↔VM呼出しの単一点将来の多関数対応の足場。今は型変換の箱だけ用意。

最小原則: まず箱を置くno-op/ログだけでもOK→ 切替点が1箇所になったら機能を足す。

実装計画(小さい積み木で順に)

  1. Week 10.9-α(足場)
    • JitPolicyBox v0: read-only/HostCall whitelist を箱へ移動runnerの散在チェックを統合
    • JitEventsBox v0: compile/executeのJSONLイベントオプトイン
    • CURRENT_TASK/CLAUDEへポリシーと使い方を簡潔追記
  2. Week 10.9-β(読み取り系カバレッジ)
    • HostcallRegistryBox v0: String/Array/Mapの読み取りAPIを登録・型検査
    • LowerCore: BoxCallのread-only経路をRegistry参照に切替散在ロジックの削減
    • E2E: length/isEmpty/charCodeAt/get/size/hasjit-direct + VMで一致
  3. Week 10.9-γ(生成の足場)
    • CallBoundaryBox v0: JIT→VMnew演算子などを一旦VMへ委譲する薄い箱
    • new StringBox/IntegerBox/ArrayBox の最小経路jit-directは方針次第で拒否でも可
  4. Week 10.9-δ(書き込みの導線のみ)
    • JitPolicyBox: write許可のスイッチを箱に実装既定OFF
    • LowerCore: 書き込み命令はPolicy参照で拒否/委譲/許可1箇所で判断

成功判定DoD

  • 機能: 読み取り系ビルトインBoxがJIT経路でVMと一致上記API
  • 箱: Policy/Events/Registryが1箇所で参照される散在ロジック解消
  • 観測: JSONLイベントが最低1件以上出力明示opt-in
  • 回帰: jit-direct read-only方針が維持され、拒否理由がイベント/JSONで判読可

リスクと箱での緩和

  • HostCallの型崩れ: HostcallRegistryBoxで型検査→不一致はPolicy経由で明示拒否
  • 方針変更の揺れ: JitPolicyBoxのフラグだけで切替可能コード散在を回避
  • 観測不足: JitEventsBoxのイベント粒度を先に用意必要最小限でOK

備考(制限と次の着手点)

  • 返り値はi64VMValue::Integerに限定。f64/boolは設計着手ダンプで有効フラグ観測のみ
  • 引数はi64最小パス。複数引数はparamマッピングで通過、非i64はハンドル/正規化で暫定対応
  • Branch/JumpのCLIF配線は導入済みfeature cranelift-jit。条件はb1で保持し、必要に応じてi64!=0で正規化
  • 副作用命令print等はJIT未対応のためVMへ委譲安全性優先
  • JIT/VM統合統計フォールバック率/時間の一括出力) 実装済み(最小)
    • maybe_print_jit_unified_stats() により、テキスト/JSONNYASH_JIT_STATS_JSON=1でsites/compiled/hits/exec_ok/trap/fallback_rate/handlesを出力

📦 箱作戦JIT独立化の方針

  • ABIの箱: JitValueI64/F64/Bool/HandleでJIT入出力を統一、VM型に非依存
  • 変換アダプタ: VMValue↔JitValueはアダプタに集約、境界は必ずアダプタ経由
  • TLS分離: legacy VMArgs既存HostCall用とJIT Args新ABIを分離し段階移行
  • HostCall独立化計画: Handle(u64) + ハンドルレジストリ導入でJIT→ホストを完全独立VM型非参照
  • 設定の箱(進捗): Rust側でJitConfigを導入しenv/CLI設定を集約Nyash側Box化は後続
  • 可視化: NYASH_JIT_DUMP=1でCFG/ブロック引数を可視化し回帰検出力を強化

すぐ試せるコマンド

cargo build --release -j32
NYASH_JIT_STATS=1 NYASH_JIT_DUMP=1 ./target/release/nyash examples/p2p_ping_pong.nyash

# 疑似実行パスを確認まだVMフォールバック
NYASH_JIT_STATS=1 NYASH_JIT_DUMP=1 NYASH_JIT_EXEC=1 \
  ./target/release/nyash examples/p2p_ping_pong.nyash

# 任意Craneliftを含めてビルド今は最小初期化のみ
cargo build --release -j32 --features cranelift-jit

# JIT分岐デモfeature有効時
NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
  ./target/release/nyash --backend vm examples/jit_branch_demo.nyash
NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
  ./target/release/nyash --backend vm examples/jit_loop_early_return.nyash

# スクリプトベンチTimerBox版
./target/release/nyash examples/ny_bench.nyash
./target/release/nyash --backend vm examples/ny_bench.nyash
NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/nyash --backend vm examples/ny_bench.nyash

# CLIベンチウォームアップ3バックエンド比較
./target/release/nyash --benchmark --iterations 200

HostCallハンドルPoC

./target/release/nyash --backend vm --jit-exec --jit-hostcall examples/jit_array_param_call.nyash
./target/release/nyash --backend vm --jit-exec --jit-hostcall examples/jit_map_param_call.nyash
./target/release/nyash --backend vm --jit-exec --jit-hostcall examples/jit_map_int_keys_param_call.nyash
./target/release/nyash --backend vm --jit-exec --jit-hostcall examples/jit_map_has_int_keys.nyash
./target/release/nyash --backend vm --jit-exec --jit-hostcall examples/jit_string_param_length.nyash
./target/release/nyash --backend vm --jit-exec --jit-hostcall examples/jit_string_is_empty.nyash
./target/release/nyash --backend vm --jit-exec --jit-hostcall examples/jit_string_charcode_at.nyash

現在の地図Done / Next

完了Phase 9.79b

  • TypeMeta/Thunk正式化・Poly-PIC2〜4・Plugin TLV拡張bool/i64/f64/bytes
  • VM fast-path整備Instance/Plugin/Builtinと統計サマリ強化

⏭️Phase 10

  • 10_a: JITブートストラップ 完了
  • 10_b: Lower(Core-1) Const/Move/BinOp/Cmp/Branch/Ret最小emit仕上げ中
  • 10_c: ABI/呼出し JIT→JIT/JIT→VM、例外バイアウト実行経路を実体化
  • 10_d: コレクション基礎 Array/Mapブリッジ 完了param経路
  • 10_e: BoxCall高速化 Thunk/PIC直結
  • 10_f: TypeOp/Ref/Weak/Barrier最小
  • 10_g: 診断/ベンチ/回帰
  • 10_h: 硬化・最適化調整

参考リンク

  • フェーズ10ロードマップ: docs/development/roadmap/phases/phase-10/phase_10_cranelift_jit_backend.md
  • MIR命令セット: docs/reference/mir/INSTRUCTION_SET.md
  • VM/Thunk/PIC: docs/development/roadmap/phases/phase-9/phase_9_79b_3_vm_vtable_thunks_and_pic.md

Parking Lot後でやる

  • Lower emitのテスト雛形
  • CLIFダンプ/CFG表示NYASH_JIT_DUMP=1
  • VM --vm-stats とJIT統計の統合 → 実装済みVM終了時にJIT統合サマリ出力。JSON出力も可

残タスク(箇条書き)

  • 10_c:
    • CLIF: Branch/Jumpの実ブロック配線、Compare結果の適用確認
    • 返り値/引数の型拡張bool/f64、複数引数の網羅
    • JIT/VM統合統計フォールバック率/時間の一括出力) 済(最小)
  • 10_4c:
    • リーチャビリティ観測の深さ拡張depth=2→Nと軽量ダンプ
    • 将来実Mark/TraverseのPoC解放はしない
  • 10_4d:
    • STRICTモードのCI導入CountingGc前提/ goldenベンチ導入
  • 10_6b:
    • スケジューラ: poll予算の設定ファイル化、将来のscript API検討継続
  • 10_7:
    • Hostハンドルレジストリ導入JIT側はHandleのみを見る
    • IRBuilder APIの整理block param/分岐引数の正式化とCranelift実装の安定化暫定APIの整形
    • 副作用命令のJIT扱い方針: 当面VMへ、将来はHostCall化
    • CFG検証とNYASH_JIT_DUMP=1でのCFG可視化ブロックと引数のダンプ 初期強化済み(更なる整形・網羅は継続)
    • JitConfigBoxで設定の箱集約env/CLI整合、テスト容易化 Rust側のJitConfig導入済Box化は後続
    • Bool戻り最小化: hint_ret_boolをCranelift側に配線し、b1→i64とb1ネイティブを切替可能に
    • Compare/BinOpの副作用なし領域の拡大Copy/Const/Castは開始済み、And/Orは当面VMフォールバック
    • PHI(b1)の扱い整理: ブロック引数のb1対応を正式化i64 0/1正規化とb1の両立
    • 統計/ダンプの整備: b1_norm_countのJSON/テキスト両方での検証手順をドキュメント化
    • b1 PHI格子の精度UP簡易エイリアス/型注釈の取り込み)
    • ネイティブb1 ABI: ツールチェーンcap連動で返り/引数b1署名への切替切替点は一本化済
    • VMのf64演算/比較パリティ10.8へ移送)
    • JitStatsBox: perFunction() の箱API追加summaryを介さず単体取得
    • b1 PHIタグの頑健化Load/Store越しの由来推定を型/格子解析で補強)
    • VMのf64演算/比較パリティ10.8へ移送予定)
    • JSONスキーマのversion管理とサンプル更新v1整理済み、今後の拡張計画をドキュメント化)
  • ベンチ:
    • examples/ny_bench.nyashのケース追加(関数呼出/Map set-getとループ回数のenv化

🛠️ メンテ・ビルドノート(環境依存)

  • WSL配下/mnt/c/...)で cargo build 時に Invalid cross-device link (os error 18) が発生する場合あり
    • 対策: リポジトリをLinux FS側例: ~/work/nyash)に配置/CARGO_TARGET_DIRTMPDIR を同一FS配下へ設定
    • 備考: リンク動作とFS差分が原因のため、コード修正ではなく環境調整で解決
  • Codex CLIの実行権限・サンドボックス設定忘れで「ビルドできない」誤検知になる場合あり
    • 対策: codex --ask-for-approval never --sandbox danger-full-access を付与して起動する(この指定忘れが原因だったケースあり)

10_d まとめ(完了)

  • HostCall導線Import+Callと引数配線i64×N→i64?)を実装
  • C-ABI PoCRust内: nyash.array.{len,push,get,set} / nyash.map.size
  • Param経路のE2E確認配列/Mapを関数引数に渡す形でlen/sizeが正しく返る
  • セーフティ: NYASH_JIT_HOSTCALL=1ゲート運用、問題時はVMフォールバック

移管10_e/10_fへ

  • ハンドル表PoCu64→Arcでローカルnew値もHostCall対象に
  • 型拡張(整数以外、文字列キーなど)
  • BoxCallカバレッジ拡張とデオプ/フォールバック強化