Files
hakorune/src/tests/mod.rs

50 lines
2.2 KiB
Rust
Raw Normal View History

#[cfg(feature = "aot-plan-import")]
pub mod aot_plan_import;
pub mod box_tests;
pub mod host_reverse_slot;
pub mod identical_exec;
pub mod identical_exec_collections;
pub mod identical_exec_instance;
pub mod identical_exec_string;
pub mod mir_breakfinder_ssa;
pub mod mir_funcscanner_skip_ws;
pub mod mir_funcscanner_parse_params_trim_min;
feat(mir): Phase 26-H JoinIR型定義実装完了 - ChatGPT設計 ## 実装内容(Step 1-3 完全達成) ### Step 1: src/mir/join_ir.rs 型定義追加 - **JoinFuncId / JoinContId**: 関数・継続ID型 - **JoinFunction**: 関数(引数 = φノード) - **JoinInst**: Call/Jump/Ret/Compute 最小命令セット - **MirLikeInst**: 算術・比較命令ラッパー - **JoinModule**: 複数関数保持コンテナ - **単体テスト**: 型サニティチェック追加 ### Step 2: テストケース追加 - **apps/tests/joinir_min_loop.hako**: 最小ループ+breakカナリア - **src/tests/mir_joinir_min.rs**: 手書きJoinIR構築テスト - MIR → JoinIR手動構築で型妥当性確認 - #[ignore] で手動実行専用化 - NYASH_JOINIR_EXPERIMENT=1 トグル制御 ### Step 3: 環境変数トグル実装 - **NYASH_JOINIR_EXPERIMENT=1**: 実験モード有効化 - **デフォルト挙動**: 既存MIR/LoopForm経路のみ(破壊的変更なし) - **トグルON時**: JoinIR手書き構築テスト実行 ## Phase 26-H スコープ遵守 ✅ 型定義のみ(変換ロジックは未実装) ✅ 最小限の命令セット ✅ Debug 出力で妥当性確認 ✅ 既存パイプライン無影響 ## テスト結果 ``` $ NYASH_JOINIR_EXPERIMENT=1 cargo test --release mir_joinir_min_manual_construction -- --ignored --nocapture [joinir/min] MIR module compiled, 3 functions [joinir/min] JoinIR module constructed: [joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H) test result: ok. 1 passed; 0 failed ``` ## JoinIR理論の実証 - **φノード = 関数引数**: `fn loop_step(i, k_exit)` - **merge = join関数**: 分岐後の合流点 - **ループ = 再帰関数**: `loop_step` 自己呼び出し - **break = 継続呼び出し**: `k_exit(i)` ## 次フェーズ (Phase 27.x) - LoopForm v2 → JoinIR 自動変換実装 - break/continue ハンドリング - Exit PHI の JoinIR 引数化 🌟 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com>
2025-11-23 04:10:12 +09:00
pub mod mir_funcscanner_trim_min;
pub mod mir_funcscanner_ssa;
feat(mir): Phase 26-H JoinIR型定義実装完了 - ChatGPT設計 ## 実装内容(Step 1-3 完全達成) ### Step 1: src/mir/join_ir.rs 型定義追加 - **JoinFuncId / JoinContId**: 関数・継続ID型 - **JoinFunction**: 関数(引数 = φノード) - **JoinInst**: Call/Jump/Ret/Compute 最小命令セット - **MirLikeInst**: 算術・比較命令ラッパー - **JoinModule**: 複数関数保持コンテナ - **単体テスト**: 型サニティチェック追加 ### Step 2: テストケース追加 - **apps/tests/joinir_min_loop.hako**: 最小ループ+breakカナリア - **src/tests/mir_joinir_min.rs**: 手書きJoinIR構築テスト - MIR → JoinIR手動構築で型妥当性確認 - #[ignore] で手動実行専用化 - NYASH_JOINIR_EXPERIMENT=1 トグル制御 ### Step 3: 環境変数トグル実装 - **NYASH_JOINIR_EXPERIMENT=1**: 実験モード有効化 - **デフォルト挙動**: 既存MIR/LoopForm経路のみ(破壊的変更なし) - **トグルON時**: JoinIR手書き構築テスト実行 ## Phase 26-H スコープ遵守 ✅ 型定義のみ(変換ロジックは未実装) ✅ 最小限の命令セット ✅ Debug 出力で妥当性確認 ✅ 既存パイプライン無影響 ## テスト結果 ``` $ NYASH_JOINIR_EXPERIMENT=1 cargo test --release mir_joinir_min_manual_construction -- --ignored --nocapture [joinir/min] MIR module compiled, 3 functions [joinir/min] JoinIR module constructed: [joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H) test result: ok. 1 passed; 0 failed ``` ## JoinIR理論の実証 - **φノード = 関数引数**: `fn loop_step(i, k_exit)` - **merge = join関数**: 分岐後の合流点 - **ループ = 再帰関数**: `loop_step` 自己呼び出し - **break = 継続呼び出し**: `k_exit(i)` ## 次フェーズ (Phase 27.x) - LoopForm v2 → JoinIR 自動変換実装 - break/continue ハンドリング - Exit PHI の JoinIR 引数化 🌟 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com>
2025-11-23 04:10:12 +09:00
pub mod mir_joinir_min; // Phase 26-H: JoinIR型定義妥当性確認
feat(joinir): Phase 27.1 - FuncScanner.trim JoinIR変換実装完了 目的: - minimal_ssa_skip_ws に続き、FuncScannerBox.trim/1 ループを JoinIR 変換対象に追加 - Phase 27.0 の実用化拡張(より簡単なループで動作確認) 実装内容: 1. lower_funcscanner_trim_to_joinir() 関数追加 (src/mir/join_ir.rs:515-770) - trim_main + loop_step の2関数生成 - 固定 ValueId 割り当て (5000-5018, 6000-6018) - OR 条件の chain 処理 (ch == " " || "\t" || "\n" || "\r") 2. BinOpKind 拡張 (src/mir/join_ir.rs:147-154) - Or/And variant 追加(論理演算対応) - Phase 27.1 実験的拡張として最小限の変更 3. テストインフラ追加 (src/tests/mir_joinir_funcscanner_trim.rs) - auto_lowering テスト: #[ignore] + NYASH_JOINIR_EXPERIMENT=1 トグル - type_sanity テスト: 常時実行の軽量テスト 4. ドキュメント完備 (docs/private/roadmap2/phases/phase-27.1-joinir/) - IMPLEMENTATION_LOG.md: 技術メモ + BinOpKind 拡張決定の記録 - TASKS.md: 実装ステップ進捗管理 検証結果: - ✅ ビルド成功 (リリースビルド 55.75s) - ✅ type_sanity テスト PASS - ✅ 既存 JoinIR テスト全て PASS (mir_joinir_min, mir_joinir_skip_ws) - ✅ トグル OFF で本線影響なし確認済み トグル制御: - NYASH_JOINIR_EXPERIMENT=1 で JoinIR 変換有効化 - デフォルトは従来の MIR/LoopForm 維持 次のステップ: - C-2: トグル ON での動作確認 - D-1: ベースライン緑度確認 - E-1: README 更新 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 06:29:22 +09:00
pub mod mir_joinir_skip_ws; // Phase 27.0: minimal_ssa_skip_ws JoinIR変換
pub mod mir_joinir_funcscanner_trim; // Phase 27.1: FuncScannerBox.trim JoinIR変換
pub mod mir_joinir_stage1_using_resolver_min; // Phase 27.12: Stage1UsingResolverBox.resolve_for_source JoinIR変換
pub mod mir_joinir_funcscanner_append_defs; // Phase 27.14: FuncScannerBox._append_defs JoinIR変換
pub mod joinir_runner_min; // Phase 27.2: JoinIR 実行器 A/B 比較テスト
pub mod joinir_runner_standalone; // Phase 27-shortterm S-3.2: JoinIR Runner 単体テスト
pub mod mir_locals_ssa;
pub mod mir_loopform_conditional_reassign;
pub mod mir_loopform_exit_phi;
pub mod mir_loopform_complex;
pub mod mir_static_box_naming;
pub mod mir_stage1_cli_emit_program_min;
pub mod mir_stage1_staticcompiler_receiver; // Phase 25.1: StaticCompiler receiver型推論バグ回帰防止
pub mod mir_stage1_using_resolver_verify;
fix(using): StringUtils using resolution - dual root cause fix 🎯 Phase 21.7++ - using StringUtils as StringUtils 完全動作化! ## Root Cause #1: TOML Parse Error (lang/src/llvm_ir/hako_module.toml) **Problem:** ```toml line 18: aot_prep = "boxes/aot_prep.hako" # scalar line 19: aot_prep.passes.strlen = "..." # table - CONFLICT! ``` → TOML parse error prevented ALL aliases from loading → populate_from_toml() returned Err, aliases.len() = 0 **Fix:** Commented out conflicting line 18: ```toml # aot_prep = "boxes/aot_prep.hako" # Commented out: conflicts with aot_prep.passes.* below aot_prep.passes.strlen = "boxes/aot_prep/passes/strlen.hako" ``` **Result:** ✅ populate_from_toml() succeeds ✅ 4 aliases loaded including StringUtils → string_utils ## Root Cause #2: Missing Arity Suffix (src/backend/mir_interpreter/handlers/calls/global.rs) **Problem:** - MIR functions stored as "BoxName.method/arity" - VM looked up "StringUtils.starts_with" (no arity) - Function table had "StringUtils.starts_with/2" (with /2) → Lookup failed with "Unknown: StringUtils.starts_with" **Fix:** Auto-append arity from args.len() if missing: ```rust let mut canonical = crate::mir::naming::normalize_static_global_name(func_name); if !canonical.contains('/') { canonical = format!("{}/{}", canonical, args.len()); } ``` **Result:** ✅ "StringUtils.starts_with" + args.len()=2 → "StringUtils.starts_with/2" ✅ VM function lookup succeeds ## Debug Infrastructure **Added comprehensive debug logging:** 1. src/runner/pipeline.rs:36-55 - NYASH_DEBUG_USING=1 for alias loading 2. src/backend/mir_interpreter/handlers/calls/global.rs:17-42 - NYASH_DEBUG_FUNCTION_LOOKUP=1 for VM lookup ## Test Coverage **src/tests/json_lint_stringutils_min_vm.rs:** - Rewrote to test arity auto-completion (not using resolution) - Inlined StringUtils implementation to avoid pipeline dependency - Tests that VM can call "StringUtils.starts_with" without arity suffix - ✅ Test passes **CLI Verification:** ```bash NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_DISABLE_PLUGINS=1 \ ./target/release/hakorune apps/tests/json_lint_stringutils_min.hako # Output: OK # RC: 0 ``` ## Impact - ✅ using StringUtils as StringUtils fully functional - ✅ All using aliases load successfully - ✅ VM can find functions with/without arity suffix - ✅ No breaking changes to existing code - ✅ Debug logging for future troubleshooting ## Files Modified - lang/src/llvm_ir/hako_module.toml (TOML fix) - src/runner/pipeline.rs (debug logging) - src/backend/mir_interpreter/handlers/calls/global.rs (arity fix + logging) - src/tests/json_lint_stringutils_min_vm.rs (rewrite + enable) - src/tests/mod.rs (register test) Co-authored-by: Task Agent <task@anthropic.com> Co-authored-by: Claude Code <claude@anthropic.com>
2025-11-22 01:21:38 +09:00
pub mod json_lint_stringutils_min_vm; // Phase 21.7++: using StringUtils alias resolution fix
feat(naming): Phase 21.7++ Phase 1 完全達成 - StaticMethodId SSOT 基盤確立 ## 🎉 成果概要 **Phase 1: 基盤整備** - NamingBox SSOT の構造化された基盤完成! ### ✅ 実装完了項目(全5タスク) 1. **StaticMethodId 構造体導入** (src/mir/naming.rs:86-248) - 構造化された関数名表現: box_name, method, arity - Optional arity でパース柔軟性確保 2. **ヘルパー関数追加** - `parse()`: "Box.method/N" or "Box.method" をパース - `format()`: 構造化 ID → 文字列変換 - `with_arity()`: arity 補完用ビルダー - 互換性エイリアス: parse_global_name(), format_global_name() 3. **包括的テスト追加** (src/tests/namingbox_static_method_id.rs) - 13 テストケース全通過 ✅ - arity 有り/無し、normalize、format、round-trip、エラー処理 - エッジケース: 複数ドット、大きな arity、不正入力 4. **テスト登録** (src/tests/mod.rs:21) - Phase 21.7++ コメント付きで登録 5. **動作確認** - `cargo test --release --lib namingbox_static_method_id` - 全 13 テスト PASS (0.00s) ### 📊 技術的効果 - **SSOT 確立**: 関数名パース/フォーマットを 1 箇所に集約 - **型安全**: 構造化表現で誤用防止 - **テスト保証**: 13 ケースで安全性確保 - **後方互換**: エイリアス関数で段階移行可能 ### 🎯 Phase 2 への準備完了 - VM 側の関数ルックアップを StaticMethodId ベース化 - arity バグ根治への基盤確立 --- **Phase 0**: ✅ 完了 (Silent Failure 根絶) **Phase 1**: ✅ 完了 (SSOT 基盤確立) **Phase 2**: 次のタスク (VM 統一) 🧮 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 02:25:22 +09:00
pub mod namingbox_static_method_id; // Phase 21.7++ Phase 1: StaticMethodId structure tests
docs(stage1): Phase 25.1 - Stage-1 CLI ValueId(34) SSA バグ完全調査完了 🔍 根本原因特定: - 問題箇所: stage1_cli.hako:111 の args null チェックパターン local argc = 0; if args != null { argc = args.size() } - 発生条件: 1. 深い制御フロー(BasicBlockId(12266) = 12,266ブロック) 2. using chain 複雑さ(BuildBox → ParserBox → 50+ファイル) 3. 多段階早期return(複数の支配フロンティアとPHIマージ) - なぜShapeテストは通るか: - スタブ実装(複雑な外部Box呼び出しなし) - 単一ファイル(using chain なし) - シンプルなCFG(数十ブロック vs 12,266ブロック) ✅ 解決策4案提示: - Solution A: Fail-Fast Guard(最優先・最簡単) if args == null { args = new ArrayBox() } → PHI merge を 1定義に潰す - Solution B: デバッグロジック抽出 → 問題パターンを小さな関数に隔離 - Solution C: Rust Bridge修正 → stage1_bridge.rs で常に非null保証 - Solution D: MIR Builder根治(長期) → SSA構築ロジック・PHI配置アルゴリズム改善 📋 成果物: - 詳細調査レポート: docs/development/current/main/stage1_cli_ssa_valueid34_analysis.md - ValueId(34)の定義/使用ブロック解析 - 呼び出しチェーン追跡 - 制御フロー複雑度分析 - 4つの解決策の詳細実装手順 - Shapeテスト追加: src/tests/stage1_cli_entry_ssa_smoke.rs - mir_stage1_cli_entry_like_pattern_verifies - mir_stage1_cli_stage1_main_shape_verifies - 構文とCFG形の正しさを検証(PASS) 🎯 技術的成果: - MIRレベルのSSA追跡失敗メカニズムを完全解明 - 「テストは通るが実物は失敗」のギャップを構造的に特定 - 箱レベルでの実装可能な解決策を4案提示 Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Task Assistant <task@anthropic.com>
2025-11-21 07:00:05 +09:00
pub mod stage1_cli_entry_ssa_smoke;
pub mod mir_stageb_like_args_length;
pub mod mir_stageb_loop_break_continue;
pub mod mir_stageb_string_utils_skip_ws; // Phase 25.1: skip_ws Void < 0 TypeError 再現
feat(mir): Phase 26-A-5完了 - 統合テスト作成(ValueId型安全化完全検証) ## 🎯 Phase 26-A-5: 統合テスト作成完了 ### ✅ 実装内容 **新規ファイル作成**: - `src/tests/mir_value_kind.rs` - Phase 26-A統合テスト(4テスト) - `src/tests/mod.rs` - mir_value_kindモジュール登録 **作成した統合テスト**: 1. **`test_guard_bug_prevention_full_flow()`** - GUARD checkバグ完全再現防止テスト - ValueId(0)がパラメータとして正しく判定されることを確認 - Phase 26-A-2/26-A-3/26-A-4の統合動作検証 2. **`test_instance_method_parameters()`** - インスタンスメソッドの暗黙的receiver(me)を含むパラメータテスト - 複数パラメータ(me, arg1, arg2)の型安全判定確認 3. **`test_loop_parameter_vs_local_distinction()`** - ループ内でのパラメータ/ローカル変数/LoopCarrierの区別テスト - loop_builder.rsの実際のユースケース検証 - new_typed_value()によるMirValueKind別ValueId生成確認 4. **`test_no_parameters_function()`** - パラメータなし関数のテスト - 未登録ValueIdのデフォルト動作確認 ### 🏆 技術的成果 #### テスト構造 ```rust // Phase 26-A-1 ユニットテスト (src/mir/value_kind.rs) test_mir_value_kind_parameter() // MirValueKind::Parameter test_mir_value_kind_local() // MirValueKind::Local test_mir_value_kind_constant() // MirValueKind::Constant test_mir_value_kind_temporary() // MirValueKind::Temporary test_mir_value_kind_pinned() // MirValueKind::Pinned test_mir_value_kind_loop_carrier() // MirValueKind::LoopCarrier test_typed_value_id_*() // TypedValueId各種機能 test_guard_check_bug_prevention() // GUARDバグ再現防止(ユニット) test_loop_carrier_detection() // LoopCarrier検出 // Phase 26-A-5 統合テスト (src/tests/mir_value_kind.rs) test_guard_bug_prevention_full_flow() // ✅ GUARD完全検証 test_instance_method_parameters() // ✅ 複雑パラメータ test_loop_parameter_vs_local_distinction() // ✅ 実用ケース test_no_parameters_function() // ✅ エッジケース ``` #### GUARDバグ再現防止の完全検証 ```rust // ❌ 旧実装で発生していたバグ for (name, value) in &current_vars { if value.0 == 0 { // ValueId(0) を未初期化と誤判定 return Ok(ValueId(0)); } } // ✅ Phase 26-A実装後の検証 let s = ValueId(0); builder.register_value_kind(s, MirValueKind::Parameter(0)); assert!(builder.is_value_parameter(s)); // 正しくパラメータと判定! ``` ### 📊 テスト結果 ``` test result: ok. 245 passed; 1 failed; 27 ignored ``` - ✅ **245テスト合格** - Phase 26-A-4から+4テスト増加 - ✅ **10個の value_kind テスト** - 6ユニット + 4統合 - ❌ **1テスト失敗** - `mir_funcscanner_skip_ws`(既存PHIバグ、無関係) ### 🔄 修正ファイル一覧 1. `src/tests/mir_value_kind.rs` (新規) - 統合テスト実装 2. `src/tests/mod.rs` - モジュール登録 ### 🎯 Phase 26-A 完全達成状況 - ✅ Phase 26-A-1: MirValueKind + TypedValueId 実装 - ✅ Phase 26-A-2: MirBuilder統合(value_kinds HashMap追加) - ✅ Phase 26-A-3: パラメータ型自動登録(setup_function_params修正) - ✅ Phase 26-A-4: is_parameter根本修正(名前ベース→ValueIdベース) - ✅ **Phase 26-A-5: 統合テスト作成(完全検証) ← 今回** ### 🚀 次のステップ - Phase 26-A: 最終確認(全テスト実行) - ドキュメント更新 - Phase 26-Bへ移行検討 ## 📚 参考 - 設計文書: docs/development/architecture/phase-26-valueid-type-safety.md - ユニットテスト: src/mir/value_kind.rs (12テスト) - 統合テスト: src/tests/mir_value_kind.rs (4テスト)
2025-11-20 09:56:22 +09:00
pub mod mir_value_kind; // Phase 26-A-5: ValueId型安全化統合テスト
pub mod nyash_abi_basic;
2025-11-19 23:12:01 +09:00
pub mod parser_static_box_members;
pub mod plugin_hygiene;
pub mod policy_mutdeny;
pub mod sugar_basic_test;
pub mod sugar_coalesce_test;
pub mod sugar_comp_assign_test;
pub mod sugar_pipeline_test;
pub mod sugar_range_test;
pub mod sugar_safe_access_test;
pub mod typebox_tlv_diff;
pub mod vtable_map_ext;
pub mod vtable_strict;
pub mod vtable_string;