docs(lifecycle): Phase 285 P1 - Box lifecycle 実装棚卸し完了

## Rust VM 実装棚卸し(11項目)
- WeakBox 生成/観測/真実値判定: value.rs
- weak_to_strong: upgrade_weak() 失敗時 Void
- Finalizer: finalization.rs (scope レベル、InstanceBox 限定)
- Scope 追跡: scope_tracker.rs (Arc/Weak 管理)
- MIR WeakNew/WeakLoad: handlers/weak.rs

## LLVM harness 状況
- WeakNew/WeakLoad:  実装済み (llvm_py/instructions/weak.py)
- Finalizer:  未実装 (scope 管理なし)
- GC:  未実装 (RC のみ)

## P2 smoke 候補絞り込み(4本)
- weak_basic_vm/llvm: 既存+LLVM版
- weak_to_strong_fail: null 確認(新規)
- weak_cycle_report: leak report(新規)

**重要な発見**:
- WeakRef は両バックエンド完全実装(仕様通り)
- Finalizer は VM scope レベルで実装あり、LLVM 未対応

quick smoke 154/154 PASS

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-26 10:55:33 +09:00
parent 5ec0056059
commit b7f14e38d7

View File

@ -167,38 +167,70 @@ If any of the following are missing, treat weak smokes as **unsupported** and sc
- 仕様の固定weakref の weak_to_strong 成否、finalizer の発火条件、禁止事項)
- “LLVM harness の扱い” を明文化(未対応なら未対応として SSOT に書く)
### P1investigation
### P1investigation✅ COMPLETE (2025-12-26)
**目的**: Rust VM の現状実装の棚卸し(どこで roots が形成され、どこで解放/最終化されるか)
**棚卸し対象ファイル**:
| ファイル | 観測ポイント |
|----------|-------------|
| `src/value.rs` | `NyashValue::WeakBox` 生成箇所、`weak_to_strong()` 失敗時の観測方法 |
| `src/finalization.rs` | finalizer 存在確認、登録・呼び出しタイミング・順序 |
| `src/box_trait.rs` | Box の所有モデルArc/Weak の境界、roots の形成点)|
| `src/scope_tracker.rs` | Box の登録/スコープ管理 |
#### Rust VM 実装棚卸し
**LLVM harness 調査**:
- `src/llvm_py/` で weakref/finalizer の相当機能を確認
- 無いなら「無い」を明文化し、smoke を SKIP にする
| 責務 | ファイル | 関連シンボル | 観測ポイント | SSOT との差分 |
|------|----------|-------------|-------------|--------------|
| WeakBox 生成 | `src/value.rs:32` | `NyashValue::WeakBox` | `Weak<Mutex<dyn NyashBox>>` で保持 | ✅ 仕様通り |
| weak_to_strong | `src/value.rs:196-201` | `upgrade_weak()` | `Weak::upgrade()` 失敗時 `Void` | ✅ 仕様通り |
| WeakBox 観測 | `src/value.rs:106-115` | `to_string()` + `upgrade()` | `WeakRef(null)` 表示で死亡観測可能 | ✅ 仕様通り |
| WeakBox 真実値 | `src/value.rs:157-160` | `to_bool()` | `weak_ref.upgrade().is_some()` → 生死判定 | ✅ 仕様通り |
| Finalizer 登録 | `src/finalization.rs:49-52` | `BoxFinalizer::track()` | InstanceBox のスコープ終了時 `fini()` 呼び出し | ⚠️ スコープレベル |
| Finalizer 呼び出し | `src/finalization.rs:61-76` | `finalize_all()` | `instance.fini()` を呼び出す(存在チェック付き) | ✅ 実装済み |
| Scope 追跡 | `src/scope_tracker.rs:14-28` | `ScopeTracker` | `stack: Vec<Vec<Arc<dyn NyashBox>>>` | ✅ 実装済み |
| Scope push/pop | `src/scope_tracker.rs:31-43` | `push_scope()/pop_scope()` | 逆順で `fini()` 呼び出し | ✅ 実装済み |
| Roots 形成 | `src/scope_tracker.rs:85-100` | `enter_root_region()/leave_root_region()` | GC root region 管理Phase 10.4 prep | ⚠️ 準備中 |
| MIR WeakNew | `src/backend/mir_interpreter/handlers/weak.rs:23-34` | `handle_weak_new()` | Box → Weak の変換 | ✅ 仕様通り |
| MIR WeakLoad | `src/backend/mir_interpreter/handlers/weak.rs:48-58` | `handle_weak_load()` | Weak → Box \| Void 昇格 | ✅ 仕様通り |
**重要な観測**:
- `ScopeTracker`**Rust MM レベル**Arc/Weakで管理
- `BoxFinalizer`**スコープレベル**(ブロックスコープ)で管理(別モジュール)
- WeakRef は **値表現レベル** (`Weak<Mutex<dyn NyashBox>>`) で実装
- Finalizer は **InstanceBox 限定**`downcast_ref::<InstanceBox>()` で確認後呼び出し)
#### LLVM harness 状況
| 機能 | 実装状況 | ファイル | 備考 |
|------|----------|----------|------|
| WeakNew | ✅ 実装済み | `src/llvm_py/instructions/weak.py:12-61` | `@nyrt_weak_new()` 呼び出し |
| WeakLoad | ✅ 実装済み | `src/llvm_py/instructions/weak.py:63-112` | `@nyrt_weak_to_strong()` 呼び出し |
| Finalizer (`fini()`) | ❌ 未実装 | - | 対応関数なし |
| GC / Cycle Collection | ❌ 未実装 | - | Reference Count のみ |
**重要な発見**:
- **(A) 仕様通り**: `weak <expr>` + `weak_to_strong()`**両バックエンド** で動作
- **(B) 未実装**: Finalizer (`fini()`) は **両バックエンド** で言語意味論としては統一されていない
- VM: `scope_tracker.rs``pop_scope()` 時に InstanceBox `.fini()` を呼び出し(実装あり)
- LLVM: 対応する finalizer 呼び出し機構がない(現在 harness は scope 管理を持たない)
### P2smoke
**目的**: weakref の最小 fixture/smoke を作り、挙動を固定する
**smoke 候補2-3本**:
| smoke | 内容 | 期待値 |
|-------|------|--------|
| `phase285_weak_basic_vm.sh` | 既存 weak basic smoke | PASS既に存在|
| `phase285_weak_to_strong_fail_vm.sh` | weak_to_strong 失敗観測 | PASSnull 確認)|
| `phase285_leak_report_vm.sh` | exit-time leak report | PASS既に存在|
#### P2 smoke 候補(絞り込み済み)
| smoke | 内容 | 期待値 | 優先度 |
|-------|------|--------|--------|
| `phase285_weak_basic_vm.sh` | 既存 weak basic smoke`weak x` + `weak_to_strong()` 成功) | PASS既に存在 | 既存 |
| `phase285_weak_to_strong_fail_vm.sh` | weak_to_strong 失敗観測Void = null | PASS`WeakRef(null)` または `void` 確認) | **新規** |
| `phase285_weak_cycle_report_vm.sh` | 強参照サイクルで leak report | PASSexit-time leak report で検出) | **新規** |
| `phase285_weak_basic_llvm.sh` | LLVM weak 基本動作確認 | PASSVM と同一動作) | **新規** |
**LLVM 扱い**:
- VM と同一動作: PASS
- 未対応: 理由付き SKIP`test_skip "reason"`
- WeakNew/WeakLoad は **両バックエンド実装済み** → smoke は `--backend vm``--backend llvm` 両方実行
- Finalizer は **両バックエンド未実装****P2 では scope finalization のテストを行わない**
- 未対応機能: 理由付き SKIP`test_skip "reason"`
- silent fallback 禁止
**P2 で扱わない項目**:
- Finalizer (`fini()`) の統一テスト → Phase 286+ で統一化予定
- GC cycle collection → Reference Count のみで既知の制約
## Non-goals
- GC アルゴリズム刷新RC→tracing 等の設計変更)