Commit Graph

50 Commits

Author SHA1 Message Date
f740e6542f feat(phase285): Complete weak reference implementation (VM + LLVM harness)
Phase 285LLVM-1.1 to 1.4 + weak reference infrastructure:

**LLVM Harness** (Phase 285LLVM-1.x):
- 285LLVM-1.1: User Box registration & debug output
- 285LLVM-1.2: WeakRef basic operations (identity deferred)
- 285LLVM-1.3: InstanceBox field access (getField/setField)
- 285LLVM-1.4: print Handle resolution (type tag propagation)

**VM Runtime** (nyash_kernel):
- FFI functions: nyrt_weak_new, nyrt_weak_to_strong, nyrt_weak_drop
  (crates/nyash_kernel/src/lib.rs: +209 lines)
- WeakRef plugin invoke support
  (crates/nyash_kernel/src/plugin/invoke.rs: +250 lines)
- weak_handles.rs: WeakRef handle registry (NEW)

**LLVM Python Backend**:
- WeakRef instruction lowering (weak.py: NEW)
- Entry point integration (entry.py: +93 lines)
- Instruction lowering (instruction_lower.py: +13 lines)
- LLVM harness runner script (tools/run_llvm_harness.sh: NEW)

**MIR & Runtime**:
- WeakRef emission & validation
- MIR JSON export for weak instructions
- Environment variable support (NYASH_WEAK_*, HAKO_WEAK_*)

**Documentation**:
- CLAUDE.md: Phase 285 completion notes
- LANGUAGE_REFERENCE_2025.md: Weak reference syntax
- 10-Now.md & 30-Backlog.md: Phase 285 status updates

Total: +864 lines, 24 files changed

SSOT: docs/reference/language/lifecycle.md
Related: Phase 285W-Syntax-0, Phase 285W-Syntax-0.1
2025-12-25 00:11:34 +09:00
1b7fd7a0ff refactor(plan): Phase 273 P3+ - Legacy code removal
Phase 273 P3+ 完成: レガシーコード削除 + 未使用 import 整理

Removed Legacy Items:
1. emit_scan_with_init_edgecfg() - Pattern6 固有の emission 関数
   - File deleted: src/mir/builder/emission/loop_scan_with_init.rs (~144 lines)
   - Replaced by: generalized Frag API (Phase 273 P2)

2. CoreCarrierInfo struct - Legacy carrier representation
   - Removed from: src/mir/builder/control_flow/plan/mod.rs (~15 lines)
   - Replaced by: CorePhiInfo (generalized PHI representation)

3. verify_carrier() function - CoreCarrierInfo validator
   - Removed from: src/mir/builder/control_flow/plan/verifier.rs (~15 lines)
   - Replaced by: generalized PHI verification (V7-V9)

Code Cleanup:
- cargo fix applied: unused imports removed (~30 files)
- Verifier invariants updated: V1→V2-V9 (carrier→PHI model)
- Module declaration cleanup in emission/mod.rs

Impact:
- Total lines removed: ~174 lines (net reduction)
- Pattern-agnostic architecture strengthened
- All legacy Pattern6 references eliminated

Tests:
-  VM tests PASS (phase254/256/258)
-  LLVM tests PASS (phase256/258)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 00:11:20 +09:00
f07c2e7874 feat(mir): Phase 279 P0 - Type propagation pipeline SSOT unification
Eliminate "2本のコンパイラ" problem by unifying type propagation into single SSOT entry.

SSOT implementation:
- src/mir/type_propagation/pipeline.rs - SSOT type propagation pipeline
- TypePropagationPipeline::run() - Single entry point for all routes

Pipeline steps (fixed order):
1. Copy propagation (initial)
2. BinOp re-propagation (numeric promotion: Int+Float→Float)
3. Copy propagation (propagate promoted types)
4. PHI type inference (private step - cannot bypass)

Callers (both routes now use SSOT):
- lifecycle.rs::finalize_module() - Builder lifecycle route
- joinir_function_converter.rs::propagate_types() - JoinIR bridge route

Fail-fast guard (structural guarantee):
- PHI type inference is private step inside TypePropagationPipeline
- lifecycle.rs and joinir_function_converter.rs cannot call PhiTypeResolver directly
- Only public API: TypePropagationPipeline::run()
- Order drift is structurally impossible (private encapsulation)

Code reduction:
- ~500 lines of duplicate BinOp re-propagation logic removed
- 2 implementations consolidated into 1 SSOT

Files changed:
- New: src/mir/type_propagation/mod.rs
- New: src/mir/type_propagation/pipeline.rs (~300 lines)
- Modified: src/mir/mod.rs
- Modified: src/mir/builder/lifecycle.rs (~400 lines removed)
- Modified: src/mir/join_ir_vm_bridge/joinir_function_converter.rs (~100 lines removed)

Regression testing:
 Lifecycle route (VM backend): Phase 275 fixture
 JoinIR route (VM backend): loop_min_while.hako
 LLVM harness: Phase 275 fixture

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-22 15:34:03 +09:00
60cffb1948 feat(phase275-p0): Float型PHI完全対応 - MIR型伝播→LLVM IR生成
Phase 275 P0: Float型PHIノードの完全実装

【問題】
- PHI v36 が i64 型で生成されるが、incoming value v12 が f64 型
- LLVM IR parsing error: 型不一致により実行失敗

【解決】
1. MIR型伝播順序修正 (lifecycle.rs)
   - BinOp repropagation → PHI resolution に変更
   - Int+Float → Float promotion を PHI推論前に実行

2. MIR JSON Float型出力 (mir_json_emit.rs)
   - PHI dst_type に Float case 追加(2箇所)

3. LLVM PHI型対応 (wiring.py, tagging.py, llvm_builder.py)
   - ensure_phi に dst_type パラメータ追加
   - f64 の場合 ir.DoubleType() PHI 生成
   - 型互換性チェック付き predeclared PHI 再利用

4. LLVM Float演算対応
   - compare.py: ensure_double helper (Float unboxing for fcmp)
   - binop.py: Int+Float → sitofp→fadd (unboxed double)

【検証】
- LLVM IR: phi double [%"float_int_add", %"bb0"] 
- VM/LLVM parity: exit=3 
- PHI duplicate 解消: 型チェックで再利用 

【影響範囲】
- Rust MIR builder: 3ファイル (型伝播ロジック)
- LLVM harness: 5ファイル (PHI型対応)
- Kernel: 1ファイル (box_from_f64 helper - 予備)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-22 13:31:53 +09:00
e404746612 refactor(mir): Phase 139-P3-B - RoutingDecision を enum 対応 + レガシー削除
- RoutingDecision の missing_caps を Vec<CapabilityTag> に変更(型安全化)
- error_tags は to_tag() メソッドで自動生成
- 全 callsite を enum variant に修正
- capability_tags モジュール(文字列定数群)を完全削除
- 全テスト PASS(型安全性向上を確認)
- フォーマット適用
2025-12-16 07:02:14 +09:00
990d00393e refactor(mir): Remove CompilationContext legacy fields (Phase 2-7/7) 🎉
Phase 2 完全完了!全 7 Context のレガシーフィールドを完全削除。

