From 9c94e88b864940887ce6adb51d8f504f634e0ff8 Mon Sep 17 00:00:00 2001 From: Moe Charm Date: Tue, 26 Aug 2025 01:42:18 +0900 Subject: [PATCH] ResultBox migration (stage 0): suppress legacy deprecation warnings in box_trait impls; keep dual handling in VM. Fix verifier Display for SuspiciousBarrierContext. Expose VM stats fields to vm_stats module. CLI core_ci guide and script in place. --- CLAUDE.md | 105 +++++++++++++----- docs/development/current/CLI_TESTING_GUIDE.md | 20 ++++ docs/development/current/CURRENT_TASK.md | 8 +- docs/status/golden/await_simple.mir.txt | 3 + ideas/README.md | 80 +++++++++++++ .../2025-08-25-vm-andor-shortcircuit.md | 52 +++++++++ ideas/new-features/2025-08-25-repl-mode.md | 56 ++++++++++ ideas/other/2025-08-25-cranelift-research.md | 77 +++++++++++++ src/backend/vm.rs | 4 +- src/box_trait.rs | 4 + src/mir/loop_builder.rs | 18 ++- src/mir/verification.rs | 3 + tools/core_ci.sh | 14 +++ 13 files changed, 408 insertions(+), 36 deletions(-) create mode 100644 docs/development/current/CLI_TESTING_GUIDE.md create mode 100644 docs/status/golden/await_simple.mir.txt create mode 100644 ideas/README.md create mode 100644 ideas/improvements/2025-08-25-vm-andor-shortcircuit.md create mode 100644 ideas/new-features/2025-08-25-repl-mode.md create mode 100644 ideas/other/2025-08-25-cranelift-research.md create mode 100644 tools/core_ci.sh diff --git a/CLAUDE.md b/CLAUDE.md index 73fad945..8322815e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,11 +3,11 @@ Nyashプログラミング言語開発に必要な情報をまとめたクイックリファレンス。 ## 🧭 Start Here (最初に見る) -- **🎯 主軸タスク**: [docs/development/roadmap/native-plan/copilot_issues.txt](docs/development/roadmap/native-plan/copilot_issues.txt) **← 最重要!** -- 現在のタスク: [docs/development/current/CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md)(近々/中期/長期の計画は同ファイル先頭) -- ドキュメント入口: [docs/README.md](docs/README.md) -- コア概念(速習): [docs/reference/architecture/nyash_core_concepts.md](docs/reference/architecture/nyash_core_concepts.md) -- Netプラグイン(HTTP/TCP): [docs/reference/plugin-system/net-plugin.md](docs/reference/plugin-system/net-plugin.md) +- **🎯 主軸タスク**: [copilot_issues.txt](docs/development/roadmap/native-plan/copilot_issues.txt) **← 最重要!** +- **📋 現在のタスク**: [CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md)(近々/中期/長期の計画は同ファイル先頭) +- **📚 言語仕様**: まず[LANGUAGE_REFERENCE_2025.md](docs/reference/language/LANGUAGE_REFERENCE_2025.md)を読む +- **📦 Box システム**: [boxes-system/](docs/reference/boxes-system/)でAPI確認 +- **⚙️ 実行バックエンド**: [execution-backends.md](docs/reference/architecture/execution-backends.md) ## 🤖 **Claude×Copilot協調開発の主軸** ### 📋 **copilot_issues.txt - 開発の軸となるファイル** @@ -21,6 +21,23 @@ Nyashプログラミング言語開発に必要な情報をまとめたクイッ **迷ったらcopilot_issues.txtを確認せよ!** +## 🏃 開発の基本方針: 80/20ルール - 完璧より進捗 + +### なぜこのルールか? +**実装後、必ず新しい問題や転回点が生まれるから。** +- 100%完璧を目指すと、要件が変わったときの手戻りが大きい +- 80%で動くものを作れば、実際の使用からフィードバックが得られる +- 残り20%は、本当に必要かどうか実装後に判断できる + +### 実践方法 +1. **まず動くものを作る**(80%) +2. **改善アイデアは `ideas/` フォルダに記録**(20%) +3. **優先度に応じて後から改善** + +例: VM and/or実装 +- 80%: `as_bool()`で基本動作 → コミット ✅ +- 20%: 短絡評価、型最適化 → `ideas/improvements/2025-08-25-vm-andor-shortcircuit.md` + ## 🚀 クイックスタート ### 🎯 実行方式選択 (重要!) @@ -92,21 +109,16 @@ python3 -m http.server 8010 - ネイティブ計画: [docs/development/roadmap/native-plan/](docs/development/roadmap/native-plan/) - フェーズ課題: [docs/development/roadmap/](docs/development/roadmap/) - アーカイブ: [docs/archive/](docs/archive/) -### 🎯 よく使う情報 -- Getting Started: [docs/guides/getting-started.md](docs/guides/getting-started.md) -- Language Guide: [docs/guides/language-guide.md](docs/guides/language-guide.md) -- Playground Guide: [docs/guides/tutorials/playground_guide.md](docs/guides/tutorials/playground_guide.md) -### 📊 最新開発状況 -- 現在のタスク: [docs/development/current/CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md) -- ロードマップ: [docs/development/roadmap/](docs/development/roadmap/) -### 📖 詳細リファレンス -- リファレンス: [docs/reference/](docs/reference/) - - 言語仕様: [docs/reference/language/LANGUAGE_REFERENCE_2025.md](docs/reference/language/LANGUAGE_REFERENCE_2025.md) - - 可視性/デリゲーション: [docs/reference/language/field-visibility-and-delegation.md](docs/reference/language/field-visibility-and-delegation.md) - - Box/プラグイン: [docs/reference/boxes-system/](docs/reference/boxes-system/), [docs/reference/plugin-system/](docs/reference/plugin-system/) -### 🎮 実用例・アプリ -- **[実用例](docs/guides/)** - サンプルコード・パターン集 -- **実装済みアプリ**: サイコロRPG・統計計算・LISPインタープリター + +### 🎯 よく使う情報(クイックアクセス) +- **🔴 現在のタスク**: [CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md) ← 今ココ! +- **🎮 Phase 9.78h**: [phase_9_78h_mir_pipeline_stabilization.md](docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md) +- **📐 言語仕様**: [LANGUAGE_REFERENCE_2025.md](docs/reference/language/LANGUAGE_REFERENCE_2025.md) +- **🤖 MIR 26命令**: [INSTRUCTION_SET.md](docs/reference/mir/INSTRUCTION_SET.md) +- **📦 Box API**: [boxes-system/](docs/reference/boxes-system/) +- **⚡ VM実装**: [VM_README.md](docs/reference/execution-backend/VM_README.md) +- **🌐 Netプラグイン**: [net-plugin.md](docs/reference/plugin-system/net-plugin.md) +- **🎮 実装済みアプリ**: サイコロRPG・統計計算・LISPインタープリター ## ⚡ 重要な設計原則 @@ -445,6 +457,47 @@ NYASH_VM_DEBUG=1 # VM のみ gemini -p "Nyashの実装で困っています..." ``` +### 💡 アイデア管理(ideas/フォルダ) + +**80/20ルールの「残り20%」を整理して管理** + +``` +ideas/ +├── improvements/ # 80%実装の残り20%改善候補 +│ ├── 2025-08-25-vm-andor-shortcircuit.md +│ └── archived/ # 実装済みor却下 +│ +├── new-features/ # 新機能アイデア +│ ├── 2025-08-25-repl-mode.md +│ └── archived/ +│ +└── other/ # その他すべて(調査、メモ、設計案) + ├── 2025-08-25-cranelift-research.md + └── archived/ +``` + +#### 📝 改善候補ファイルの形式 +```markdown +# VM and/or 短絡評価の実装 +Status: Pending (80%実装済み) +Created: 2025-08-25 +Priority: Low +Related-Code: src/backend/vm_instructions.rs::execute_binop() + +## 現状(80%実装) +- `as_bool()`で全オペランドを評価してから論理演算 +- 基本動作は完全に正常 + +## 改善案(残り20%) +### 1. 短絡評価 +- And: 左辺false → 右辺評価スキップ +- Or: 左辺true → 右辺評価スキップ + +## 実装タイミング +- [ ] パフォーマンス問題が報告されたら +- [ ] Phase 10(最適化フェーズ)で一括対応 +``` + ### 🧪 テスト実行 #### 📁 **テストファイル配置ルール(重要!)** @@ -680,11 +733,7 @@ let new_plugin_box = PluginBoxV2 { --- -最終更新: 2025年8月20日 - **📝 プラグインBox開発の注意点追加** -- **TLV Handle処理**: type_idとfini_method_idの正しい扱い方を追記 -- **Phase 9.75g-0完了**: BID-FFI Step 1-3実装成功(プラグイン・テスター・設定) -- **plugin-tester**: 汎用プラグイン診断ツール完成(CLAUDE.mdに追加) -- **設計原則達成**: Box名非決め打ち・birth/finiライフサイクル・メモリ管理明確化 -- **次のステップ**: Step 4 - Nyashとの統合(src/bid/モジュール実装) -- **copilot_issues.txt**: Phase順開発計画の軸として継続 -- **次期最優先**: AST→MIR Lowering完全実装(Phase 8.4) +最終更新: 2025年8月25日 - **🏃 80/20ルールとideas/フォルダ構造追加** +- **80/20ルール**: 完璧より進捗を優先する開発方針を明記 +- **ideas/フォルダ**: 改善案・新機能・その他アイデアの管理構造を追加 +- **ドキュメント整理**: 重複セクションを統合してスリム化 diff --git a/docs/development/current/CLI_TESTING_GUIDE.md b/docs/development/current/CLI_TESTING_GUIDE.md new file mode 100644 index 00000000..fd5bd4c9 --- /dev/null +++ b/docs/development/current/CLI_TESTING_GUIDE.md @@ -0,0 +1,20 @@ +## CLI分離テスト導線(軽量版) + +目的: CLI変更に引きずられずにコアのMIR/VMを検証できる導線を用意する(構成は今は変えない)。 + +### 推奨手順 +- コアのビルドとゴールデン照合のみで回す: + - `cargo build --release -j32` + - `./tools/ci_check_golden.sh` +- 代表E2E(プラグイン前提)のみ任意: + - `cargo test --features plugins -q -- --nocapture` + +### ヘルパースクリプト +- `tools/core_ci.sh`: コアのビルド+ゴールデン照合を一括実行(CI/ローカル共用) + +### 将来の分割方針(メモ) +- Cargo workspace化 or lib/binary分割で `cargo test -p core` を走らせる。 +- runner(CLIフラグ/バックエンド選択)変更の影響をコア側に伝播させない。 + +最終更新: 2025-08-25 + diff --git a/docs/development/current/CURRENT_TASK.md b/docs/development/current/CURRENT_TASK.md index bf7c9eb2..3b7251ce 100644 --- a/docs/development/current/CURRENT_TASK.md +++ b/docs/development/current/CURRENT_TASK.md @@ -75,7 +75,7 @@ tools/ci_check_golden.sh # 代表ケースのMIR含有チェック - 修正後、`local_tests/and_or_vm.nyash` で `false/true` の出力を確認。 2. **MIR26命令対応** - TypeOp/WeakRef/Barrierのプリンタ拡張 - - スナップショット整備 + - スナップショット整備(extern_call/loop/boxcall/typeop_mixed 追加済) - vm-stats差分確認 3. **Builder適用拡大** @@ -365,3 +365,9 @@ tools/run_vm_stats.sh local_tests/vm_stats_http_err.nyash vm_stats_err.json # 7) VM BoxCall デバッグ(任意) NYASH_VM_DEBUG_BOXCALL=1 ./target/release/nyash --backend vm local_tests/test_vm_array_getset.nyash ``` +- MIR26 整合(候補1)確認: + - Printer: `--mir-verbose-effects` の `pure|readonly|side` 表記と TypeOp/WeakRef/Barrier/ExternCall の表示が整合。 + - Verifier: SSA/支配/CFG/merge-phi に加え WeakRef/Barrier の最小検証+Strict Barrier診断を実装(環境変数でON)。 + - Optimizer: 未lowering検知(is/as/isType/asType)をBoxCall/Call両経路で検出、`NYASH_OPT_DIAG_FAIL=1` と連携。 + - 代表スナップショット: extern_call/loop/boxcall/typeop_mixed をCIに追加、全件緑。 + - 注: WeakRef/Barrier の“統合”はPoCフラグで切替可能(レガシー命令も支援)—MIR26はドキュメントの正典、実装は互換を維持。 diff --git a/docs/status/golden/await_simple.mir.txt b/docs/status/golden/await_simple.mir.txt new file mode 100644 index 00000000..013f9d43 --- /dev/null +++ b/docs/status/golden/await_simple.mir.txt @@ -0,0 +1,3 @@ +🔌 v2 plugin system initialized from nyash.toml +✅ v2 plugin system fully configured +🚀 Nyash MIR Compiler - Processing file: local_tests/await_simple.nyash 🚀 diff --git a/ideas/README.md b/ideas/README.md new file mode 100644 index 00000000..2c48f6a1 --- /dev/null +++ b/ideas/README.md @@ -0,0 +1,80 @@ +# 📁 Ideas フォルダ - 80/20ルールの「残り20%」管理 + +このフォルダは、80/20ルールに基づいて「まず動くものを作る」方針で開発した後の、 +残り20%の改善案や新機能アイデアを整理して管理する場所です。 + +## 📂 フォルダ構造 + +``` +ideas/ +├── improvements/ # 80%実装の残り20%改善候補 +│ ├── *.md # 各改善案 +│ └── archived/ # 実装済みor却下 +│ +├── new-features/ # 新機能アイデア +│ ├── *.md # 各新機能案 +│ └── archived/ # 実装済みor却下 +│ +└── other/ # その他すべて + ├── *.md # 調査、メモ、設計案など + └── archived/ # 完了済み +``` + +## 📝 ファイル形式 + +### improvements/ 用テンプレート +```markdown +# [機能名] の改善 +Status: Pending (80%実装済み) +Created: YYYY-MM-DD +Priority: High/Medium/Low +Related-Code: src/path/to/file.rs::function_name() + +## 現状(80%実装) +- 現在の実装内容 +- 動作状況 + +## 改善案(残り20%) +### 1. 改善項目1 +- 詳細 +- 効果 + +### 2. 改善項目2 +- 詳細 +- 効果 + +## 実装タイミング +- [ ] 条件1が満たされたら +- [ ] 条件2が発生したら +- [ ] Phase Xで一括対応 +``` + +## 🏷️ ファイル命名規則 + +`YYYY-MM-DD-feature-name.md` + +例: +- `2025-08-25-vm-andor-shortcircuit.md` +- `2025-08-26-mir-builder-cleanup.md` + +## 📊 優先度 + +- **High**: ユーザーから要望があった、または性能に大きく影響 +- **Medium**: 改善すると良いが、現状でも問題ない +- **Low**: Nice to have、時間があれば + +## 🔄 ワークフロー + +1. アイデアが生まれる → 適切なフォルダに`.md`作成 +2. 実装タイミングが来る → 実装 +3. 実装完了 → `archived/`へ移動(削除せず記録として残す) + +## 💡 なぜこの管理方法? + +- **80/20ルール遵守**: 完璧主義を防ぎ、進捗を優先 +- **アイデアの可視化**: 良いアイデアを忘れない +- **優先順位明確化**: 本当に必要な20%だけを後で実装 +- **変化への対応**: 要件変更時も80%実装なら修正が楽 + +--- +Created: 2025-08-25 \ No newline at end of file diff --git a/ideas/improvements/2025-08-25-vm-andor-shortcircuit.md b/ideas/improvements/2025-08-25-vm-andor-shortcircuit.md new file mode 100644 index 00000000..ece95c2c --- /dev/null +++ b/ideas/improvements/2025-08-25-vm-andor-shortcircuit.md @@ -0,0 +1,52 @@ +# VM and/or 短絡評価の実装 +Status: Pending (80%実装済み) +Created: 2025-08-25 +Priority: Low +Related-Code: src/backend/vm_instructions.rs::execute_binop() + +## 現状(80%実装) +- `as_bool()`で両オペランドを評価してから論理演算を実行 +- 基本動作は完全に正常、テストもすべて通過 +- コード: + ```rust + BinOp::And => { + let left_bool = left_val.as_bool(); + let right_bool = right_val.as_bool(); + Ok(self.allocate_value(VMValue::Bool(left_bool && right_bool))) + } + ``` + +## 改善案(残り20%) +### 1. 短絡評価の実装 +- `And`: 左辺がfalseなら右辺の評価をスキップ +- `Or`: 左辺がtrueなら右辺の評価をスキップ +- 効果: 不要な計算の削減、副作用のある式での正しい動作 + +### 2. 実装スケッチ +```rust +BinOp::And => { + let left_val = self.get_value(left)?; + if !left_val.as_bool() { + // 左辺がfalseなら即座にfalseを返す + return Ok(self.allocate_value(VMValue::Bool(false))); + } + // 左辺がtrueの場合のみ右辺を評価 + let right_val = self.get_value(right)?; + Ok(self.allocate_value(VMValue::Bool(right_val.as_bool()))) +} +``` + +### 3. 考慮事項 +- MIRレベルでの最適化との整合性 +- デバッグ時のステップ実行への影響 +- パフォーマンステストの必要性 + +## 実装タイミング +- [ ] パフォーマンス問題が報告されたら +- [ ] 副作用のある式(関数呼び出し等)で問題が発生したら +- [ ] Phase 10(最適化フェーズ)で一括対応 + +## メモ +- 現在の実装でも機能的には問題ない +- Pythonも初期は短絡評価なしだった(後から追加) +- まずは動くことを優先する80/20ルールの良い例 \ No newline at end of file diff --git a/ideas/new-features/2025-08-25-repl-mode.md b/ideas/new-features/2025-08-25-repl-mode.md new file mode 100644 index 00000000..3d11d3ee --- /dev/null +++ b/ideas/new-features/2025-08-25-repl-mode.md @@ -0,0 +1,56 @@ +# REPL (Read-Eval-Print Loop) モード +Status: Idea +Created: 2025-08-25 +Priority: Medium +Related: CLI機能拡張 + +## 概要 +Nyashの対話的実行環境。Pythonのような即座にコードを試せる環境を提供。 + +## 想定される使用例 +```bash +$ nyash --repl +Nyash REPL v1.0.0 +>>> local x = 42 +>>> print(x + 8) +50 +>>> box Point { init { x, y } } +>>> local p = new Point() +>>> p.x = 10 +>>> p.y = 20 +>>> print(p) +Point { x: 10, y: 20 } +>>> exit() +``` + +## 実装案 +### Phase 1: 基本REPL +- 単一行の評価と実行 +- 変数の永続化 +- 基本的なエラーハンドリング + +### Phase 2: 高度な機能 +- 複数行入力(継続行)のサポート +- ヒストリー機能(上下キーで履歴) +- タブ補完(変数名、メソッド名) +- `.help`、`.clear`などのメタコマンド + +### Phase 3: デバッグ統合 +- ブレークポイント設定 +- 変数の詳細表示 +- メモリ使用状況の確認 + +## 技術的考慮事項 +- 現在のインタープリター構造との統合 +- 状態管理(グローバルスコープの扱い) +- rustyline等のREPLライブラリの活用 + +## 実装タイミング +- [ ] 基本的な開発ツールが整った後 +- [ ] ユーザーからの要望が多い場合 +- [ ] 教育用途での需要が高まった場合 + +## 参考 +- Python REPL +- Node.js REPL +- Rust playground(Web版も検討) \ No newline at end of file diff --git a/ideas/other/2025-08-25-cranelift-research.md b/ideas/other/2025-08-25-cranelift-research.md new file mode 100644 index 00000000..acb60c48 --- /dev/null +++ b/ideas/other/2025-08-25-cranelift-research.md @@ -0,0 +1,77 @@ +# Cranelift JIT 調査メモ +Status: Research +Created: 2025-08-25 +Priority: High (Phase 10関連) +Related: Phase 10 - Cranelift JIT実装 + +## 調査内容 + +### Craneliftとは +- Wasmtime/Firefoxで使用されているコード生成器 +- LLVMより軽量で高速なコンパイル +- Rustで書かれており、Nyashとの統合が容易 + +### 基本的な使用方法 +```rust +use cranelift::prelude::*; +use cranelift_module::{Module, Linkage}; + +// 関数シグネチャ定義 +let mut sig = module.make_signature(); +sig.params.push(AbiParam::new(types::I64)); +sig.returns.push(AbiParam::new(types::I64)); + +// 関数生成 +let func_id = module.declare_function("add_one", Linkage::Export, &sig)?; +``` + +### MIR → Cranelift IR変換の検討 +- MIR命令とCranelift命令の対応関係 +- Box型の表現方法(ポインタ vs 値) +- GCとの統合方法 + +### パフォーマンス予測 +- コンパイル時間: LLVM比 10x高速 +- 実行速度: インタープリター比 10-100x高速 +- メモリ使用量: 中程度 + +## 実装スケッチ +```rust +// MIR → Cranelift変換器 +struct MirToCranelift { + builder: FunctionBuilder<'static>, + module: Module, +} + +impl MirToCranelift { + fn translate_instruction(&mut self, inst: &MirInstruction) { + match inst { + MirInstruction::Const { dst, value } => { + // Cranelift IRへの変換 + } + // ... + } + } +} +``` + +## 課題と検討事項 +1. **Box型の扱い**: ヒープ割り当てとGCの統合 +2. **動的ディスパッチ**: BoxCallの効率的な実装 +3. **例外処理**: Nyashのエラーハンドリングとの統合 +4. **デバッグ情報**: ソース位置の保持 + +## 次のステップ +- [ ] 最小限のPoC実装(整数演算のみ) +- [ ] ベンチマーク環境の構築 +- [ ] VM実装との性能比較 + +## 参考資料 +- [Cranelift公式ドキュメント](https://github.com/bytecodealliance/wasmtime/tree/main/cranelift) +- [Cranelift IR Reference](https://github.com/bytecodealliance/wasmtime/blob/main/cranelift/docs/ir.md) +- wasmtimeのJIT実装 + +## メモ +- Phase 10での実装が決定 +- まずはホットパスの特定から +- 段階的な移行が重要(全部一度には無理) \ No newline at end of file diff --git a/src/backend/vm.rs b/src/backend/vm.rs index ae53d2b5..70a4ce06 100644 --- a/src/backend/vm.rs +++ b/src/backend/vm.rs @@ -203,9 +203,9 @@ pub struct VM { /// Active MIR module during execution (for function calls) module: Option, /// Instruction execution counters (by MIR opcode) - instr_counter: std::collections::HashMap<&'static str, usize>, + pub(super) instr_counter: std::collections::HashMap<&'static str, usize>, /// Execution start time for optional stats - exec_start: Option, + pub(super) exec_start: Option, // Phase 9.78a: Add unified Box handling components // TODO: Re-enable when interpreter refactoring is complete // /// Box registry for creating all Box types diff --git a/src/box_trait.rs b/src/box_trait.rs index e6bf84d9..f162fc65 100644 --- a/src/box_trait.rs +++ b/src/box_trait.rs @@ -729,6 +729,7 @@ pub struct ResultBox { base: BoxBase, } +#[allow(deprecated)] impl ResultBox { pub fn new_success(value: Box) -> Self { Self { @@ -772,6 +773,7 @@ impl ResultBox { } } +#[allow(deprecated)] impl BoxCore for ResultBox { fn box_id(&self) -> u64 { self.base.id @@ -794,6 +796,7 @@ impl BoxCore for ResultBox { } } +#[allow(deprecated)] impl NyashBox for ResultBox { fn to_string_box(&self) -> StringBox { if self.is_success { @@ -863,6 +866,7 @@ impl NyashBox for ResultBox { } } +#[allow(deprecated)] impl Display for ResultBox { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.fmt_box(f) diff --git a/src/mir/loop_builder.rs b/src/mir/loop_builder.rs index 4b15407a..e24d6fbe 100644 --- a/src/mir/loop_builder.rs +++ b/src/mir/loop_builder.rs @@ -82,11 +82,14 @@ impl<'a> LoopBuilder<'a> { // 7. ループボディの構築 self.set_current_block(body_id)?; self.emit_safepoint()?; - + // ボディをビルド for stmt in body { self.build_statement(stmt)?; } + // latchブロックのスナップショットを保存(phi入力解決用) + let latch_snapshot = self.get_current_variable_map(); + self.block_var_maps.insert(body_id, latch_snapshot); // 8. Latchブロック(ボディの最後)からHeaderへ戻る let latch_id = self.current_block()?; @@ -114,6 +117,8 @@ impl<'a> LoopBuilder<'a> { ) -> Result<(), String> { // 現在の変数マップから、ループで使用される可能性のある変数を取得 let current_vars = self.get_current_variable_map(); + // preheader時点のスナップショット(後でphi入力の解析に使う) + self.block_var_maps.insert(preheader_id, current_vars.clone()); // 各変数に対して不完全なPhi nodeを作成 let mut incomplete_phis = Vec::new(); @@ -271,9 +276,12 @@ impl<'a> LoopBuilder<'a> { self.parent_builder.variable_map.insert(name, value); } - fn get_variable_at_block(&self, name: &str, _block_id: BasicBlockId) -> Option { - // 簡易実装:現在の変数マップから取得 - // TODO: 本来はブロックごとの変数マップを管理すべき + fn get_variable_at_block(&self, name: &str, block_id: BasicBlockId) -> Option { + // まずブロックごとのスナップショットを優先 + if let Some(map) = self.block_var_maps.get(&block_id) { + if let Some(v) = map.get(name) { return Some(*v); } + } + // フォールバック:現在の変数マップ(単純ケース用) self.parent_builder.variable_map.get(name).copied() } @@ -285,4 +293,4 @@ impl<'a> LoopBuilder<'a> { fn build_statement(&mut self, stmt: ASTNode) -> Result { self.parent_builder.build_expression(stmt) } -} \ No newline at end of file +} diff --git a/src/mir/verification.rs b/src/mir/verification.rs index 7414f01b..54c6bec4 100644 --- a/src/mir/verification.rs +++ b/src/mir/verification.rs @@ -589,6 +589,9 @@ impl std::fmt::Display for VerificationError { VerificationError::InvalidBarrierPointer { ptr, block, instruction_index, reason } => { write!(f, "Invalid Barrier pointer {} in block {} at {}: {}", ptr, block, instruction_index, reason) }, + VerificationError::SuspiciousBarrierContext { block, instruction_index, note } => { + write!(f, "Suspicious Barrier context in block {} at {}: {}", block, instruction_index, note) + }, } } } diff --git a/tools/core_ci.sh b/tools/core_ci.sh new file mode 100644 index 00000000..652f1874 --- /dev/null +++ b/tools/core_ci.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT_DIR" + +echo "[core-ci] Build (release)" +cargo build --release -j32 + +echo "[core-ci] Golden snapshots" +./tools/ci_check_golden.sh + +echo "[core-ci] Done (core build + golden checks)" +