docs(issues): DebugBox Arc<Mutex>→RwLock変換Issue作成 + FutureBox import修正

## 📋 新規Issue作成
- phase_9_75c_debugbox_fix.md: DebugBox専用修正Issue作成
- phase_9_75c_fix_compile_errors_jp.md: 既存Issue日本語版更新

## 🔧 FutureBox import修正
- src/interpreter/mod.rs: crate::boxes::FutureBox import追加
- src/interpreter/io.rs: FutureBox import パス修正

## 🎯 現状
- Issue #92:  解決済み (FutureBox二重定義)
- PR #93:  完了 (FutureBox統一)
- 残存: 39個エラー (DebugBox未変換)

## 📊 技術詳細
- DebugBox: 11箇所の.lock() → .read()/.write()変換必要
- Clone derive: 手動実装が必要
- 他10個Box型: RwLock変換完了済み

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-08-15 11:44:10 +09:00
parent ab9cc58e36
commit d0a1e43f9a
4 changed files with 573 additions and 2 deletions

View File

@ -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<Mutex>→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<Mutex>→RwLock変換が完全に見落とされている
### ✅ 変換済みBox型 (PR #91 + PR #93)
- **HTTPServerBox**: 7個のArc<Mutex>フィールド → RwLock
- **P2PBox**: `Arc<Mutex<P2PBoxData>>`型エイリアスから完全書き換え
- **IntentBox**: `Arc<Mutex<IntentBoxData>>`型エイリアスから完全書き換え
- **SimpleIntentBox**: listenersハッシュマップ変換
- **JSONBox**: serde_json::Value操作
- **RandomBox**: seedフィールド変換
- **EguiBox**: クロススレッドArc<RwLock>での複雑な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<bool>,
tracked_boxes: RwLock<HashMap<String, TrackedBoxInfo>>,
breakpoints: RwLock<Vec<String>>,
call_stack: RwLock<Vec<CallInfo>>,
}
```
### 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<bool>, // シンプルな内部可変性
tracked_boxes: RwLock<HashMap<String, TrackedBoxInfo>>,
breakpoints: RwLock<Vec<String>>,
call_stack: RwLock<Vec<CallInfo>>,
}
// 外部: Arc<Mutex<dyn NyashBox>> (変更なし)
// ❌ 間違い: 二重ロック問題 (排除済み)
struct DebugBox {
field: Arc<Mutex<T>>, // 内部ロック - 排除済み
}
// + 外部: Arc<Mutex<dyn NyashBox>>
```
## 🔍 修正すべきパターン
### 1. **Clone derive削除 + 手動実装**
```rust
// ❌ 削除すべき
#[derive(Debug, Clone)]
// ✅ 変更後
#[derive(Debug)]
pub struct DebugBox {
// ... フィールド
}
impl NyashBox for DebugBox {
fn clone_box(&self) -> Box<dyn NyashBox> {
// 手動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<Mutex>排除確認
$ grep -r "Arc<Mutex<" src/boxes/debug_box.rs
# 結果: 0件であるべき
# DebugBoxでのRwLock採用確認
$ grep -r "RwLock<" src/boxes/debug_box.rs | wc -l
# 結果: 4件 (tracking_enabled, tracked_boxes, breakpoints, call_stack)
```
## 🛠️ 詳細修正手順
### ステップ1: Clone derive削除
```rust
// src/boxes/debug_box.rs: line 110
// ❌ 削除
#[derive(Debug, Clone)]
// ✅ 変更後
#[derive(Debug)]
```
### ステップ2: 11箇所の.lock()変換
**読み取り専用アクセス (8箇所)**:
```rust
// Lines: 191, 231, 274, 306, 322, 345
self.tracked_boxes.lock().unwrap() self.tracked_boxes.read().unwrap()
// Line: 182 (別ファイルのinstance.fields)
instance.fields.lock().unwrap() instance.fields.read().unwrap()
// Line: 274
self.call_stack.lock().unwrap() self.call_stack.read().unwrap()
```
**書き込みアクセス (3箇所)**:
```rust
// Lines: 251, 258, 290, 293
self.breakpoints.lock().unwrap() self.breakpoints.write().unwrap()
self.call_stack.lock().unwrap() self.call_stack.write().unwrap()
self.tracked_boxes.lock().unwrap() self.tracked_boxes.write().unwrap()
```
### ステップ3: 手動Clone実装
```rust
impl NyashBox for DebugBox {
fn clone_box(&self) -> Box<dyn NyashBox> {
// 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<Mutex>二重ロックシナリオの完全排除
### 開発ブロック解除
- **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のみ残存)

View File

@ -0,0 +1,267 @@
# Phase 9.75-C DebugBox修正: 残存する39個のコンパイルエラー解決
**優先度**: 🔴 **緊急** (全開発ブロック中)
**担当者**: @copilot-swe-agent
**ステータス**: 未解決
**作成日**: 2025-08-15
## 🚨 問題概要
**Issue #92とPR #93でFutureBox問題は解決済み**ですが、**DebugBox**のArc<Mutex>→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<Mutex>→RwLock変換が完全に見落とされている
### ✅ 変換済みBox型 (PR #91)
- **HTTPServerBox**: 7個のArc<Mutex>フィールド → RwLock
- **P2PBox**: `Arc<Mutex<P2PBoxData>>`型エイリアスから完全書き換え
- **IntentBox**: `Arc<Mutex<IntentBoxData>>`型エイリアスから完全書き換え
- **SimpleIntentBox**: listenersハッシュマップ変換
- **JSONBox**: serde_json::Value操作
- **RandomBox**: seedフィールド変換
- **EguiBox**: クロススレッドArc<RwLock>での複雑なGUI状態
- **FileBox**: ファイルI/O操作、パス簡素化
- **FutureBox**: 非同期状態管理
- **SocketBox**: TCP操作更新
### 🎯 目標アーキテクチャ (達成すべき状態)
```rust
// ✅ 正しい: 単一責務設計
struct SomeBox {
field: RwLock<T>, // シンプルな内部可変性
}
// 外部: Arc<Mutex<dyn NyashBox>> (変更なし)
// ❌ 間違い: 二重ロック問題 (排除済み)
struct SomeBox {
field: Arc<Mutex<T>>, // 内部ロック - 排除済み
}
// + 外部: Arc<Mutex<dyn NyashBox>>
```
## 🔍 DebugBox問題の技術的分析
**具体的エラー箇所**: `src/boxes/debug_box.rs`
### 📊 **特定されたエラー**
### 1. **DebugBox構造体**: Clone derive問題
```rust
// ❌ 現在の問題
#[derive(Debug, Clone)] // RwLockはCloneを実装していない
pub struct DebugBox {
tracking_enabled: RwLock<bool>,
tracked_boxes: RwLock<HashMap<String, TrackedBoxInfo>>,
// ... 他フィールド
}
```
### 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<Mutex<T>>`を期待しているが`RwLock<T>`を受け取っている。
### 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<Mutex>排除確認
$ grep -r "Arc<Mutex<" src/boxes/
# 結果: 0件であるべき
# RwLock採用確認
$ grep -r "RwLock<" src/boxes/ | wc -l
# 結果: 10+件 (変換済みBox毎に1つ)
```
## 🛠️ 詳細修正手順
### ステップ1: 具体的エラーの特定
```bash
cargo check --lib 2>&1 | grep -A 3 "error\[E"
```
これらのエラータイプに注目:
- **E0599**: メソッドが見つからない (おそらく`.lock()``.read()`/`.write()`)
- **E0308**: 型不一致 (Arc<Mutex<T>> → RwLock<T>)
- **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<dyn NyashBox> {
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<Mutex<T>>を返していた場合、RwLock<T>に更新
```
## 🧪 テスト要件
### 重要なテストケース
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<Mutex>排除の例
### アーキテクチャドキュメント
- **Everything is Box哲学**: `docs/説明書/reference/box-design/`
- **RwLockパターン**: PR #87で確立されたパターンに従う
### 関連Issue
- **元のIssue #90**: Arc<Mutex>二重ロック問題の特定
- **Phase 9.5依存関係**: HTTPServerBoxが今後の作業にとって重要
## 🚀 修正後の期待される影響
### パフォーマンス向上
- **並行読み取りアクセス**: RwLockは複数読み取り者可能 vs Mutex単一アクセス
- **ロック競合減少**: Box操作のスケーラビリティ向上
- **デッドロック防止**: Arc<Mutex>二重ロックシナリオの排除
### 開発ブロック解除
- **Phase 9.5準備完了**: HTTPServerBoxがHTTPサーバーテスト用に機能
- **WASM/AOT開発**: 全Box型がコンパイル互換
- **将来のPhase**: Phase 10+ LLVM作業の堅実な基盤
## ⚠️ 品質要件
**これは簡単な修正ではありません** - 以下を確実に:
1. **完全なパターン適用**: 全Arc<Mutex> → RwLock変換が適切に実装されること
2. **型安全性**: unsafeな回避策なしで全型不一致を解決すること
3. **パフォーマンス検証**: RwLock使用が読み取り/書き込みベストプラクティスに従うこと
4. **包括的テスト**: 変換済み全Box型の機能を検証すること
5. **クリーンなコード**: 可能な限り未使用importと警告を削除すること
目標は、Everything is Box哲学を最適なパフォーマンスで完全に実現する **堅牢で本番レディな実装** です。
---
**推定作業量**: 4-6時間 (体系的修正 + テスト)
**リスクレベル**: 中 (注意深い型システム作業が必要)
**依存関係**: 解決まで全Phase 9.5+開発をブロック

View File

@ -76,7 +76,7 @@ impl NyashInterpreter {
/// nowait文を実行 - 非同期実行(真の非同期実装) - Async execution /// nowait文を実行 - 非同期実行(真の非同期実装) - Async execution
pub(super) fn execute_nowait(&mut self, variable: &str, expression: &ASTNode) -> Result<Box<dyn NyashBox>, RuntimeError> { pub(super) fn execute_nowait(&mut self, variable: &str, expression: &ASTNode) -> Result<Box<dyn NyashBox>, RuntimeError> {
use crate::box_trait::FutureBox; use crate::boxes::FutureBox;
use std::thread; use std::thread;
// FutureBoxを作成 // FutureBoxを作成

View File

@ -7,7 +7,8 @@
// Import all necessary dependencies // Import all necessary dependencies
use crate::ast::{ASTNode, BinaryOperator, CatchClause}; 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::instance::InstanceBox;
use crate::channel_box::ChannelBox; use crate::channel_box::ChannelBox;
use crate::boxes::math_box::{MathBox, FloatBox, RangeBox}; use crate::boxes::math_box::{MathBox, FloatBox, RangeBox};