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.

This commit is contained in:
Moe Charm
2025-08-26 01:42:18 +09:00
parent 7705508b99
commit 9c94e88b86
13 changed files with 408 additions and 36 deletions

105
CLAUDE.md
View File

@ -3,11 +3,11 @@
Nyashプログラミング言語開発に必要な情報をまとめたクイックリファレンス。 Nyashプログラミング言語開発に必要な情報をまとめたクイックリファレンス。
## 🧭 Start Here (最初に見る) ## 🧭 Start Here (最初に見る)
- **🎯 主軸タスク**: [docs/development/roadmap/native-plan/copilot_issues.txt](docs/development/roadmap/native-plan/copilot_issues.txt) **← 最重要!** - **🎯 主軸タスク**: [copilot_issues.txt](docs/development/roadmap/native-plan/copilot_issues.txt) **← 最重要!**
- 現在のタスク: [docs/development/current/CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md)(近々/中期/長期の計画は同ファイル先頭) - **📋 現在のタスク**: [CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md)(近々/中期/長期の計画は同ファイル先頭)
- ドキュメント入口: [docs/README.md](docs/README.md) - **📚 言語仕様**: まず[LANGUAGE_REFERENCE_2025.md](docs/reference/language/LANGUAGE_REFERENCE_2025.md)を読む
- コア概念(速習): [docs/reference/architecture/nyash_core_concepts.md](docs/reference/architecture/nyash_core_concepts.md) - **📦 Box システム**: [boxes-system/](docs/reference/boxes-system/)でAPI確認
- NetプラグインHTTP/TCP: [docs/reference/plugin-system/net-plugin.md](docs/reference/plugin-system/net-plugin.md) - **⚙️ 実行バックエンド**: [execution-backends.md](docs/reference/architecture/execution-backends.md)
## 🤖 **Claude×Copilot協調開発の主軸** ## 🤖 **Claude×Copilot協調開発の主軸**
### 📋 **copilot_issues.txt - 開発の軸となるファイル** ### 📋 **copilot_issues.txt - 開発の軸となるファイル**
@ -21,6 +21,23 @@ Nyashプログラミング言語開発に必要な情報をまとめたクイッ
**迷ったらcopilot_issues.txtを確認せよ** **迷ったら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/native-plan/](docs/development/roadmap/native-plan/)
- フェーズ課題: [docs/development/roadmap/](docs/development/roadmap/) - フェーズ課題: [docs/development/roadmap/](docs/development/roadmap/)
- アーカイブ: [docs/archive/](docs/archive/) - アーカイブ: [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) - **🔴 現在のタスク**: [CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md) ← 今ココ!
- Playground Guide: [docs/guides/tutorials/playground_guide.md](docs/guides/tutorials/playground_guide.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)
- 現在のタスク: [docs/development/current/CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md) - **🤖 MIR 26命令**: [INSTRUCTION_SET.md](docs/reference/mir/INSTRUCTION_SET.md)
- ロードマップ: [docs/development/roadmap/](docs/development/roadmap/) - **📦 Box API**: [boxes-system/](docs/reference/boxes-system/)
### 📖 詳細リファレンス - **⚡ VM実装**: [VM_README.md](docs/reference/execution-backend/VM_README.md)
- リファレンス: [docs/reference/](docs/reference/) - **🌐 Netプラグイン**: [net-plugin.md](docs/reference/plugin-system/net-plugin.md)
- 言語仕様: [docs/reference/language/LANGUAGE_REFERENCE_2025.md](docs/reference/language/LANGUAGE_REFERENCE_2025.md) - **🎮 実装済みアプリ**: サイコロRPG・統計計算・LISPインタープリター
- 可視性/デリゲーション: [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インタープリター
## ⚡ 重要な設計原則 ## ⚡ 重要な設計原則
@ -445,6 +457,47 @@ NYASH_VM_DEBUG=1 # VM のみ
gemini -p "Nyashの実装で困っています..." 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開発の注意点追加** 最終更新: 2025年8月25日 - **🏃 80/20ルールとideas/フォルダ構造追加**
- **TLV Handle処理**: type_idとfini_method_idの正しい扱い方を追 - **80/20ルール**: 完璧より進捗を優先する開発方針を明
- **Phase 9.75g-0完了**: BID-FFI Step 1-3実装成功プラグイン・テスター・設定 - **ideas/フォルダ**: 改善案・新機能・その他アイデアの管理構造を追加
- **plugin-tester**: 汎用プラグイン診断ツール完成CLAUDE.mdに追加 - **ドキュメント整理**: 重複セクションを統合してスリム化
- **設計原則達成**: Box名非決め打ち・birth/finiライフサイクル・メモリ管理明確化
- **次のステップ**: Step 4 - Nyashとの統合src/bid/モジュール実装)
- **copilot_issues.txt**: Phase順開発計画の軸として継続
- **次期最優先**: AST→MIR Lowering完全実装Phase 8.4

View File