## Changes
- Migrated all access sites to comp_ctx.* (15 fields)
- Removed 15 deprecated fields:
  * compilation_context
  * current_static_box
  * user_defined_boxes
  * reserved_value_ids
  * fn_body_ast
  * weak_fields_by_box
  * property_getters_by_box
  * field_origin_class
  * field_origin_by_box
  * static_method_index
  * method_tail_index
  * method_tail_index_source_len
  * type_registry
  * current_slot_registry
  * plugin_method_sigs
- Removed initialization code (15 field inits)

## Phase 2 完了!🎉
- builder.rs: 1222 → 1127 lines (-95 lines net)
- Deprecation warnings: 86 → 0 (完全排除)
- 全 36 deprecated fields 削除完了
- 全 14 sync helpers 削除完了
- 7 Context 完全SSOT化

## Tests
- cargo build --release: SUCCESS
- cargo test --release --lib: 1033/1033 PASS 
- Deprecation warnings: 0 

Phase 2 Progress: 7/7 contexts complete (100%) 
-  MetadataContext
-  CoreContext
-  TypeContext
-  ScopeContext
-  BindingContext
-  VariableContext
-  CompilationContext (this commit) 🎉

Phase 136 Context Box化: 完全完了!

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-16 04:07:17 +09:00
7235fe62e9 refactor(mir): Remove ScopeContext legacy fields (Phase 2-4/7)
完全移行→削除の安全順序(Option C)に従い、ScopeContextの
deprecated フィールドと sync helpers を完全削除。

## Changes
- Migrated all access sites to scope_ctx.*
- Removed 7 deprecated fields:
  - current_function
  - lexical_scope_stack
  - function_param_names
  - loop_header_stack
  - loop_exit_stack
  - if_merge_stack
  - debug_scope_stack
- Removed 2 sync helpers (sync_scope_ctx_to_legacy, sync_legacy_to_scope_ctx)
- Updated 20+ files with direct field access

## Tests
- cargo build --release: PASS 
- Deprecation warnings: 255 → 166 (-89, -35%)

Phase 2 Progress: 4/7 contexts complete (57%)
2025-12-15 23:41:30 +09:00
b92f85f993 refactor(mir): Remove TypeContext legacy fields (Phase 2-3/7)
完全移行→削除の安全順序(Option C)に従い、TypeContext の
deprecated フィールドと sync helpers を完全削除。

⚠️ 危険ゾーン: TypeFactsBox 等の同名フィールドと混同しないよう、
ファイル単位で手作業移行を実施。

## Changes
- Migrated all MirBuilder access sites to type_ctx.* (manual, 40+ files)
- Removed 3 deprecated fields (value_types, value_kinds, value_origin_newbox)
- Removed 2 sync helpers (sync_type_ctx_to_legacy, sync_legacy_to_type_ctx)
- Verified TypeFactsBox, CalleeGuardBox unchanged (no false positives)

## Tests
- cargo test --release --lib: 1029/1033 PASS
- TypeFactsBox integration: PASS (borrowed references unchanged)
- Deprecation warnings: 456 → 255 (-201, -44%)

