64bc2746df
docs(phase-285): add ret.py boxification appendix
2025-12-27 00:36:32 +09:00
bd0783fa85
docs(phase-285): Complete P4 Post-Completion documentation
...
Phase 285 P4 Post-Completion activities (2025-12-27):
1. Phase 284 P2 Integration Fix (commit 225600b5f )
- Fixed phase284_p2_return_in_loop_llvm (unreachable instruction)
- Integration LLVM tests: 3/3 PASS (no FAIL remaining)
2. ret.py Box-First Refactoring (commits 32aa0ddf6 , 5a88c4eb2 )
- Phase 1-2: UnreachableReturnHandlerBox + ReturnTypeAdjusterBox
- Phase 3: StringBoxerBox + ReturnPhiSynthesizerBox
- Reduced lower_return(): 166→117 lines (-29%)
3. Code Quality Improvements (4 commits)
- LLVM exit code SSOT (d7c6df367 )
- nyash_kernel FFI split (798c193cb )
- LLVM detection consolidation (1869396fd )
- auto_detect.conf clarity (095213c58 )
Final status:
- Integration LLVM tests: 3/3 PASS
- Quick profile: 154/154 PASS
- Current Focus: Phase 29y (post self-host, docs-first)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-27 00:31:29 +09:00
606e236d6d
fix(phase-285): restore weak_basic_llvm + complete LLVM detection/quick SSOT
2025-12-26 16:32:37 +09:00
72552cddfb
docs(phase-285): add P3 LLVM one-pass instructions
2025-12-26 14:21:12 +09:00
fbd9c83b62
docs: reflect Phase 285 P2.2 completion (KeepAlive/ReleaseStrong)
2025-12-26 14:17:19 +09:00
f74ff6116c
refactor(lifecycle): Phase 285 P2.1 hygiene - lifecycle.rs 箱化完了
...
責務分離により KeepAlive 処理を handlers/lifecycle.rs に隔離:
- handlers/lifecycle.rs 新規作成(47行)
- handle_keepalive() で drop_after 判定
- release_strong_refs() で Arc 同一性探索を集約
- HashSet による O(1) 検索最適化
- handlers/mod.rs を dispatch 専用化(49行削除→1行呼び出し)
- README.md に P2.1 完了状態を記載(SKIP→PASS)
- phase-29y 将来設計相談パケット追加(NyRT ABI/RC insertion pass)
Test: 154/154 PASS ✅
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-26 13:36:17 +09:00
58ceb3de2f
feat(smoke): Phase 285 P2 - weak conformance smokes (success pattern)
...
Phase 285 P2: weak の意味論(weak <expr> + weak_to_strong() 成功/失敗)を integration smoke で固定
実装内容:
- Fixture A(成功パターン): exit 0 → exit 2 に変更(fail=1, success=2 で明確化)
- Fixture B(失敗パターン): 明示 drop (x = null) 方式で作成
- VM smoke success: PASS
- LLVM smoke success: SKIP(backend unavailable)
- VM/LLVM smoke fail: SKIP(hidden root 問題で理由付き)
既知の問題:
- x = null で明示 drop しても weak_to_strong が成功(hidden root が strong ref を保持)
- Phase 285 P2.1 (investigation) で root 保持箇所を棚卸し予定
スコープ:
- Block scope drop conformance は別タスク(未整合の可能性あり)
- P2 では明示 drop 方式で weak の最小意味論(non-owning)のみを検証
検証:
- quick smoke 154/154 PASS 維持
- integration smoke 4本(success 2本 PASS/SKIP、fail 2本 SKIP)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-26 11:33:12 +09:00
b7f14e38d7
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 >
2025-12-26 10:55:33 +09:00
5ec0056059
docs(lifecycle): Phase 285 P0 - Box lifecycle/weakref/GC SSOT 固定
...
## 言語 SSOT との境界明文化
- lifecycle/weak/fini: lifecycle.md
- null/void/truthiness: types.md
- Phase 285 は実装状況・差分追跡のみ(言語SSOT書き換えなし)
## 用語・禁止事項固定
- Roots/Strong/Weak/Finalizer/GC 定義
- 禁止: finalizer 再入・例外・allocation・silent fallback
## VM/LLVM 差分分類
- (A) 仕様通り: weak/weak_to_strong/leak report
- (B) 未実装: finalizer/GC cycle collection
## P1/P2 導線
- P1: 棚卸し対象ファイル一覧(value.rs, finalization.rs等)
- P2: smoke 候補(weak_basic, weak_to_strong_fail, leak_report)
quick smoke 154/154 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-26 10:51:17 +09:00
106bae4e93
docs(smoke): Phase 285LLVM-0.4 - ドキュメント整合・断言の是正
...
LLVM harness の制限を SSOT と矛盾しない表現に修正:
**修正内容**:
1. smoke test コメント修正(phase285_leak_report_llvm.sh)
- 誤: "print() doesn't work in LLVM harness mode"
- 正: "This smoke test verifies leak reporting only, not stdout output"
- 理由: normative 過ぎる断言を scope-based に変更
2. lifecycle.md 確認
- 変更不要(既に正しい記述)
- "Parent process roots only" は環境制約として適切
3. phase-285/README.md 更新
- Phase 285LLVM-0.3 の記録追加
- stdout 検証削除の理由を明記
**結果**:
- ✅ 全 lifecycle テスト PASS(6/6)
- ✅ SSOT との矛盾解消
- ✅ コード変更なし(コメントとドキュメントのみ)
**原則**:
- Non-normative language: "機能しない" → "検証対象外"
- Environmental constraints: 設定依存を明示
- SSOT alignment: docs/reference/language/lifecycle.md と整合
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-25 06:44:52 +09:00
a40ee8dda5
refactor(plan): Phase 286C-4 Step 1 - plan_helpers module
...
Create helper functions to support plan_rewrites() extraction:
- build_local_block_map(): Build block ID mapping for a function
- sync_spans(): Synchronize instruction spans after rewriting
These pure functions will be used by both the current monolithic
merge_and_rewrite() and the new plan_rewrites() function.
Progress: Step 1/4 (helpers) complete
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-25 03:53:42 +09:00
cc05c37ae3
feat(phase285w): Phase 285W-Syntax-0.1 - Reject weak(...) syntax (Parser-level Fail-Fast)
...
- Parser guard: Reject weak(...) with LPAREN check in parse_unary()
- Error: "Use 'weak expr', not 'weak(expr)'" (helpful message)
- Location: src/parser/expressions.rs:248-256
- MIR builder guard: Defense-in-depth for any bypassed cases
- Location: src/mir/builder/calls/build.rs:37-46
- Rejection test: apps/tests/phase285w_weak_call_rejected.hako
- Smoke test: phase285w_weak_call_rejected_vm.sh (PASS ✅ )
- Documentation:
- EBNF.md: Add ~ (BitNot) to unary operators
- lifecycle.md: Document weak(expr) as invalid syntax
- phase-285/README.md: Add Phase 285W-Syntax-0.1 entry
Test results: 5/6 phase285 tests PASS (1 unrelated failure)
SSOT: docs/reference/language/lifecycle.md
Closes: Phase 285W-Syntax-0.1
2025-12-25 00:04:55 +09:00
9227673ef7
feat(phase285w): Implement weak x unary operator syntax
...
Phase 285W-Syntax-0: Migrate weak reference syntax from function call
to unary operator for consistency and clarity.
**Changes**:
- Parser: Add UnaryOperator::Weak variant and parse_unary() handling
- MIR: Lower UnaryOp::Weak to emit_weak_new() (reuses existing path)
- AST: Add Weak to UnaryOperator enum + Display/JSON support
- Tests: Migrate 8 files from `weak(x)` to `weak x` syntax
- 7 .hako test files updated
- 1 smoke test shell script updated
- Cleanup: Remove obsolete weak(x) parser/MIR special cases
- Docs: Update Phase 285 README
**Syntax Change**:
- Old: `local w = weak(x)` (function call)
- New: `local w = weak x` (unary operator)
**Validation**: All migrated phase285* smoke tests pass (4/4 relevant)
**SSOT**: docs/reference/language/lifecycle.md
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-24 17:21:21 +09:00
83c897eb5d
feat(llvm): Phase 285LLVM-1.4 - print Handle Resolution (type tag propagation)
...
Fix LLVM print to output 42 instead of 4 (handle value) for field access.
Root cause: Type tags lost through MIR copy instruction chains
- getField tagged ValueId 16 as handle
- MIR copy chain: 16 → 17 → 18
- print used ValueId 18 (not tagged) → treated as raw integer
Solution: Type-tag based handle detection with copy propagation
- boxcall.py: Tag getField results as handles
- global_call.py: Skip boxing for handles in print
- copy.py: Propagate value_types tags through copy chains
Test coverage:
- apps/tests/phase285_print_raw_int.hako: Raw int regression check
- apps/tests/phase285_userbox_field_basic.hako: Field access parity
Result: VM/LLVM parity achieved (both output 42) ✅
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-24 16:01:38 +09:00
cc8b27a1aa
feat(weak): Phase 285A1 - Weak Field Contract (Strict Type Enforcement)
...
Remove automatic WeakNew conversion and enforce strict compile-time type
checking for weak field assignments. Only 3 assignment types allowed:
1. Result of weak(x) call (WeakRef type)
2. Existing WeakRef variable (e.g., me.parent = other.parent)
3. Void/null (clear operation)
**Implementation**:
- Added MirType::WeakRef to type system (src/mir/types.rs)
- Track WeakRef type in emit_weak_new() even in pure mode
- Weak field reads return WeakRef without auto-upgrade
- Removed automatic WeakNew conversion from field writes
- Implemented check_weak_field_assignment() with actionable errors
- Fixed null literal type tracking (Phase 285A1.1: Unknown → Void)
**Testing**:
- 5 test fixtures (3 OK, 2 NG cases) - all passing
- Smoke test: phase285_weak_field_vm.sh
- Error messages guide users to use weak() or null
**Documentation**:
- Updated lifecycle.md SSOT with weak field contract
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-24 03:17:30 +09:00
661bbe1ab7
feat(phase284): P1 Complete - Return in Loop with Block Remap Fix
...
## Summary
Completed Phase 284 P1: Enable return statements in Pattern4/5 loops via
JoinInst::Ret infrastructure (100% pre-existing, no new infrastructure needed).
**Critical Bug Fix**: Block ID remap priority
- Fixed: local_block_map must take precedence over skipped_entry_redirects
- Root cause: Function-local block IDs can collide with global remap entries
(example: loop_step:bb4 vs k_exit:bb4 after merge allocation)
- Impact: Conditional Jump else branches were incorrectly redirected to exit
- Solution: Check local_block_map FIRST, then skipped_entry_redirects
## Implementation
### New Files
- `src/mir/join_ir/lowering/return_collector.rs` - Return detection SSOT (top-level only, P1 scope)
- `apps/tests/phase284_p1_return_in_loop_min.hako` - Test fixture (exit code 7)
- Smoke test scripts (VM/LLVM)
### Modified Files
- `loop_with_continue_minimal.rs`: Return condition check + Jump generation
- `pattern4_with_continue.rs`: K_RETURN registration in continuation_funcs
- `canonical_names.rs`: K_RETURN constant
- `instruction_rewriter.rs`: Fixed Branch remap priority (P1 fix)
- `terminator.rs`: Fixed Jump/Branch remap priority (P1 fix)
- `conversion_pipeline.rs`: Return normalization support
## Testing
✅ VM: exit=7 PASS
✅ LLVM: exit=7 PASS
✅ Baseline: 46 PASS, 1 FAIL (pre-existing emit issue)
✅ Zero regression
## Design Notes
- JoinInst::Ret infrastructure was 100% complete before P1
- Bridge automatically converts JoinInst::Ret → MIR Return terminator
- Pattern4/5 now properly merge k_return as non-skippable continuation
- Correct semantics: true condition → return, false → continue loop
## Next Phase (P2+)
- Refactor: Block remap SSOT (block_remapper.rs)
- Refactor: Return jump emitter extraction
- Scope: Nested if/loop returns, multiple returns
- Design: Standardize early exit pattern (return/break/continue as Jump with cond)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2025-12-23 14:21:27 +09:00