diff --git a/docs/予定/native-plan/issues/phase_9_75c_debugbox_fix.md b/docs/予定/native-plan/issues/phase_9_75c_debugbox_fix.md new file mode 100644 index 00000000..763c4564 --- /dev/null +++ b/docs/予定/native-plan/issues/phase_9_75c_debugbox_fix.md @@ -0,0 +1,303 @@ +# Phase 9.75-C DebugBox修正: 残存する39個のコンパイルエラー解決 + +**優先度**: 🔴 **緊急** (全開発ブロック中) +**担当者**: @copilot-swe-agent +**ステータス**: 未解決 +**作成日**: 2025-08-15 +**関連**: Issue #92 (解決済み), PR #93 (FutureBox修正完了) + +## 🚨 問題概要 + +**Issue #92とPR #93でFutureBox問題は解決済み**ですが、**DebugBox**のArc→RwLock変換が完全に見落とされており、**39個のコンパイルエラー**が残存しています。 + +### 現在の状況 +```bash +$ cargo check --lib +error: could not compile `nyash-rust` (lib) due to 39 previous errors; 80 warnings emitted +``` + +**影響**: 全開発がブロック - ビルド、テスト、Phase 9.5以降の作業継続不可 + +## 📋 現在の状況 + +### ✅ **解決済み問題** (Issue #92 / PR #93) +- **FutureBox二重定義**: 完全解決 +- **10個のBox型**: HTTPServerBox、P2PBox等はRwLock変換済み + +### ❌ **未解決問題** (この新しいIssue) +- **DebugBox**: Arc→RwLock変換が完全に見落とされている + +### ✅ 変換済みBox型 (PR #91 + PR #93) +- **HTTPServerBox**: 7個のArcフィールド → RwLock +- **P2PBox**: `Arc>`型エイリアスから完全書き換え +- **IntentBox**: `Arc>`型エイリアスから完全書き換え +- **SimpleIntentBox**: listenersハッシュマップ変換 +- **JSONBox**: serde_json::Value操作 +- **RandomBox**: seedフィールド変換 +- **EguiBox**: クロススレッドArcでの複雑なGUI状態 +- **FileBox**: ファイルI/O操作、パス簡素化 +- **FutureBox**: 非同期状態管理 ✅ **PR #93で解決** +- **SocketBox**: TCP操作更新 + +### ❌ **未変換Box型** +- **DebugBox**: **完全に見落とされている** + +## 🔍 DebugBox問題の技術的分析 + +**具体的エラー箇所**: `src/boxes/debug_box.rs` + +### 📊 **特定されたエラー** + +### 1. **DebugBox構造体**: Clone derive問題 +```rust +// ❌ 現在の問題 +#[derive(Debug, Clone)] // RwLockはCloneを実装していない +pub struct DebugBox { + tracking_enabled: RwLock, + tracked_boxes: RwLock>, + breakpoints: RwLock>, + call_stack: RwLock>, +} +``` + +### 2. **11箇所の.lock()呼び出し**: メソッド名エラー +```bash +src/boxes/debug_box.rs:182 instance.fields.lock().unwrap() +src/boxes/debug_box.rs:191 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:231 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:251 self.breakpoints.lock().unwrap() +src/boxes/debug_box.rs:258 self.call_stack.lock().unwrap() +src/boxes/debug_box.rs:274 self.call_stack.lock().unwrap() +src/boxes/debug_box.rs:290 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:293 self.call_stack.lock().unwrap() +src/boxes/debug_box.rs:306 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:322 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:345 self.tracked_boxes.lock().unwrap() +``` + +### 3. **Clone実装**: 手動実装が必要 +RwLockはCloneを実装していないため、手動Clone実装が必要。 + +## 🎯 目標アーキテクチャ (達成すべき状態) +```rust +// ✅ 正しい: 単一責務設計 +struct DebugBox { + tracking_enabled: RwLock, // シンプルな内部可変性 + tracked_boxes: RwLock>, + breakpoints: RwLock>, + call_stack: RwLock>, +} +// 外部: Arc> (変更なし) + +// ❌ 間違い: 二重ロック問題 (排除済み) +struct DebugBox { + field: Arc>, // 内部ロック - 排除済み +} +// + 外部: Arc> +``` + +## 🔍 修正すべきパターン + +### 1. **Clone derive削除 + 手動実装** +```rust +// ❌ 削除すべき +#[derive(Debug, Clone)] + +// ✅ 変更後 +#[derive(Debug)] +pub struct DebugBox { + // ... フィールド +} + +impl NyashBox for DebugBox { + fn clone_box(&self) -> Box { + // 手動Clone実装(PR #87パターン) + let tracking_enabled = *self.tracking_enabled.read().unwrap(); + let tracked_boxes = self.tracked_boxes.read().unwrap().clone(); + let breakpoints = self.breakpoints.read().unwrap().clone(); + let call_stack = self.call_stack.read().unwrap().clone(); + + Box::new(DebugBox { + base: BoxBase::new(), + tracking_enabled: RwLock::new(tracking_enabled), + tracked_boxes: RwLock::new(tracked_boxes), + breakpoints: RwLock::new(breakpoints), + call_stack: RwLock::new(call_stack), + }) + } +} +``` + +### 2. **RwLockパターンの体系的適用** + +**読み取りアクセス**: +```rust +// ❌ 変更前 +let tracked = self.tracked_boxes.lock().unwrap(); +let value = tracked.some_property; + +// ✅ 変更後 +let tracked = self.tracked_boxes.read().unwrap(); +let value = tracked.some_property; +``` + +**書き込みアクセス**: +```rust +// ❌ 変更前 +let mut tracked = self.tracked_boxes.lock().unwrap(); +tracked.insert(key, value); + +// ✅ 変更後 +let mut tracked = self.tracked_boxes.write().unwrap(); +tracked.insert(key, value); +``` + +## 🎯 受け入れ基準 (ゴール) + +### ✅ 主要目標: コンパイル成功 +```bash +$ cargo check --lib +Finished `dev` profile [unoptimized + debuginfo] target(s) in X.XXs +``` + +### ✅ 副次目標: クリーンビルド +```bash +$ cargo build --release -j32 +Finished `release` profile [optimized] target(s) in X.XXs +``` + +### ✅ 検証: DebugBox機能確認 +```bash +# DebugBox基本機能テスト +$ ./target/release/nyash test_debug_basic.nyash +✅ DebugBoxがRwLockで動作 + +# 追跡機能テスト +$ ./target/release/nyash test_debug_tracking.nyash +✅ メモリ追跡・ブレークポイント機能正常 +``` + +### ✅ 品質保証: パターンの一貫性 +```bash +# DebugBoxでのArc排除確認 +$ grep -r "Arc Box { + // PR #87確立パターンに従う + let tracking_enabled = *self.tracking_enabled.read().unwrap(); + let tracked_boxes = self.tracked_boxes.read().unwrap().clone(); + let breakpoints = self.breakpoints.read().unwrap().clone(); + let call_stack = self.call_stack.read().unwrap().clone(); + + Box::new(DebugBox { + base: BoxBase::new(), // 新しいユニークID + tracking_enabled: RwLock::new(tracking_enabled), + tracked_boxes: RwLock::new(tracked_boxes), + breakpoints: RwLock::new(breakpoints), + call_stack: RwLock::new(call_stack), + }) + } +} +``` + +## 🧪 テスト要件 + +### 重要なテストケース +1. **DebugBox基本機能**: startTracking, stopTracking, trackBox +2. **メモリレポート**: memoryReport, dumpAll機能 +3. **ブレークポイント**: setBreakpoint, traceCall機能 +4. **並行アクセス**: RwLockによる複数読み取り者対応 + +### リグレッション防止 +- 既存のDebugBox機能は全て変更なく維持されること +- Everything is Box哲学が保持されること +- パフォーマンスが向上すること (RwLockは並行読み取り可能) + +## 📚 参考資料 + +### 成功事例 +- **PR #87**: ArrayBox、MapBox、TimeBoxでRwLockパターンを確立 +- **PR #93**: FutureBox二重定義問題の解決例 + +### アーキテクチャドキュメント +- **Everything is Box哲学**: `docs/説明書/reference/box-design/` +- **RwLockパターン**: PR #87で確立されたパターンに従う + +### 関連Issue +- **Issue #92**: FutureBox問題 (解決済み) +- **PR #93**: FutureBox修正 (完了) + +## 🚀 修正後の期待される影響 + +### パフォーマンス向上 +- **並行読み取りアクセス**: RwLockは複数読み取り者可能 vs Mutex単一アクセス +- **デバッグ効率化**: メモリ追跡の並行処理対応 +- **デッドロック防止**: Arc二重ロックシナリオの完全排除 + +### 開発ブロック解除 +- **Phase 9.5準備完了**: 全Box型がHTTPサーバーテスト対応 +- **WASM/AOT開発**: 全Box型がコンパイル互換 +- **デバッグ機能**: 本格運用でのパフォーマンス監視可能 +- **将来のPhase**: Phase 10+ LLVM作業の堅実な基盤 + +## ⚠️ 品質要件 + +**これは最後の仕上げです** - 以下を確実に: + +1. **完全なパターン適用**: 全11箇所の.lock() → .read()/.write()変換 +2. **型安全性**: Clone実装をRwLockに対応した手動実装で解決 +3. **パフォーマンス検証**: RwLock使用が読み取り/書き込みベストプラクティスに従うこと +4. **機能保持**: DebugBoxの全機能を完全に維持すること +5. **アーキテクチャ統一**: 他10個のBox型と同じRwLockパターン適用 + +目標は、Everything is Box哲学を最適なパフォーマンスで完全に実現する **堅牢で本番レディな実装** です。 + +--- + +**推定作業量**: 1-2時間 (明確に特定された11箇所の修正) +**リスクレベル**: 低 (問題箇所特定済み・修正パターン確立済み) +**依存関係**: 解決まで全Phase 9.5+開発をブロック +**緊急度**: 最高 (他の全Box型は変換完了、DebugBoxのみ残存) \ No newline at end of file diff --git a/docs/予定/native-plan/issues/phase_9_75c_fix_compile_errors_jp.md b/docs/予定/native-plan/issues/phase_9_75c_fix_compile_errors_jp.md new file mode 100644 index 00000000..4c875926 --- /dev/null +++ b/docs/予定/native-plan/issues/phase_9_75c_fix_compile_errors_jp.md @@ -0,0 +1,267 @@ +# Phase 9.75-C DebugBox修正: 残存する39個のコンパイルエラー解決 + +**優先度**: 🔴 **緊急** (全開発ブロック中) +**担当者**: @copilot-swe-agent +**ステータス**: 未解決 +**作成日**: 2025-08-15 + +## 🚨 問題概要 + +**Issue #92とPR #93でFutureBox問題は解決済み**ですが、**DebugBox**のArc→RwLock変換が完全に見落とされており、**39個のコンパイルエラー**が残存しています。 + +### 現在の状況 +```bash +$ cargo check --lib +error: could not compile `nyash-rust` (lib) due to 39 previous errors; 80 warnings emitted +``` + +**影響**: 全開発がブロック - ビルド、テスト、Phase 9.5以降の作業継続不可 + +## 📋 現在の状況 + +### ✅ **解決済み問題** (Issue #92 / PR #93) +- **FutureBox二重定義**: 完全解決 +- **10個のBox型**: HTTPServerBox、P2PBox等はRwLock変換済み + +### ❌ **未解決問題** (この新しいIssue) +- **DebugBox**: Arc→RwLock変換が完全に見落とされている + +### ✅ 変換済みBox型 (PR #91) +- **HTTPServerBox**: 7個のArcフィールド → RwLock +- **P2PBox**: `Arc>`型エイリアスから完全書き換え +- **IntentBox**: `Arc>`型エイリアスから完全書き換え +- **SimpleIntentBox**: listenersハッシュマップ変換 +- **JSONBox**: serde_json::Value操作 +- **RandomBox**: seedフィールド変換 +- **EguiBox**: クロススレッドArcでの複雑なGUI状態 +- **FileBox**: ファイルI/O操作、パス簡素化 +- **FutureBox**: 非同期状態管理 +- **SocketBox**: TCP操作更新 + +### 🎯 目標アーキテクチャ (達成すべき状態) +```rust +// ✅ 正しい: 単一責務設計 +struct SomeBox { + field: RwLock, // シンプルな内部可変性 +} +// 外部: Arc> (変更なし) + +// ❌ 間違い: 二重ロック問題 (排除済み) +struct SomeBox { + field: Arc>, // 内部ロック - 排除済み +} +// + 外部: Arc> +``` + +## 🔍 DebugBox問題の技術的分析 + +**具体的エラー箇所**: `src/boxes/debug_box.rs` + +### 📊 **特定されたエラー** + +### 1. **DebugBox構造体**: Clone derive問題 +```rust +// ❌ 現在の問題 +#[derive(Debug, Clone)] // RwLockはCloneを実装していない +pub struct DebugBox { + tracking_enabled: RwLock, + tracked_boxes: RwLock>, + // ... 他フィールド +} +``` + +### 2. **11箇所の.lock()呼び出し**: メソッド名エラー +```bash +src/boxes/debug_box.rs:182 instance.fields.lock().unwrap() +src/boxes/debug_box.rs:191 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:231 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:251 self.breakpoints.lock().unwrap() +src/boxes/debug_box.rs:258 self.call_stack.lock().unwrap() +src/boxes/debug_box.rs:274 self.call_stack.lock().unwrap() +src/boxes/debug_box.rs:290 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:293 self.call_stack.lock().unwrap() +src/boxes/debug_box.rs:306 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:322 self.tracked_boxes.lock().unwrap() +src/boxes/debug_box.rs:345 self.tracked_boxes.lock().unwrap() +``` + +**修正すべきパターン**: +```rust +// ❌ 古いコード (まだ存在) +let data = self.field.lock().unwrap(); + +// ✅ 正しくは (RwLockパターン) +let data = self.field.read().unwrap(); +// または +let mut data = self.field.write().unwrap(); +``` + +### 2. **メソッドシグネチャでの型不一致** +メソッドの戻り値の型やパラメータ型が`Arc>`を期待しているが`RwLock`を受け取っている。 + +### 3. **Clone実装の問題** +新しいRwLockベースのClone実装で型の不整合が発生している可能性。 + +### 4. **import整理が必要** +82個の警告は未使用の`Arc`、`Mutex`のimportが多数残っていることを示している。 + +## 🎯 受け入れ基準 (ゴール) + +### ✅ 主要目標: コンパイル成功 +```bash +$ cargo check --lib +Finished `dev` profile [unoptimized + debuginfo] target(s) in X.XXs +``` + +### ✅ 副次目標: クリーンビルド +```bash +$ cargo build --release -j32 +Finished `release` profile [optimized] target(s) in X.XXs +``` + +### ✅ 検証: 全Box型の機能確認 +```bash +# 基本機能テスト +$ ./target/release/nyash local_tests/test_basic_box_operations.nyash +✅ 全Box操作成功 + +# HTTPサーバーテスト (Phase 9.5にとって重要) +$ ./target/release/nyash local_tests/test_http_server_basic.nyash +✅ HTTPServerBoxがRwLockで動作 + +# P2Pテスト (将来のPhaseにとって重要) +$ ./target/release/nyash local_tests/test_p2p_basic.nyash +✅ P2PBoxがRwLockで動作 +``` + +### ✅ 品質保証: パターンの一貫性 +```bash +# Arc排除確認 +$ grep -r "Arc&1 | grep -A 3 "error\[E" +``` + +これらのエラータイプに注目: +- **E0599**: メソッドが見つからない (おそらく`.lock()` → `.read()`/`.write()`) +- **E0308**: 型不一致 (Arc> → RwLock) +- **E0282**: 型推論 (ジェネリックRwLock使用) + +### ステップ2: RwLockパターンの体系的適用 + +**読み取りアクセス**: +```rust +// ❌ 変更前 +let data = self.field.lock().unwrap(); +let value = data.some_property; + +// ✅ 変更後 +let data = self.field.read().unwrap(); +let value = data.some_property; +``` + +**書き込みアクセス**: +```rust +// ❌ 変更前 +let mut data = self.field.lock().unwrap(); +data.some_property = new_value; + +// ✅ 変更後 +let mut data = self.field.write().unwrap(); +data.some_property = new_value; +``` + +**Clone実装**: +```rust +// ✅ PR #87で確立された標準パターン +fn clone(&self) -> Box { + let data = self.field.read().unwrap(); + Box::new(SomeBox { + base: BoxBase::new(), // 新しいユニークID + field: RwLock::new(data.clone()), + }) +} +``` + +### ステップ3: import整理 +警告で特定された未使用importを削除: +```rust +// ❌ 削除すべき +use std::sync::{Arc, Mutex}; + +// ✅ 必要なもののみ残す +use std::sync::RwLock; +``` + +### ステップ4: メソッドシグネチャ更新 +全メソッドシグネチャが新しいRwLock型と一致するように確認: +```rust +// 例: メソッドがArc>を返していた場合、RwLockに更新 +``` + +## 🧪 テスト要件 + +### 重要なテストケース +1. **HTTPServerBox**: Phase 9.5 HTTPサーバーテスト用に機能必須 +2. **P2PBox**: NyaMesh P2P機能のコア +3. **SocketBox**: ネットワーク操作の依存関係 +4. **変換済み全10Box型**: 基本インスタンス化とメソッド呼び出し + +### リグレッション防止 +- 既存のBox機能は全て変更なく維持されること +- Everything is Box哲学が保持されること +- パフォーマンスが向上すること (RwLockは並行読み取り可能) + +## 📚 参考資料 + +### 過去の成功事例 +- **PR #87**: ArrayBox、MapBox、TimeBoxでRwLockパターンを確立 +- **Phase 9.75-A/B**: 成功したArc排除の例 + +### アーキテクチャドキュメント +- **Everything is Box哲学**: `docs/説明書/reference/box-design/` +- **RwLockパターン**: PR #87で確立されたパターンに従う + +### 関連Issue +- **元のIssue #90**: Arc二重ロック問題の特定 +- **Phase 9.5依存関係**: HTTPServerBoxが今後の作業にとって重要 + +## 🚀 修正後の期待される影響 + +### パフォーマンス向上 +- **並行読み取りアクセス**: RwLockは複数読み取り者可能 vs Mutex単一アクセス +- **ロック競合減少**: Box操作のスケーラビリティ向上 +- **デッドロック防止**: Arc二重ロックシナリオの排除 + +### 開発ブロック解除 +- **Phase 9.5準備完了**: HTTPServerBoxがHTTPサーバーテスト用に機能 +- **WASM/AOT開発**: 全Box型がコンパイル互換 +- **将来のPhase**: Phase 10+ LLVM作業の堅実な基盤 + +## ⚠️ 品質要件 + +**これは簡単な修正ではありません** - 以下を確実に: + +1. **完全なパターン適用**: 全Arc → RwLock変換が適切に実装されること +2. **型安全性**: unsafeな回避策なしで全型不一致を解決すること +3. **パフォーマンス検証**: RwLock使用が読み取り/書き込みベストプラクティスに従うこと +4. **包括的テスト**: 変換済み全Box型の機能を検証すること +5. **クリーンなコード**: 可能な限り未使用importと警告を削除すること + +目標は、Everything is Box哲学を最適なパフォーマンスで完全に実現する **堅牢で本番レディな実装** です。 + +--- + +**推定作業量**: 4-6時間 (体系的修正 + テスト) +**リスクレベル**: 中 (注意深い型システム作業が必要) +**依存関係**: 解決まで全Phase 9.5+開発をブロック \ No newline at end of file diff --git a/src/interpreter/io.rs b/src/interpreter/io.rs index b84a54ad..c9acc8c1 100644 --- a/src/interpreter/io.rs +++ b/src/interpreter/io.rs @@ -76,7 +76,7 @@ impl NyashInterpreter { /// nowait文を実行 - 非同期実行(真の非同期実装) - Async execution pub(super) fn execute_nowait(&mut self, variable: &str, expression: &ASTNode) -> Result, RuntimeError> { - use crate::box_trait::FutureBox; + use crate::boxes::FutureBox; use std::thread; // FutureBoxを作成 diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index 9bc59394..03078626 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -7,7 +7,8 @@ // Import all necessary dependencies use crate::ast::{ASTNode, BinaryOperator, CatchClause}; -use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox, SubtractBox, MultiplyBox, DivideBox, CompareBox, ArrayBox, FileBox, ResultBox, ErrorBox, FutureBox, BoxCore}; +use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox, SubtractBox, MultiplyBox, DivideBox, CompareBox, ArrayBox, FileBox, ResultBox, ErrorBox, BoxCore}; +use crate::boxes::FutureBox; use crate::instance::InstanceBox; use crate::channel_box::ChannelBox; use crate::boxes::math_box::{MathBox, FloatBox, RangeBox};