## Safety Verification
 TypeFactsBox unchanged (still uses &'a BTreeMap borrowed references)
 CalleeGuardBox unchanged
 CalleeResolverBox unchanged
 BoxCompilationContext unchanged

Phase 2 Progress: 3/7 contexts complete (43%)
-  MetadataContext
-  CoreContext
-  TypeContext (this commit)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 23:27:24 +09:00
3127ebb73d feat(mir): Phase 136 Step 3/7 - ScopeContext extraction
## Summary
Extract scope and control flow management into ScopeContext for better organization.

## Changes
- **New file**: src/mir/builder/scope_context.rs (264 lines)
  - Lexical scope stack management
  - Control flow stacks (loop/if)
  - Function context tracking
  - Debug scope helpers
- **Updated**: src/mir/builder.rs
  - Add scope_ctx field
  - Mark legacy fields as deprecated
  - Add sync helpers (sync_scope_ctx_to_legacy, sync_legacy_to_scope_ctx)
- **Updated**: src/mir/builder/vars/lexical_scope.rs
  - Use scope_ctx as SSOT
  - Sync to legacy fields for backward compat
- **Updated**: src/mir/builder/lifecycle.rs
  - Sync current_function via scope_ctx
- **Updated**: src/mir/builder/calls/lowering.rs
  - Sync function context in lowering flow

## Extracted Fields (7)
1. lexical_scope_stack - Block-scoped locals
2. loop_header_stack - Loop headers for break/continue
3. loop_exit_stack - Loop exit blocks
4. if_merge_stack - If merge blocks
5. current_function - Currently building function
6. function_param_names - Function parameters (for LoopForm)
7. debug_scope_stack - Debug region identifiers

## Test Results
-  cargo build --release (291 warnings - deprecated usage)
-  cargo test --release --lib - 1005/1009 PASS
-  phase135_trim_mir_verify.sh - PASS
- ⚠️ phase132_exit_phi_parity.sh - Error (pre-existing issue)

## Progress
Phase 136: 3/7 Contexts complete (TypeContext, CoreContext, ScopeContext)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 20:28:21 +09:00
81d79161e4 feat(mir): Phase 136 Step 2/7 - CoreContext extraction complete
Extract core ID generation fields from MirBuilder to improve organization:
- value_gen: ValueIdGenerator
- block_gen: BasicBlockIdGenerator
- next_binding_id: u32 (Phase 74)
- temp_slot_counter: u32
- debug_join_counter: u32

Implementation:
- Created src/mir/builder/core_context.rs (215 lines)
- Added core_ctx field to MirBuilder as SSOT
- Deprecated legacy fields with backward compat
- ID allocation methods use core_ctx and sync legacy fields
- Added next_block_id() helper, replaced 30+ block_gen.next() calls

Testing:
- cargo build --release: SUCCESS (193 warnings expected)
- cargo test --release --lib: 1004/1004 PASS (+7 tests)
- phase135_trim_mir_verify.sh: PASS
- phase132_exit_phi_parity.sh: 3/3 PASS

Progress: 2/7 Context extractions complete (TypeContext + CoreContext)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 20:10:36 +09:00
3f58f34592 feat(llvm): Phase 132-P0 - block_end_values tuple-key fix for cross-function isolation
## Problem
`block_end_values` used block ID only as key, causing collisions when
multiple functions share the same block IDs (e.g., bb0 in both
condition_fn and main).

## Root Cause
- condition_fn's bb0 → block_end_values[0]
- main's bb0 → block_end_values[0] (OVERWRITES!)
- PHI resolution gets wrong snapshot → dominance error

## Solution (Box-First principle)
Change key from `int` to `Tuple[str, int]` (func_name, block_id):

```python
# Before
block_end_values: Dict[int, Dict[int, ir.Value]]

# After
block_end_values: Dict[Tuple[str, int], Dict[int, ir.Value]]
```

## Files Modified (Python - 6 files)

1. `llvm_builder.py` - Type annotation update
2. `function_lower.py` - Pass func_name to lower_blocks
3. `block_lower.py` - Use tuple keys for snapshot save/load
4. `resolver.py` - Add func_name parameter to resolve_incoming
5. `wiring.py` - Thread func_name through PHI wiring
6. `phi_manager.py` - Debug traces

## Files Modified (Rust - cleanup)

- Removed deprecated `loop_to_join.rs` (297 lines deleted)
- Updated pattern lowerers for cleaner exit handling
- Added lifecycle management improvements

## Verification

-  Pattern 1: VM RC: 3, LLVM Result: 3 (no regression)
- ⚠️ Case C: Still has dominance error (separate root cause)
  - Needs additional scope fixes (phi_manager, resolver caches)

## Design Principles

- **Box-First**: Each function is an isolated Box with scoped state
- **SSOT**: (func_name, block_id) uniquely identifies block snapshots
- **Fail-Fast**: No cross-function state contamination

## Known Issues (Phase 132-P1)

Other function-local state needs same treatment:
- phi_manager.predeclared
- resolver caches (i64_cache, ptr_cache, etc.)
- builder._jump_only_blocks

## Documentation

- docs/development/current/main/investigations/phase132-p0-case-c-root-cause.md
- docs/development/current/main/investigations/phase132-p0-tuple-key-implementation.md

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 05:36:50 +09:00
d3b3bf5372 feat(mir): Phase 131-11-E - TypeFacts/TypeDemands 分離(SSOT)
## 実装内容

### 1) Rust MIR Builder (ops.rs + lifecycle.rs)
- OperandTypeClass で型分類(String/Integer/Unknown)
- BinOp 型推論: Integer + Unknown → Integer
- lifecycle.rs に repropagate_binop_types() パス追加
  - PHI 型解決後に BinOp 型を再計算

### 2) JSON Emission (mir_json_emit.rs)
- 結果ベースの dst_type 発行に変更
- Integer → "i64", String → {kind: handle, box_type: StringBox}

### 3) Python LLVM Backend (binop.py)
- dst_type を確実な情報として使用
- dst_type != None なら優先して処理

## 結果
-  MIR: PHI/BinOp が Integer として正しく型付け
-  VM: `Result: 3` (正しい出力)
-  JSON: `dst_type: "i64"` を発行
-  LLVM: 別の codegen 問題の可能性あり

## SSOT 設計達成
- TypeFacts(事実): 定義命令から推論
- TypeDemands(要求): 使用箇所の coercion で吸収
- 後方伝播なし: Fail-Fast に統一

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-14 18:55:05 +09:00
bfe047840b fix(mir): Phase 131-9 - PHI 型推論修正(String→Integer)
Phase 131-9: MIR PHI 型推論バグ修正

問題:
- PHI が String 型として推論される
- 結果: 0,01,011(文字列連結)
- 期待: 0,1,2(整数 increment)

根本原因:
- PHI emission 時に circular dependency
- latch incoming value が PHI 型を継承
- 使用側(print)の型要求で String に

修正:
- src/mir/builder/lifecycle.rs (+75 lines):
  - Global PHI Type Inference Pass 追加
  - PHI 型を incoming values から再推論
  - PhiTypeResolver を再利用

MIR 変化:
- Before: %3: String = phi [%2, bb0], [%12, bb7]
- After:  %3: Integer = phi [%2, bb0], [%12, bb7]

テスト結果:
- Rust VM: 0,01,011 → 0,1,2  完璧!
- LLVM: Segfault(別バグ、Phase 131-10 で対応)

箱化モジュール化:
-  PhiTypeResolver 再利用
-  単一責任: PHI 型補正のみ
-  Debug flag: NYASH_PHI_GLOBAL_DEBUG=1

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 08:30:54 +09:00
af6f95cd4b Phase 33 NORM canon test: enforce normalized dev route for P1/P2/JP mini 2025-12-11 20:54:33 +09:00
d7805e5974 feat(joinir): Phase 213-2 Step 2-2 & 2-3 Data structure extensions
Extended PatternPipelineContext and CarrierUpdateInfo for Pattern 3 AST-based generalization.

Changes:
1. PatternPipelineContext:
   - Added loop_condition: Option<ASTNode>
   - Added loop_body: Option<Vec<ASTNode>>
   - Added loop_update_summary: Option<LoopUpdateSummary>
   - Updated build_pattern_context() for Pattern 3

2. CarrierUpdateInfo:
   - Added then_expr: Option<ASTNode>
   - Added else_expr: Option<ASTNode>
   - Updated analyze_loop_updates() with None defaults

Status: Phase 213-2 Steps 2-2 & 2-3 complete
Next: Create Pattern3IfAnalyzer to extract if statement and populate update summary
2025-12-10 00:01:53 +09:00
440f8646b1 feat(joinir): Phase 183 LoopBodyLocal role separation + test fixes
Phase 183 Implementation:
- Added is_var_used_in_condition() helper for AST variable detection
- Implemented LoopBodyLocal filtering in TrimLoopLowerer
- Created 4 test files for P1/P2 patterns
- Added 5 unit tests for variable detection

Test Fixes:
- Fixed test_is_outer_scope_variable_pinned (BasicBlockId import)
- Fixed test_pattern2_accepts_loop_param_only (literal node usage)

Refactoring:
- Unified pattern detection documentation
- Consolidated CarrierInfo initialization
- Documented LoopScopeShape construction paths

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 23:43:26 +09:00
7dbe0a682c feat(joinir): Phase 84-5 if_phi.rs レガシーフォールバック完全削除
Phase 84-4-B で Case D を 0件に削減完了したことにより、
if_phi.rs のレガシーフォールバックが完全に不要になったため削除。

主な変更:
- if_phi.rs 削除(339行)
- test_utils.rs 新規作成(テスト専用ユーティリティ分離、127行)
- lifecycle.rs: if_phi 呼び出し削除、Phase 84-5 安全ガード追加
- env.rs: phi_fallback_disabled() を常に true に変更
- テスト: A/B テスト → GenericTypeResolver 単独テストに変更

検証結果:
- Case D: 0件(完全解消継続)
- Tests: 498 passed(Phase 84-4: 497 から +1)

Phase 84 プロジェクト完全達成: 15件 → 0件(100%削減)
純削減: 220行

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 21:09:15 +09:00
c89f08fc52 feat(mir): Phase 84-3 PhiTypeResolver for PHI+Copy graph type inference
- Add PhiTypeResolver box (ChatGPT Pro design) with DFS graph traversal
- Resolve types through PHI + Copy chains with safety conditions
- Case D reduced from 9 to 4 (56% reduction)

Implementation:
- src/mir/phi_core/phi_type_resolver.rs: New box with graph search
- src/mir/phi_core/mod.rs: Add module export
- src/mir/builder/lifecycle.rs: Integrate as P4 (before P3-C)

Algorithm:
- DFS traversal: root → Copy → src / Phi → inputs
- Collect base types (Const/Call/BoxCall/etc definitions)
- Safety: Return Some only when converges to 1 type

Test results:
- Baseline: 504 passed, 30 failed (was 494/33)
- Case D: 4 remaining (from 9, 56% reduction)
- Unit tests: 7/7 passed

Box responsibilities (final):
- GenericTypeResolver: P3-C (generic T/V inference)
- CopyTypePropagator: Copy alias only
- PhiTypeResolver: PHI + Copy graph traversal

Remaining 4 Case D: Special patterns (await/try-catch) need dedicated handling.

Phase 84 progress:
- Phase 84-1: Const type annotations (20→15→12)
- Phase 84-2: CopyTypePropagator (12→9, 25% reduction)
- Phase 84-3: PhiTypeResolver (9→4, 56% reduction)
- Total: 67% Case D reduction (20→4)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 19:54:38 +09:00
4ef5eec162 feat(mir): Phase 84-2 CopyTypePropagator for Copy chain type propagation
- Add CopyTypePropagator box (ChatGPT Pro design) for fixed-point
  Copy instruction type propagation
- Integrate into lifecycle.rs before return type inference
- Case D reduced from 12 to 9 (25% reduction)

Implementation:
- src/mir/phi_core/copy_type_propagator.rs: New box with fixed-point loop
- src/mir/phi_core/mod.rs: Add module export
- src/mir/builder/lifecycle.rs: Call propagator before return inference

Test results:
- Baseline: 494 passed, 33 failed (was 489/34)
- Case D: 9 remaining (from 12)
- Unit tests: 4/4 passed

Remaining 9 Case D breakdown:
- GroupA: Loop Edge Copy (7 cases) - PHI incoming needs Copy trace
- GroupB: Multi-level PHI (2 cases) - Recursive PHI resolution needed

Phase 84-3 will address GroupA with Edge Copy tracing in GenericTypeResolver.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 19:37:01 +09:00
8ae1eabcfa feat(lifecycle): Phase 83 P3-D MethodReturnHintBox implementation
ChatGPT Pro設計に基づき、既知メソッド戻り値型推論箱(P3-D)を実装。

## 変更内容

- method_return_hint.rs: MethodReturnHintBox 新規作成
  - BoxCall/Call のメソッド名から戻り値型を推論
  - TypeAnnotationBox と同等のマッピングを適用
  - length/size/len → Integer, push → Void, str/substring → String
- lifecycle.rs: P3-D 経路を P3-C の前に挿入
- mod.rs: method_return_hint モジュール登録

## 成果

- Case D 削減: 20 → 16 (4件削減, 20%)
- Unit tests: 5/5 passed

## 設計原則

- 単一責務: P3-D 推論のみ
- TypeAnnotationBox 薄ラップ: 型マッピングの SSOT は TypeAnnotationBox
- 将来移行性: MethodRegistry 導入時も API 不変

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 18:09:04 +09:00
be38e4c272 fix(joinir): Phase 82-5 lifecycle.rs return type inference bug fix
**Problem**: lifecycle.rs walked bb.instructions before checking bb.terminator,
causing it to infer types from intermediate values like `%1 = const void` instead
of the actual return value.

**Solution**: Remove instructions walking entirely, only check terminator Returns.
This ensures we infer type from the actual return value (e.g., `ret %3`).

**Impact**:
- Case D failures: 51 → 20 (60% reduction! 31 eliminated)
- Removed ~55 lines of redundant instructions walking
- All remaining 20 Case D are genuine GenericTypeResolver coverage issues

**Files Modified**:
- src/mir/builder/lifecycle.rs: Remove instructions loop, only check terminator

**Test Results**:
- Baseline: 483 passed, 33 failed
- With NYASH_PHI_FALLBACK_DISABLED=1: 463 passed, 53 failed (20 Case D panics)
- All remaining Case D are in `main` functions (genuine, not bugs)

**Related**: Phase 82-if-phi-retire Step 5 (ChatGPT root cause analysis)
2025-12-02 16:00:50 +09:00
b9496000f9 refactor(phase82): DRY化 - Case判定ロジックをヘルパー関数に統一
### リファクタ内容
- 2箇所の callsite で重複していた Case 判定ロジックを統一化
- classify_phi_fallback_case() ヘルパー関数を追加

### 変更前(重複)
- Callsite 1: L321-328 で Case 判定(9行)
- Callsite 2: L378-385 で Case 判定(9行)
- 完全に同一のロジックが重複

### 変更後(DRY)
- classify_phi_fallback_case() ヘルパー関数(14行)
- 各 callsite は 1 行の呼び出しのみ

### メリット
-  DRY原則: ロジック重複削減
-  保守性: Case 分類変更が 1 箇所で完結
-  テスト: ヘルパー関数単独でテスト可能
-  可読性: panic 処理が簡潔に

### 動作確認
- ビルド成功(warning のみ、既存のもの)
- テスト結果: 482 PASS, 34 FAIL(既存の失敗のみ)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 15:39:19 +09:00
1260f2b6d0 feat(phase82): Phase 82-if-phi-retire Step 1-3 dev ガード実装
Phase 82-if-phi-retire Implementation:
- Step 1-3 分析完了: lifecycle.rs 精読 + P3-C カバレッジ突き合わせ
- dev ガード実装: NYASH_PHI_FALLBACK_DISABLED=1 で callsite 封じ

Implementation Details:

1. Analysis Findings (Step 1-2):
   - lifecycle.rs に 2箇所の infer_type_from_phi_with_hint() callsite
   - GenericTypeResolver::resolve_from_phi() と infer_type_from_phi() は同一ロジック
   - Case 分類: A (hint付き), B (P1/P2/P3-A/B hint失敗), D (P3-C 失敗・無駄な再実行)

2. config/env/joinir_dev.rs:
   - phi_fallback_disabled() フラグ追加
   - NYASH_PHI_FALLBACK_DISABLED=1 で有効化

3. lifecycle.rs dev ガード:
   - Callsite 1 (L320-336): instructions 内 Return
   - Callsite 2 (L377-393): terminator Return
   - Case 判定付き panic で関数名・ValueId・Case を出力

Next Steps:
- テスト実行で callsite が実際に呼ばれるか検証
- 結果に基づいて削除計画確定

Documents Created:
- docs/private/roadmap2/phases/phase-82-if-phi-retire/infer_type_from_phi_callsites.md
- docs/private/roadmap2/phases/phase-82-if-phi-retire/step1-3-analysis.md

Goal:
- lifecycle.rs から infer_type_from_phi* 呼び出しを排除
- if_phi.rs 本体削除への道筋を明確化
2025-12-02 15:18:41 +09:00
e656958033 feat(env): Phase 71-73 - SSA fix + Stage-3 ENV consolidation
## Phase 71-SSA: StageBDriverBox birth warning 解消
- Fixed false-positive dev verify warning for static boxes
- StageBDriverBox is a static box, so it doesn't follow NewBox→birth pattern
- Modified lifecycle.rs to skip StageBDriverBox from birth() requirement

## Phase 73-A: Stage-3 legacy ENV 統一化
- Consolidated NYASH_PARSER_STAGE3 and HAKO_PARSER_STAGE3 → NYASH_FEATURES=stage3
- Updated 20 test files (46 direct replacements)
- Special handling for parser_stage3.rs compat layer and mir_static_main_args_loop.rs
- All test files now use unified NYASH_FEATURES=stage3

## Phase 72-73: ENV inventory documented
- Created phase72-73-env-inventory.md with complete usage analysis
- Identified 113 direct ENV reads requiring SSOT consolidation
- Prioritized Phase 72 (JoinIR EXPERIMENT SSOT) and Phase 73 (Stage-3 cleanup)

## Phase 74-SSA: Minimal reproduction for static box delegation
- Created parser_box_minimal.hako and ssa_static_delegation_min.hako
- Investigated spawn failure in selfhost compiler (arguments too long)
- Root cause: NYASH_NY_COMPILER_EMIT_ONLY=1 defaults to emit-only mode

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 12:36:28 +09:00
8633224061 JoinIR/SSA/Stage-3: sync CURRENT_TASK and dev env 2025-12-01 11:10:46 +09:00
58c5d8c9bc feat(joinir): Phase 66-68 GenericTypeResolver + JoinIR First Chapter Wrap
Phase 66: P3-C ジェネリック型推論箱化
- generic_type_resolver.rs 新設 (180行)
  - is_generic_method(): ArrayBox.get/pop/first/last, MapBox.get 判定
  - resolve_from_phi(): PHI解析によるジェネリック型推論
- TypeHintPolicy::is_p3c_target() 追加
  - P1/P2/P3-A/P3-B 以外を P3-C 候補として判定

Phase 67: P3-C 実利用への一歩
- phase67_generic_type_resolver.rs テスト追加 (3テスト)
- lifecycle.rs に P3-C 経路フック追加
  - GenericTypeResolver を P3-C 対象関数で優先使用
- A/B テストで旧経路との一致確認 (11 tests PASS)

Phase 68: JoinIR First Chapter Wrap (ドキュメント整理)
- 68-1: phase-30 README.md に Section 9 追加 (JoinIR 第1章完了サマリー)
- 68-2: README.md に JoinIR status セクション追加
- 68-3: CURRENT_TASK.md スリム化 (351→132行, 62%削減)
- 68-4: PHI_BOX_INVENTORY.md に Phase 66-67 完了セクション追加

Phase 69-1: Trio 棚卸し
- phase69-1-trio-inventory.md 作成
- Trio 使用箇所の完全棚卸し完了 (削減見込み 457-707行)

🐱 JoinIR 第1章完了!4つの柱確立:
- Structure (LoopForm)
- Scope (LoopScopeShape)
- JoinIR (Select/IfMerge/Loop)
- Type Hints (P1-P3-C)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 08:54:18 +09:00
74a6f0f93e feat(joinir): Phase 65.5 TypeHintPolicy箱化モジュール化
## 目的

lifecycle.rs の型ヒント判定ロジックを箱化モジュール化し、
単一責務原則に基づいたクリーンなアーキテクチャを実現。

## 主な変更

### 新規ファイル

- **type_hint_policy.rs** (237行): 型ヒントポリシー専用モジュール
  - `TypeHintPolicy` 構造体: 型ヒント対象関数の判定
  - `is_target()`: P1/P2/P3-A/P3-B 統合判定
  - `extract_phi_type_hint()`: PHI から型ヒント抽出
  - 7つの単体テスト(パターン別カバレッジ)

### 既存ファイル修正

- **lifecycle.rs**: 60行削減
  - `get_phi_type_hint()` 削除 → `TypeHintPolicy::extract_phi_type_hint()` に移行
  - `is_type_hint_target()` 削除 → `TypeHintPolicy::is_target()` に移行
  - 2箇所の呼び出し箇所を TypeHintPolicy 使用に更新

- **lowering/mod.rs**: type_hint_policy モジュール宣言追加

## 箱化の利点

-  単一責務:ポリシー判定のみを担当
-  テスト可能:独立した単体テスト(7テスト)
-  拡張容易:Phase 66+ で P3-C 追加が簡単
-  可読性向上:関数型スタイル(flat_map/find_map)

## テスト結果

```
running 6 tests
test type_hint_policy::tests::test_is_p1_target ... ok
test type_hint_policy::tests::test_is_p2_target ... ok
test type_hint_policy::tests::test_is_p3a_target ... ok
test type_hint_policy::tests::test_is_p3b_target ... ok
test type_hint_policy::tests::test_is_target ... ok
test type_hint_policy::tests::test_p2_p3a_overlap ... ok
```

## Phase 65 完了状況

-  Phase 65-1: 型マッピング設計文書作成
-  Phase 65-2-A: StringBox メソッド型ヒント実装
-  Phase 65-2-B: Box コンストラクタ型ヒント実装
-  Phase 65-3: lifecycle.rs への P3-A/B 統合
-  Phase 65-4/65-5: 削除条件 5/5 達成、if_phi.rs を P3-C フォールバックに位置づけ
-  Phase 65.5: TypeHintPolicy 箱化モジュール化(今回)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 06:37:34 +09:00
47715d3615 feat(joinir): Phase 65-3 lifecycle.rs P3-A/P3-B統合
Phase 65-3 完了:lifecycle.rs で P1/P2/P3-A/P3-B 統一処理

## 実装内容

### 1. is_type_hint_target() 拡張
- **P3-A 追加**: `read_quoted*` で StringBox メソッド対応(P2 と重複)
  - substring/length 型ヒントが P2 経路で既にカバー済み
- **P3-B 追加**: `NewBoxTest.*` で NewBox コンストラクタ対応
  - ArrayBox/StringBox/MapBox 等の型ヒント対応

### 2. P1/P2/P3-A/P3-B 統一経路確認
- すべて同じ経路で `get_phi_type_hint()` → `infer_type_from_phi_with_hint()` 通過
- 段階的拡大のため関数名フィルタで制御(箱理論)

## テスト状況
-  ビルド: 0 エラー
-  P3-B A/B テスト: Phase 65-4 で追加予定

## 次のステップ
- Phase 65-4: 削除条件 5/5 達成確認(P3-B テスト追加)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 06:21:07 +09:00
ce65694826 feat(joinir): Phase 64-3 P2型ヒントlifecycle.rs統合
箱理論に基づくP1/P2型ヒント判定の統合:
- `is_type_hint_target()` ヘルパー関数追加(箱に切り出す)
- P1: IfSelectTest.* (既存、Phase 63-6)
- P2: IfMergeTest.*, read_quoted* (新規、Phase 64-3)

lifecycle.rs 2箇所の条件を統一関数に置き換え:
- 関数名フィルタで段階的拡大を制御
- Fail-fast原則: 対象外は従来挙動維持

テスト確認:
- test_p1_ab_type_inference  PASS
- test_p2_if_merge_type_hint  PASS
- 退行なし確認済み(既存の43 failedは元々のバグ)

技術的成果:
- P1/P2 両方で JoinIR 型ヒント → lifecycle.rs → 型推論 の経路確立
- 箱理論「まず箱に切り出す」原則の実践

修正ファイル:
- src/mir/builder/lifecycle.rs: is_type_hint_target() 追加、条件統一

🎯 Phase 64-4 へ: infer_type_from_phi 削除条件確認

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 05:20:31 +09:00
dc70d0de1b feat(mir): Phase 63-6-3/4/5 P1 type hint完全実装 & 削除条件4/5達成
Phase 63-6-3: lifecycle.rs で型ヒント取得・使用
- `get_phi_type_hint()` ヘルパー関数追加(lifecycle.rs:44-60)
- P1 ケース(IfSelectTest.*)限定で PHI の type_hint を取得
- lifecycle.rs:313-316, 335-338 で型ヒント使用
- 関数名フィルタでガード、他は None(既存挙動維持)

Phase 63-6-4: P1 ケーステスト追加(A/B 検証)
- `test_p1_ab_type_inference()` 追加(mir_joinir_if_select.rs:684-721)
- Route B(JoinIR 型ヒント経由)の動作確認
- Select type_hint = Some(Integer) 検証
- P1 function name filter 検証

Phase 63-6-5: ドキュメント更新(削除条件 4/5 達成)
- Phase 63 README.md 更新:削除条件 4/5 を  完了に
- 達成率 3/5(60%)→ 4/5(80%)に更新
- Phase 63-6 完了セクション追加(実装内容・成果・ファイル一覧)
- CURRENT_TASK.md に Phase 63-6 完了記録追加

削減実績: 0行(段階的拡大のため削除なし)

**削除条件達成率: 4/5(80%)← Phase 63-6 完了で +20%**

技術的成果:
- **P1 ケースで JoinIR 型ヒントのみで型決定(削除条件 4/5 達成)**
- JoinIR が If 系 PHI の型情報 SSOT として機能確立
- lifecycle.rs が型ヒント優先で推論する基盤完成
- Select → PHI → lifecycle.rs の全経路が動作

Modified files:
- src/mir/builder/lifecycle.rs: get_phi_type_hint() 追加、P1 型ヒント使用
- src/tests/mir_joinir_if_select.rs: A/B テスト追加
- CURRENT_TASK.md: Phase 63-6 完了記録
- docs/private/roadmap2/phases/phase-63-joinir-type-info/README.md: 削除条件更新

Test results:
-  test_p1_ab_type_inference: PASS
-  test_if_select_pattern_matching: PASS
-  All if_select tests: 8/8 PASS

次のステップ: Phase 64 で P2/P3 ケースへ拡大、全関数で型ヒント化完了(削除条件 5/5)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 04:45:11 +09:00
360ad48d93 feat(joinir): Phase 63-5 infer_type_from_phi degradation implementation (infrastructure)
Phase 63-5: 型ヒント優先のインターフェースを確立し、lifecycle.rs で呼び出し経路を統一

## Changes

### Core Implementation

1. **`infer_type_from_phi_with_hint()` 実装** (if_phi.rs:92-105)
   - Route B: `type_hint` があれば優先的に返す(JoinIR SSOT)
   - Route A: なければ `infer_type_from_phi()` へフォールバック
   - Fail-fast 原則遵守:既存挙動を一切変更しない

2. **lifecycle.rs 呼び出し経路統一** (2箇所)
   - lifecycle.rs:284, 303 で `infer_type_from_phi_with_hint(None, ...)` を呼び出し
   - 現時点では `type_hint=None` でフォールバック動作(既存挙動維持)
   - 将来 Phase 63-6+ で JoinIR からの型ヒント取得を実装

### Test Results

-  IfSelect 全 8 テスト PASS(test_type_hint_propagation_simple 含む)
-  JoinIR 全 57 テスト PASS
-  退行なし確認

### Documentation Updates

- **README.md**: Phase 63-5 完了セクション追加(実装内容・テスト結果・次ステップ)
- **README.md**: 削除条件チェックリスト更新(3/5 達成、60%)
- **PHI_BOX_INVENTORY.md**: if_phi.rs 行に Phase 63-5 完了マーク追加
- **CURRENT_TASK.md**: Phase 63-5 セクション追加

## Technical Achievements

- 型ヒント優先インターフェース確立
- lifecycle.rs 呼び出し経路統一
- Phase 63-6+ での段階的型ヒント供給の準備完了

## Deletion Condition Progress

**削除条件達成率**: 2/5 (40%) → **3/5 (60%)** ← Phase 63-5 完了で +20%

1.  JoinIR に `type_hint` 追加(Phase 63-3)
2.  代表ケースで `type_hint` 埋め込み(Phase 63-2)
3.  型ヒント優先に縮退(Phase 63-5)← NEW!
4.  P1 ケースで `type_hint` のみで型決定(Phase 63-6+)
5.  全関数で型ヒント化完了(Phase 64+)

## Files Changed

- src/mir/phi_core/if_phi.rs: +44行(infer_type_from_phi_with_hint() 追加)
- src/mir/builder/lifecycle.rs: 2箇所で _with_hint 呼び出しへ移行
- docs/private/roadmap2/phases/phase-63-joinir-type-info/README.md
- docs/private/roadmap2/phases/phase-30-final-joinir-world/PHI_BOX_INVENTORY.md
- CURRENT_TASK.md

## Next Steps

**Phase 63-6**: P1 ケース(IfSelectTest.simple/local)への型ヒント供給を実装
- JoinIR → MIR Bridge での型ヒント伝播
- lifecycle.rs で型ヒントを取得するパスの追加

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 18:07:38 +09:00
466e636af6 Span trace utilities and runner source hint 2025-11-24 14:17:02 +09:00
f9d100ce01 chore: Phase 25.1 完了 - LoopForm v2/Stage1 CLI/環境変数削減 + Phase 26-D からの変更
Phase 25.1 完了成果:
-  LoopForm v2 テスト・ドキュメント・コメント完備
  - 4ケース(A/B/C/D)完全テストカバレッジ
  - 最小再現ケース作成(SSAバグ調査用)
  - SSOT文書作成(loopform_ssot.md)
  - 全ソースに [LoopForm] コメントタグ追加

-  Stage-1 CLI デバッグ環境構築
  - stage1_cli.hako 実装
  - stage1_bridge.rs ブリッジ実装
  - デバッグツール作成(stage1_debug.sh/stage1_minimal.sh)
  - アーキテクチャ改善提案文書

-  環境変数削減計画策定
  - 25変数の完全調査・分類
  - 6段階削減ロードマップ(25→5、80%削減)
  - 即時削除可能変数特定(NYASH_CONFIG/NYASH_DEBUG)

Phase 26-D からの累積変更:
- PHI実装改善(ExitPhiBuilder/HeaderPhiBuilder等)
- MIRビルダーリファクタリング
- 型伝播・最適化パス改善
- その他約300ファイルの累積変更

🎯 技術的成果:
- SSAバグ根本原因特定(条件分岐内loop変数変更)
- Region+next_iパターン適用完了(UsingCollectorBox等)
- LoopFormパターン文書化・テスト化完了
- セルフホスティング基盤強化

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: ChatGPT <noreply@openai.com>
Co-Authored-By: Task Assistant <task@anthropic.com>
2025-11-21 06:25:17 +09:00
3a82633924 refactor(funcscanner): Region+next_i パターン統一 & SSA テスト追加
**FuncScanner .hako 側改善**:
- scan_all_boxes を Region + next_i 形式に統一(continue 多発による SSA/PHI 複雑さ削減)
- インデント修正(タブ→スペース統一)
- デバッグ print 削除

**SSA テスト追加**:
- lang/src/compiler/tests/funcscanner_scan_methods_min.hako
- src/tests/mir_funcscanner_ssa.rs (scan_methods & fib_min SSA デバッグテスト)

**Phase 25.3 ドキュメント**:
- docs/development/roadmap/phases/phase-25.3-funcscanner/ 追加

**関連**: Phase 25.3 FuncScanner 箱化準備作業

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 06:38:43 +09:00
b79697f137 feat(region): Phase 25.1l FunctionSlotRegistry完全実装
ChatGPT実装 M-1〜M-4:
- FunctionSlotRegistry: 変数スロット管理中央化
- RegionKind::Function追加
- RefKind分類統合
- 観測レイヤー完成

品質評価 (Task先生レビュー):
- 設計:  (箱理論完璧)
- 実装: M-1〜M-4全て完全
- 統合: 既存システムと高品質統合
- 影響: SSA/PHI非侵襲(観測専用)

既知問題:
- userbox_birth_to_string_vm失敗
  → 既存問題(Phase 25.1h以前から)
  → 本実装とは無関係
  → 別途調査予定

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-19 03:28:58 +09:00
d3cbc71c9b feat(mir): Phase 25.1f完了 - Conservative PHI + ControlForm観測レイヤー
🎉 Conservative PHI Box理論による完全SSA構築

**Phase 7-B: Conservative PHI実装**
- 片方branchのみ定義変数に対応(emit_void使用)
- 全変数にPHI生成(Conservative Box理論)
- Stage-1 resolver全テスト緑化(3/3 PASS)

**Phase 25.1f: ControlForm観測レイヤー**
- LoopShape/IfShape/ControlForm構造定義
- Loop/If統一インターフェース実装
- debug_dump/debug_validate機能追加
- NYASH_CONTROL_FORM_TRACE環境変数対応

**主な変更**:
- src/mir/builder/phi.rs: Conservative PHI実装
- src/mir/control_form.rs: ControlForm構造(NEW)
- src/mir/loop_builder.rs: LoopForm v2デフォルト化

**テスト結果**:
 mir_stage1_using_resolver_min_fragment_verifies
 mir_stage1_using_resolver_full_collect_entries_verifies
 mir_parserbox_parse_program2_harness_parses_minimal_source

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: ChatGPT <chatgpt@openai.com>
2025-11-18 18:56:35 +09:00
f74b7d2b04 📦 Hotfix 1 & 2: Parameter ValueId Reservation + Exit PHI Validation (Box-First Theory)
**箱理論に基づく根治的修正**:

## 🎯 Hotfix 1: Parameter ValueId Reservation (パラメータ ValueId 予約)

### 根本原因
- MirFunction counter が params.len() を考慮していなかった
- local variables が parameter ValueIds を上書き

### 箱理論的解決
1. **LoopFormContext Box**
   - パラメータ予約を明示的に管理
   - 境界をはっきりさせる

2. **MirFunction::new() 改善**
   - `initial_counter = param_count.max(1)` でパラメータ予約
   - Parameters are %0, %1, ..., %N-1

3. **ensure_counter_after() 強化**
   - パラメータ数 + 既存 ValueIds 両方を考慮
   - `min_counter = param_count.max(max_id + 1)`

4. **reserve_parameter_value_ids() 追加**
   - 明示的な予約メソッド(Box-First)

## 🎯 Hotfix 2: Exit PHI Predecessor Validation (Exit PHI 検証)

### 根本原因
- LoopForm builder が存在しないブロックを PHI predecessor に追加
- 「幽霊ブロック」問題

### 箱理論的解決
1. **LoopFormOps.block_exists() 追加**
   - CFG 存在確認メソッド
   - 境界を明確化

2. **build_exit_phis() 検証**
   - 非存在ブロックをスキップ
   - デバッグログ付き

### 実装ファイル
- `src/mir/function.rs`: Parameter reservation
- `src/mir/phi_core/loopform_builder.rs`: Context + validation
- `src/mir/loop_builder.rs`: LoopFormOps impl
- `src/mir/builder/stmts.rs`: Local variable allocation

### 業界標準準拠
-  LLVM IR: Parameters are %0, %1, ...
-  SSA Form: PHI predecessors must exist in CFG
-  Cytron et al. (1991): Parameter reservation principle

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 06:39:45 +09:00
f300b9f3c9 Fix MIR builder me-call recursion and add compile tracing 2025-11-17 19:53:44 +09:00
757b0fcfc9 feat(mir/builder): implement BoxCompilationContext for structural metadata isolation
箱理論の完璧な実装!各static boxコンパイルを独立したコンテキストで実行。

設計:
- BoxCompilationContext: variable_map, value_origin_newbox, value_types を箱化
- MirBuilder: compilation_context: Option<BoxCompilationContext> フィールド追加
- context swap: lower_static_method_as_function 開始/終了時に std::mem::swap
- 自動クリーンアップ: スコープ終了でコンテキスト破棄

実装:
1. src/mir/builder/context.rs: BoxCompilationContext構造体定義(テスト付き)
2. src/mir/builder.rs: compilation_contextフィールド追加、既存フィールドにコメント追加
3. src/mir/builder/lifecycle.rs: 各static boxでコンテキスト作成・破棄
4. src/mir/builder/builder_calls.rs: lower_static_method_as_functionでcontext swap
5. src/mir/builder/decls.rs, exprs.rs: 古いmanual clear()削除

効果:
 グローバル状態汚染を構造的に不可能化
 各static boxが完全に独立したコンテキストでコンパイル
 既存コード変更なし(swap技法で完全後方互換性)
 StageBArgsBox ValueId(21)エラー完全解決

箱理論的評価: 🟢 95点
- 明示的な境界: 各boxのコンテキストが物理的に分離
- 汚染不可能: 前の箱の状態が構造的に残らない
- 戻せる: コンテキスト差し替えで簡単ロールバック
- 美しい設計: スコープベースのリソース管理

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 11:28:18 +09:00
79ca392a4c fix(mir/builder): clear metadata maps to prevent type pollution between static boxes
Root cause: When compiling multiple static boxes, metadata from using statements
and previous box compilations (variable_map, value_origin_newbox, value_types)
leaked into subsequent compilations, causing parameters to be incorrectly typed.
For example, "args" parameter was incorrectly inferred as "ParserBox" instead of
its actual type.

Changes:
1. lifecycle.rs:95-97: Clear metadata before compiling each non-Main static box
2. decls.rs:42-44: Clear metadata before Phase 1 compilation in build_static_main_box
3. exprs.rs:170-172: Clear metadata before processing static box methods
4. builder_calls.rs:164-178: Add debug traces for value_origin_newbox/value_types

Impact:
- Fixes StageBArgsBox.resolve_src ValueId(21) undefined error
- Prevents "ParserBox" type contamination of parameters
- Ensures clean compilation context for each static box

Note: Revealed new bug in StageBBodyExtractorBox (Copy from undefined ValueId(114))
which needs separate investigation.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 11:16:34 +09:00
dda65b94b7 Phase 21.7 normalization: optimization pre-work + bench harness expansion
- Add opt-in optimizations (defaults OFF)
  - Ret purity verifier: NYASH_VERIFY_RET_PURITY=1
  - strlen FAST enhancement for const handles
  - FAST_INT gate for same-BB SSA optimization
  - length cache for string literals in llvmlite
- Expand bench harness (tools/perf/microbench.sh)
  - Add branch/call/stringchain/arraymap/chip8/kilo cases
  - Auto-calculate ratio vs C reference
  - Document in benchmarks/README.md
- Compiler health improvements
  - Unify PHI insertion to insert_phi_at_head()
  - Add NYASH_LLVM_SKIP_BUILD=1 for build reuse
- Runtime & safety enhancements
  - Clarify Rust/Hako ownership boundaries
  - Strengthen receiver localization (LocalSSA/pin/after-PHIs)
  - Stop excessive PluginInvoke→BoxCall rewrites
- Update CURRENT_TASK.md, docs, and canaries

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-13 16:40:58 +09:00
dd65cf7e4c builder+vm: unify method calls via emit_unified_call; add RouterPolicy trace; finalize LocalSSA/BlockSchedule guards; docs + selfhost quickstart
- Unify standard method calls to emit_unified_call; route via RouterPolicy and apply rewrite::{special,known} at a single entry.\n- Stabilize emit-time invariants: LocalSSA finalize + BlockSchedule PHI→Copy→Call ordering; metadata propagation on copies.\n- Known rewrite default ON (userbox only, strict guards) with opt-out flag NYASH_REWRITE_KNOWN_DEFAULT=0.\n- Expand TypeAnnotation whitelist (is_digit_char/is_hex_digit_char/is_alpha_char/Map.has).\n- Docs: unified-method-resolution design note; Quick Reference normalization note; selfhosting/quickstart.\n- Tools: add tools/selfhost_smoke.sh (dev-only).\n- Keep behavior unchanged for Unknown/core/user-instance via BoxCall fallback; all tests green (quick/integration).
2025-09-28 20:38:09 +09:00
510f4cf523 builder/vm: stabilize json_lint_vm under unified calls
- Fix condition_fn resolution: Value call path + dev safety + stub injection
- VM bridge: handle Method::birth via BoxCall; ArrayBox push/get/length/set direct bridge
- Receiver safety: pin receiver in method_call_handlers to avoid undefined use across blocks
- Local vars: materialize on declaration (use init ValueId; void for uninit)
- Prefer legacy BoxCall for Array/Map/String/user boxes in emit_box_or_plugin_call (stability-first)
- Test runner: update LLVM hint to llvmlite harness (remove LLVM_SYS_180_PREFIX guidance)
- Docs/roadmap: update CURRENT_TASK with unified default-ON + guards

Note: NYASH_DEV_BIRTH_INJECT_BUILTINS=1 can re-enable builtin birth() injection during migration.
2025-09-28 12:19:49 +09:00
34be7d2d79 vm/router: minimal special-method extension (equals/1); toString mapping kept
mir: add TypeCertainty to Callee::Method (diagnostic only); plumb through builder/JSON/printer; backends ignore behaviorally

using: confirm unified prelude resolver entry for all runner modes

docs: update Callee architecture with certainty; update call-instructions; CURRENT_TASK note

tests: quick 40/40 PASS; integration (LLVM) 17/17 PASS
2025-09-28 01:33:58 +09:00
cb236b7f5a json(vm): fix birth dispatch; unify constructor naming (Box.birth/N); JsonNode factories return JsonNodeInstance; quick: enable heavy JSON with probe; builder: NYASH_BUILDER_DEBUG_LIMIT guard; json_query_min(core) harness; docs/tasks updated 2025-09-27 08:45:25 +09:00
fd56b8049a mir: implement proper short-circuit lowering (&&/||) via branch+phi; vm: add NYASH_VM_TRACE exec/phi logs and reg_load diagnostics; vm-fallback: minimal Void guards (push/get_position/line/column), MapBox.birth no-op; smokes: filter builtin Array/Map plugin notices; docs: CURRENT_TASK updated 2025-09-26 03:30:59 +09:00
9384c80623 using: safer seam defaults (fix_braces OFF by default) + path-alias handling; json_native: robust integer parse + EscapeUtils unquote; add JsonCompat layer; builder: preindex static methods + fallback for bare calls; diagnostics: seam dump + function-call trace 2025-09-25 10:23:14 +09:00
d27ca541d8 mir(hints): wire scope_enter/leave at function entry/exit; llvm(smoke): add guard-literal-or case with skip when mock; all smokes/goldens passing 2025-09-20 05:44:57 +09:00
2720884a20 bridge/json_v0: split expr lowering; add Ternary/Peek lowering + AST; selfhost Peek JSON emit; add selfhost Peek smoke; warning cleanup in lowering/optimizer/verification
- Split expr lowering into ; route calls from stmt lowering
- Implement ternary/peek lowering (MIR13 PHI-off=Copy, PHI-on=Phi)
- Extend JSON v0 AST (ExprV0::{Ternary,Peek}, PeekArmV0)
- Selfhost parser_box: emit Peek JSON; add Stage-2 'Peek basic' smoke
- Reduce warnings: remove unused imports/vars in several modules
- current_task: update plan for legacy VM/Interpreter offboarding
2025-09-17 11:45:57 +09:00
d99b941218 docs: add MIR13 mode doc and set PHI-off as default; bridge lowering split (if/loop/try); llvmlite resolver stabilization; curated runner default PHI-off; refresh CURRENT_TASK.md 2025-09-17 10:58:12 +09:00