@ -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` を走らせる。
- runnerCLIフラグ/バックエンド選択)変更の影響をコア側に伝播させない。
最終更新: 2025-08-25

View File

@ -75,7 +75,7 @@ tools/ci_check_golden.sh # 代表ケースのMIR含有チェック
- 修正後、`local_tests/and_or_vm.nyash``false/true` の出力を確認。 - 修正後、`local_tests/and_or_vm.nyash``false/true` の出力を確認。
2. **MIR26命令対応** 2. **MIR26命令対応**
- TypeOp/WeakRef/Barrierのプリンタ拡張 - TypeOp/WeakRef/Barrierのプリンタ拡張
- スナップショット整備 - スナップショット整備extern_call/loop/boxcall/typeop_mixed 追加済)
- vm-stats差分確認 - vm-stats差分確認
3. **Builder適用拡大** 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 デバッグ(任意) # 7) VM BoxCall デバッグ(任意)
NYASH_VM_DEBUG_BOXCALL=1 ./target/release/nyash --backend vm local_tests/test_vm_array_getset.nyash 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はドキュメントの正典、実装は互換を維持。

View File

@ -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 🚀

80
ideas/README.md Normal file
View File

@ -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

View File

@ -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ルールの良い例

View File

@ -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 playgroundWeb版も検討

View File

@ -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<SimpleJITBackend>,
}
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での実装が決定
- まずはホットパスの特定から
- 段階的な移行が重要(全部一度には無理)

View File

@ -203,9 +203,9 @@ pub struct VM {
/// Active MIR module during execution (for function calls) /// Active MIR module during execution (for function calls)
module: Option<MirModule>, module: Option<MirModule>,
/// Instruction execution counters (by MIR opcode) /// 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 /// Execution start time for optional stats
exec_start: Option<Instant>, pub(super) exec_start: Option<Instant>,
// Phase 9.78a: Add unified Box handling components // Phase 9.78a: Add unified Box handling components
// TODO: Re-enable when interpreter refactoring is complete // TODO: Re-enable when interpreter refactoring is complete
// /// Box registry for creating all Box types // /// Box registry for creating all Box types

View File

@ -729,6 +729,7 @@ pub struct ResultBox {
base: BoxBase, base: BoxBase,
} }
#[allow(deprecated)]
impl ResultBox { impl ResultBox {
pub fn new_success(value: Box<dyn NyashBox>) -> Self { pub fn new_success(value: Box<dyn NyashBox>) -> Self {
Self { Self {
@ -772,6 +773,7 @@ impl ResultBox {
} }
} }
#[allow(deprecated)]
impl BoxCore for ResultBox { impl BoxCore for ResultBox {
fn box_id(&self) -> u64 { fn box_id(&self) -> u64 {
self.base.id self.base.id
@ -794,6 +796,7 @@ impl BoxCore for ResultBox {
} }
} }
#[allow(deprecated)]
impl NyashBox for ResultBox { impl NyashBox for ResultBox {
fn to_string_box(&self) -> StringBox { fn to_string_box(&self) -> StringBox {
if self.is_success { if self.is_success {
@ -863,6 +866,7 @@ impl NyashBox for ResultBox {
} }
} }
#[allow(deprecated)]
impl Display for ResultBox { impl Display for ResultBox {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.fmt_box(f) self.fmt_box(f)

View File

@ -82,11 +82,14 @@ impl<'a> LoopBuilder<'a> {
// 7. ループボディの構築 // 7. ループボディの構築
self.set_current_block(body_id)?; self.set_current_block(body_id)?;
self.emit_safepoint()?; self.emit_safepoint()?;
// ボディをビルド // ボディをビルド
for stmt in body { for stmt in body {
self.build_statement(stmt)?; 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へ戻る // 8. Latchブロックボディの最後からHeaderへ戻る
let latch_id = self.current_block()?; let latch_id = self.current_block()?;
@ -114,6 +117,8 @@ impl<'a> LoopBuilder<'a> {
) -> Result<(), String> { ) -> Result<(), String> {
// 現在の変数マップから、ループで使用される可能性のある変数を取得 // 現在の変数マップから、ループで使用される可能性のある変数を取得
let current_vars = self.get_current_variable_map(); let current_vars = self.get_current_variable_map();
// preheader時点のスナップショット後でphi入力の解析に使う
self.block_var_maps.insert(preheader_id, current_vars.clone());
// 各変数に対して不完全なPhi nodeを作成 // 各変数に対して不完全なPhi nodeを作成
let mut incomplete_phis = Vec::new(); let mut incomplete_phis = Vec::new();
@ -271,9 +276,12 @@ impl<'a> LoopBuilder<'a> {
self.parent_builder.variable_map.insert(name, value); self.parent_builder.variable_map.insert(name, value);
} }
fn get_variable_at_block(&self, name: &str, _block_id: BasicBlockId) -> Option<ValueId> { fn get_variable_at_block(&self, name: &str, block_id: BasicBlockId) -> Option<ValueId> {
// 簡易実装:現在の変数マップから取得 // まずブロックごとのスナップショットを優先
// TODO: 本来はブロックごとの変数マップを管理すべき 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() self.parent_builder.variable_map.get(name).copied()
} }
@ -285,4 +293,4 @@ impl<'a> LoopBuilder<'a> {
fn build_statement(&mut self, stmt: ASTNode) -> Result<ValueId, String> { fn build_statement(&mut self, stmt: ASTNode) -> Result<ValueId, String> {
self.parent_builder.build_expression(stmt) self.parent_builder.build_expression(stmt)
} }
} }

View File

@ -589,6 +589,9 @@ impl std::fmt::Display for VerificationError {
VerificationError::InvalidBarrierPointer { ptr, block, instruction_index, reason } => { VerificationError::InvalidBarrierPointer { ptr, block, instruction_index, reason } => {
write!(f, "Invalid Barrier pointer {} in block {} at {}: {}", 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)
},
} }
} }
} }

14
tools/core_ci.sh Normal file
View File

@ -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)"