Commit Graph

111 Commits

Author SHA1 Message Date
80f8a7bc8c 🔧 Hotfix 7 (Enhanced): ValueId receiver alias tracking for nested loops
- Problem: Pinned receiver variables in loops cause undefined ValueId errors
- Enhanced fix: Update all receiver aliases (me + all __pin$N$@recv levels)
- Handles nested loops by updating previous pin levels
- Test status: Partial improvement, ValueId(50) → ValueId(40)
- Further investigation needed for complete fix

Files modified:
- src/mir/phi_core/loopform_builder.rs (emit_header_phis)
2025-11-19 00:02:41 +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
5bb094d58f feat(.hako): Exit PHI実装(Phase 2-5完了)- リファレンス実装
.hakoコンパイラにExit PHI生成機能を実装(将来の本命実装)

実装ファイル(585行):
- break_finder.hako (~250行): break文検出
- phi_injector.hako (~280行): PHI命令生成・挿入
- loopssa.hako (更新): BreakFinder/PhiInjector統合
- README.md: アーキテクチャ説明・使用方法

設計:
- 箱化・モジュール化(3Box分離)
- JSON文字列→文字列処理
- HAKO_LOOPSSA_EXIT_PHI=1 で有効化

重要な発見:
- Exit PHI生成はMIRレベルで行うべき(JSON v0では情報不足)
- 現在のTest 2エラーはRust MIRビルダーのバグ
- .hako実装は将来のリファレンス・Phase 25.1f用に温存

次のステップ:
- Rust側 loopform_builder.rs のphi pred mismatchバグ修正
- .hakoへの完全移行はPhase 25.1e後半〜25.1f

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 04:05:45 +09:00
9f45ebaced feat(.hako): CompilerBuilder.apply_all()配線追加 (Phase 1)
Exit PHI実装の準備として、.hakoコンパイラに
CompilerBuilder.apply_all()呼び出しを追加

変更内容:
- compiler_stageb.hako: parse_program2直後にapply_all()配線
- hako_module.toml: builder.mod export追加
- nyash.toml: モジュールマッピング追加

デバッグ:
- HAKO_COMPILER_BUILDER_TRACE=1 で詳細ログ出力
- [compiler-builder] before/after で変換前後を確認可能

次のステップ:
- Phase 2: BreakFinderBox実装
- Phase 3: PhiInjectorBox実装
- Phase 4: LoopSSA.stabilize_merges実装

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 03:37:47 +09:00
f3cd815c77 feat(parsercontrol): add shallow recursion guards to ParserControlBox (if/loop/break/continue/block) 2025-11-17 18:23:00 +09:00
978890e7f6 feat(parserstmt): add shallow recursion guard to ParserStmtBox.parse 2025-11-17 18:20:29 +09:00
04524f5894 feat(parserbox): add shallow recursion guard to parse_program2 for Stage-B 2025-11-17 18:11:15 +09:00
3c3e734f49 feat(stageb): add shallow recursion guards to bundle and using resolvers 2025-11-17 18:00:44 +09:00
bcefdad9eb feat(stageb): add shallow recursion guards to StageB driver/body extractor 2025-11-17 17:57:54 +09:00
6bfaaaf445 debug(mir): add comprehensive receiver tracing and block overwrite protection
This commit investigates ValueId(21) undefined error in Stage-B compilation.

Changes:
- src/mir/builder/builder_calls.rs:
  - Add NYASH_DEBUG_PARAM_RECEIVER=1 trace for method call receivers
  - Track variable_map lookups and ValueId mismatches
  - Log receiver origin and current_block context

- src/mir/builder/utils.rs:
  - Fix start_new_block() to avoid overwriting existing blocks
  - Check if block exists before calling add_block()
  - Prevents Copy instructions from being lost

- src/mir/function.rs:
  - Add warning log when replacing existing block
  - Helps detect block overwrite issues

- lang/src/mir/builder/ (Hako files):
  - Add debug prints for method lowering paths
  - These were not used (Stage-B uses Rust MIR Builder)
  - Kept for future Hako MIR Builder debugging

Key Discovery:
- Stage-B compilation uses Rust MIR Builder, not Hako MIR Builder
- ValueId(21) is undefined receiver in StageBArgsBox.resolve_src/1
- MIR shows: call_method ParserBox.length() [recv: %21] but %21 has no definition
- Likely caused by LocalSSA Copy emission failure or block overwrite

Next: Fix LocalSSA to ensure receiver Copy is properly emitted and preserved

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 09:39:26 +09:00
c8bbe389da test(compiler): add Stage-B minimal SSA test harness
**Goal**: Create 100-line minimal test case to reproduce SSA/ValueId
bugs in Stage-B compilation without the complexity of full compiler_stageb.hako.

**Files added**:

1. **lang/src/compiler/tests/stageb_min_sample.hako** (65 lines)
   - Pattern 1: Method call in if-block before loop (TestArgs.process)
   - Pattern 2: Simple method calls without loops (TestSimple.run)
   - Pattern 3: Nested if/loop with method calls (TestNested.complex)
   - All patterns reproduce ValueId SSA bugs

2. **tools/test_stageb_min.sh** (executable test script)
   - Test 1: Direct VM execution
   - Test 2: Stage-B compilation pipeline
   - Test 3: MIR verification

**Test results** (as of commit):

Test 1 (Direct VM):
```
 ValueId(14) error in TestArgs.process/1
   (different from ValueId(17) in Stage-B!)
```

Test 2 (Stage-B):
```
 ValueId(17) error in StageBArgsBox.resolve_src/1
   (expected, same as full compiler_stageb.hako)
```

Test 3 (MIR verification):
```
 No verification errors
   (verifier doesn't catch these specific SSA bugs)
```

**Findings**:
- Multiple ValueId SSA bugs exist (14, 17, etc.)
- MIR verifier needs enhancement to catch receiver use-before-def
- Minimal harness successfully reproduces issues for easier debugging

**Next steps** (not in this commit):
- Fix ValueId(14) in TestArgs.process
- Fix ValueId(17) in StageBArgsBox.resolve_src
- Enhance MIR verifier to catch Method receiver SSA bugs

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 04:29:10 +09:00
b4cb516f6a refactor(compiler): reorganize StageBBodyExtractorBox structure
**Goal**: Improve readability of 480-line build_body_src method with
clear phase separators, consistent spacing, and unified formatting.
**Zero logic changes** - behavior 100% identical.

**Structure improvements**:

1. **Added clear phase separators** with ==== comment lines:
   - Phase 4: Body extraction (k0/k1/k2/k3 logic)
   - Phase 4.7: Comment removal
   - Phase 4.5: Bundle resolution
   - Phase 4.6: Duplicate bundle check
   - Bundle merge + line-map debug output
   - Using resolver
   - Phase 5: Trim (left/right)

2. **Improved readability**:
   - Added consistent spacing between phases (2 blank lines)
   - Unified indentation (2 spaces throughout)
   - Grouped related debug blocks together
   - Made block structure more visible

3. **Zero logic changes**:
   - All variable names unchanged
   - All conditions unchanged
   - All calculations unchanged
   - All DEBUG messages unchanged
   - All bundle/using resolver calls unchanged

**Verification**:
- Same ValueId(17) error as before (expected, will fix in Task B)
- Debug logs identical ([plugin/missing], [DEBUG])
- Behavior 100% identical to original

**Impact**: Code now much more maintainable with clear phase boundaries,
making future modifications safer and simpler.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 04:19:17 +09:00
e2c37f06ba refactor(compiler): split Main into 4 boxes (Phase 25.1c)
**Goal**: Reorganize compiler_stageb.hako from monolithic Main.main
(605 lines) into 4 cleanly separated boxes following "Box Theory".

**Structure** (605→628 lines, +23 for box boundaries):

1. **StageBArgsBox** (lines 18-46)
   - Purpose: CLI argument → source resolution
   - Method: resolve_src(args)
   - Handles: --source, --source-file, env variables, defaults

2. **StageBBodyExtractorBox** (lines 48-528)
   - Purpose: Body extraction + bundle + using + trim
   - Method: build_body_src(src, args)
   - Handles: Method body extraction, comment stripping, bundling,
     using resolution, whitespace trimming

3. **StageBDriverBox** (lines 530-619)
   - Purpose: Main driver logic
   - Method: main(args)
   - Orchestrates: ParserBox setup, parse_program2, defs scanning,
     JSON output

4. **Main** (lines 623-628)
   - Purpose: Entry point (thin wrapper)
   - Method: main(args)
   - Action: Simple delegation to StageBDriverBox.main(args)

**Constraints respected**:
-  Behavior unchanged (same output JSON, same logs)
-  Code moved as-is (no logic changes)
-  All using statements preserved
-  All comments preserved + Phase 25.1c markers added
-  Proper 2-space indentation maintained
-  Call chain: Main → StageBDriverBox → StageBArgsBox/StageBBodyExtractorBox

**Verification**:
- Same ValueId(17) error occurs (expected, not fixed in this task)
- Error location changed: fn=Main.main → fn=StageBArgsBox.resolve_src/1
  (proves code was successfully moved)
- No new errors introduced
- Structural separation enables future SSA/ValueId fixes

**Impact**: Establishes clean box boundaries for future maintenance,
making it easier to debug and fix SSA issues independently per box.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 04:03:29 +09:00
eadde8d1dd fix(mir/builder): use function-local ValueId throughout MIR builder
Phase 25.1b: Complete SSA fix - eliminate all global ValueId usage in function contexts.

Root cause: ~75 locations throughout MIR builder were using global value
generator (self.value_gen.next()) instead of function-local allocator
(f.next_value_id()), causing SSA verification failures and runtime
"use of undefined value" errors.

Solution:
- Added next_value_id() helper that automatically chooses correct allocator
- Fixed 19 files with ~75 occurrences of ValueId allocation
- All function-context allocations now use function-local IDs

Files modified:
- src/mir/builder/utils.rs: Added next_value_id() helper, fixed 8 locations
- src/mir/builder/builder_calls.rs: 17 fixes
- src/mir/builder/ops.rs: 8 fixes
- src/mir/builder/stmts.rs: 7 fixes
- src/mir/builder/emission/constant.rs: 6 fixes
- src/mir/builder/rewrite/*.rs: 10 fixes
- + 13 other files

Verification:
- cargo build --release: SUCCESS
- Simple tests with NYASH_VM_VERIFY_MIR=1: Zero undefined errors
- Multi-parameter static methods: All working

Known remaining: ValueId(22) in Stage-B (separate issue to investigate)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 00:48:18 +09:00
fbf4687ea1 fix(bridge): implement env.box_introspect.kind lowering + Stage0 build fixes
Phase 25.1b type system groundwork - env.* namespace support in Bridge layer

Changes:
- Bridge layer (JSON v0 → MIR):
  - Add 'env' as well-known variable in MapVars::resolve()
  - Implement env.box_introspect.kind(value) → ExternCall lowering
  - Pattern: Method { recv: Method { recv: Var("env"), method: "box_introspect" }, method: "kind" }

- VM/extern fixes:
  - Add Arc::from() conversion for env.box_introspect.kind result
  - Fix MapBox API usage in extern_functions.rs logging

- Build fixes:
  - Comment out missing llvm_legacy/llvm modules in src/backend/mod.rs
  - Comment out missing gui_visual_node_prototype in Cargo.toml

- New files:
  - lang/src/shared/common/box_type_inspector_box.hako (type introspection API)

Context:
- Enables BoxTypeInspectorBox to query runtime Box types via env.box_introspect.kind
- Required for selfhost MirBuilder type-aware lowering (multi-carrier loops, etc.)
- Part of Phase 25.1b "no fallback" selfhosting strategy

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16 17:19:56 +09:00
5f06d82ee5 Phase 25.1b: Step B完了(multi-carrier LoopForm対応)
Step B実装内容(fibonacci風マルチキャリアループ対応):
- LoopFormBox拡張:
  - multi_count mode追加(build2メソッド)
  - build_loop_multi_carrierメソッド実装(4-PHI, 5 blocks)
  - 3変数(i, a, b)同時追跡のfibonacci構造生成

- LowerLoopMultiCarrierBox新規実装:
  - 複数Local/Assign検出(2+変数)
  - キャリア変数抽出
  - mode="multi_count"でLoopOptsBox.build2呼び出し
  - Fail-Fast: insufficient_carriersタグ出力

- FuncBodyBasicLowerBox拡張:
  - _try_lower_loopに呼び出し導線追加
  - 優先順位: sum_bc → multi_carrier → simple
  - [funcs/basic:loop.multi_carrier]タグ出力

- Module export設定:
  - lang/src/mir/hako_module.toml: sum_bc/multi_carrier追加
  - nyash.toml: 対応するmodule path追加

既存mode完全保持(Rust Freeze遵守):
- count, sum_bcは一切変更なし
- multi_countは完全に独立して追加
- 既存テストへの影響ゼロ

Technical Details:
- PHI構造: 3-PHI (i, a, b) in Header
- Block構成: Preheader → Header → Body → Latch → Exit
- Fibonacci計算: t = a+b, a' = b, b' = t
- copy命令でLatchから Headerへ値を渡す

Task先生調査結果を反映:
- Rust層のパターンC(4-PHI, multi-carrier)に対応
- MirSchemaBox経由で型安全なMIR生成

Next: スモークテスト追加、既存テスト全通確認

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16 03:11:49 +09:00
8ffc4d0448 Phase 25.1b: Step3完了(LoopForm対応)
Step3実装内容(LoopForm → MIR導線確立):
- FuncBodyBasicLowerBox._try_lower_loop追加:
  - Loop判定 → LowerLoopSumBcBox → LowerLoopSimpleBox の順に試行
  - 成功時は_rebindで関数名をBox.method/arityに付け替え
  - 失敗時は[builder/funcs:unsupported:loopform]でFail-Fast
- lowerメソッド冒頭でLoop優先処理:
  - Loop含む場合は_try_lower_loopを呼び、成功/失敗で明確に分岐
  - Loopが無い場合のみ既存のLocal/If/Return処理に進む
- PHI地獄防止ポリシー徹底:
  - FuncBodyBasicLowerBox/FuncLowering側でPHIやキャリアを直接いじらない
  - LoopForm制約外は必ずタグ付きでFail-Fast(Rust providerに退避可能)

ドキュメント更新:
- Phase 25.1b README: Step3をinitial-implementedに更新
- builder README: [builder/funcs:unsupported:loopform]タグ追加
- CURRENT_TASK.md: Step3進捗記録

スモークテスト:
- selfhost_mir_loopform_basic_vm.sh追加(基本構造実装済み)
- defs生成経路の詳細調整は継続タスク

Next: Step4(MethodCall/ExternCall対応)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 22:40:12 +09:00
7ca7f646de Phase 25.1b: Step2完了(FuncBodyBasicLowerBox導入)
Step2実装内容:
- FuncBodyBasicLowerBox導入(defs専用下請けモジュール)
- _try_lower_local_if_return実装(Local+単純if)
- _inline_local_ints実装(軽い正規化)
- minimal lowers統合(Return/BinOp/IfCompare/MethodArray系)

Fail-Fast体制確立:
- MirBuilderBox: defs_onlyでも必ずタグ出力
- [builder/selfhost-first:unsupported:defs_only]
- [builder/selfhost-first:unsupported:no_match]

Phase構造整備:
- Phase 25.1b README新設(Step0-3計画)
- Phase 25.2b README新設(次期計画)
- UsingResolverBox追加(using system対応準備)

スモークテスト:
- stage1_launcher_program_to_mir_canary_vm.sh追加

Next: Step3 LoopForm対応

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 22:32:13 +09:00
6856922374 Phase 25.1a: selfhost builder hotfix (fn rename, docs) 2025-11-15 05:42:32 +09:00
8d9bbc40bd fix(aot/numeric_core): implement PHI type propagation for copy→phi→copy chains
- Add propagate_copy_types() to track MatI64 through copy instructions
- Fix PHI detection bug: indexOf("{") → indexOf("\"op\":\"")
- Add 4-iteration loop for multi-step propagation chains
- Enhance diagnostics with MatI64 vids list and skip reasons

This fixes type propagation for complex SSA patterns where MatI64 types
flow through multiple copy and phi instructions. Small test cases now
pass successfully.

Note: microbench matmul_core still has issues - investigating separately.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 01:39:13 +09:00
a85045df26 fix(aot): Phase 25 MVP - numeric_core transformation完全動作
2つの重大バグを修正してBoxCall→Call変換を実現:

1. nyash.toml: numeric_coreモジュールマッピング追加
   - selfhost.llvm.ir.aot_prep.passes.numeric_core パスが解決できなかった
   - 224行目に追加してusing解決を修正

2. numeric_core.hako: JSONパース処理の根本修正
   - 問題: text.indexOf("{") が全JSONのルート{を検出
   - 結果: 全体が1命令として扱われ型検出が完全に破綻
   - 修正: op-marker-first パターンに変更
     - "op":"..." を先に検出
     - lastIndexOf("{") で命令開始を特定
     - 各命令を個別に正しく処理

成果:
- 型テーブルサイズ: 1 → 3 (MatI64インスタンス完全検出)
- 変換: BoxCall(MatI64, "mul_naive") → Call("NyNumericMatI64.mul_naive")
- 検証: 全テストパス(単体・E2E・変換・残骸確認)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 00:02:13 +09:00
e23b906512 feat(phase-25): Implement BoxCall→Call transformation for MatI64 (MVP)
Phase 25 MVP 実装完了 (242 lines):
-  MatI64 Box ID identification (newbox "MatI64" detection)
-  Copy chain resolution (recursive with depth limit)
-  BoxCall(MatI64, "mul_naive") → Call("NyNumericMatI64.mul_naive")
-  Opt-in with NYASH_AOT_NUMERIC_CORE=1
-  Trace mode with NYASH_AOT_NUMERIC_CORE_TRACE=1

Implementation:
- build_type_table(): Detect MatI64 instances via newbox scan
- build_copy_map(): Build copy instruction mapping
- resolve_copy(): Resolve copy chains recursively (max depth 10)
- transform_boxcalls(): Transform BoxCall → Call for MatI64.mul_naive

Scope (80/20 MVP):
- MatI64.mul_naive only (single pattern)
- Simple newbox detection (no complex phi propagation)
- Text-based JSON v0 transformation
- Fail-safe: unknown patterns pass through unchanged

Next steps:
- Test with matmul_core benchmark
- Verify Call NyNumericMatI64.mul_naive in MIR
- Add MatI64.at transformation (if needed)

🎉 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 21:36:13 +09:00
864a94d013 feat(phase-21.8+25): Complete imports resolution + Ring0/Ring1 numeric ABI design
Phase 21.8 完了 (imports resolution):
-  using nyash.core.numeric.matrix_i64 as MatI64 完全対応
-  hakorune_emit_mir.sh で imports 抽出・MirBuilder に配線
-  MatI64/IntArrayCore の静的参照解決が安定動作
-  matmul_core ベンチ MIR 生成成功 (VM/LLVM 両対応)

Phase 25 設計完了 (Ring0/Ring1 + numeric ABI):
- 🎯 Ring0/Ring1 責務分離を明文化 (Rust Freeze Policy 具体化)
- 🎯 Call/ExternCall 明確な分離設計
  - Call: Ring1 Hako 関数 (numeric core 等)
  - ExternCall: Ring0 intrinsic (rt_mem_* 等の FFI のみ)
- 🎯 BoxCall → Call 変換方針確定 (AotPrep で実施)
- 🎯 MatI64.mul_naive を NyNumericMatI64.mul_naive に分離
  (System Hakorune subset で完全実装済み)

実装:
-  AotPrepNumericCoreBox 診断パス実装 (NYASH_AOT_NUMERIC_CORE=1)
-  numeric ABI ドキュメント整備 (NUMERIC_ABI.md)
-  System Hakorune subset 定義 (system-hakorune-subset.md)
-  IntArrayCore/MatI64 仕様固定 (lang/src/runtime/numeric/README.md)
-  ENV_VARS.md に NYASH_AOT_NUMERIC_CORE トグル追記

今後のタスク:
- BoxCall(MatI64) → Call(NyNumericMatI64) 変換実装 (opt-in)
- IntArrayCore の numeric core 整備
- matmul_core スモークテスト (NYASH_AOT_NUMERIC_CORE=0/1 両対応)

🎉 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 20:19:00 +09:00
8214176814 feat(perf): add Phase 21.8 foundation for IntArrayCore/MatI64 numeric boxes
Prepare infrastructure for specialized numeric array benchmarking:
- Add IntArrayCore plugin stub (crates/nyash_kernel/src/plugin/intarray.rs)
- Add IntArrayCore/MatI64 box definitions (lang/src/runtime/numeric/)
- Add Phase 21.8 documentation and task tracking
- Update nyash.toml/hako.toml with numeric library configuration
- Extend microbench.sh for matmul_core benchmark case

Next: Resolve Stage-B MirBuilder to recognize MatI64/IntArrayCore as boxes

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 15:18:14 +09:00
f1fa182a4b AotPrep collections_hot matmul tuning and bench tweaks 2025-11-14 13:36:20 +09:00
13f21334c9 fix(aot): resolve copy chains in PHI propagation for deep loop coverage
Fix CollectionsHot type_table to resolve copy chains when propagating types
through PHI nodes, enabling ArrayBox optimization in deeply nested loops (matmul).

**Root Cause:**
- PHI incoming values were checked directly in type_table
- Copy chains (e.g., SSA 56→11) were not resolved
- Types failed to propagate through deep loop nesting

**Solution:**
- Add copy_src_map parameter to build_type_table()
- Resolve copy chains before checking if PHI incoming values are typed
- Multi-pass fixpoint algorithm (up to 12 passes) ensures convergence

**Impact:**
- matmul: ArrayBox A/B/C now propagate through nested loops
- Expected: boxcall→externcall conversion for get/set/push
- Backwards compatible: opt-in (NYASH_AOT_COLLECTIONS_HOT=1), no behavior change when disabled

**Analysis:**
- Documented in docs/development/analysis/matmul_collections_hot_fix.md
- Box→SSA flow traced: A(dst=2)→...→71(get), B(dst=3)→...→73(get), C(dst=4)→...→105(set)

**Testing:** Pending verification due to VM step budget constraints

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 06:54:56 +09:00
71ff310471 feat(aot): add backpropagation pass to CollectionsHot for improved type inference
Implement call-site type signal backpropagation to reduce Unknown receiver types
and increase Array/Map get/set/has externcall conversion coverage.

**Implementation:**
- New function: tmap_backprop (collections_hot.hako:82-164)
  - Propagates type signals from call sites: push→Array, stringy key→Map, linear index→Array
  - Fixpoint iteration (max 2 rounds)
  - Control: NYASH_AOT_CH_BACKPROP=1 (default ON)
- Enhanced is_stringy_key_in_block
  - Detects toString method, StringBox const, binop + StringBox const
- Diagnostic logging with NYASH_AOT_CH_TRACE=1
  - "[aot/collections_hot] backprop recv=<vid> => arr|map via method=<mname>"

**Results:**
Test case: /tmp/arraymap_min.hako
- ORIG: 7 boxcalls, 0 externcalls
- PREP: 1 boxcall, 6 externcalls (86% reduction)
- jsonfrag: 0 (structure preserved)

Benchmark: tools/perf/microbench.sh --case arraymap --exe
- ORIG: 8 boxcalls
- PREP: 2 boxcalls, 6 externcalls (75% reduction)
- Array: push(1), get(1), set(1) = 3 externcalls
- Map: set(2), get(1) = 3 externcalls
- Remaining: toString(2) = 2 boxcalls (expected)

**Benefits:**
- Unknown receiver type reduction via call-site analysis
- Improved optimization coverage for Array/Map operations
- Opt-in design, CFG unchanged, jsonfrag=0

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 06:42:52 +09:00
557f04a81a fix(aot): convert all lastIndexOf 2-arg calls to 1-arg prefix style
Replace all `lastIndexOf(needle, pos)` calls with `substring(0, pos).lastIndexOf(needle)`
to ensure VM StringBox compatibility (1-arg version only).

**Modified files (7 files, 16 locations):**
- collections_hot.hako: 3 locations (loop backward search)
- aot_prep.hako: 2 locations
- helpers/common.hako: 2 locations
- normalize_ref.hako: 2 locations
- normalize_print.hako: 1 location
- normalize_array_legacy.hako: 4 locations
- strlen.hako: 1 location

**Conversion patterns:**
- Loop: `local prefix = slice.substring(0, p); p = prefix.lastIndexOf(needle)`
- Single: `obj_start = out.substring(0, k).lastIndexOf("{")`

**Verification:**
- Build success (0 errors)
- AotPrep test success (no "lastIndexOf expects 1 arg(s), got 2" errors)
- 7 externcalls generated (nyash.map.get_h, nyash.map.set_h, etc.)
- No remaining 2-arg lastIndexOf calls

**Phase 15 alignment:** VM unchanged, .hako code adapted (脱Rust・PyVM最小方針)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 05:31:19 +09:00
08296f8087 feat(aot): enhance CollectionsHot with backward receiver type resolution
Implement `resolve_recv_type_backward` to infer Array/Map receiver types
by backward MIR analysis, reducing Unknown types in get/set/has rewrites.

**Implementation:**
- New function: resolve_recv_type_backward (collections_hot.hako:152-215)
  - Traces MIR output backward in [lb, k) range
  - Analyzes newbox/copy/phi chains with depth limit (12)
  - Returns "arr"/"map"/"" (unknown)
- Integrated into rewrite loop as priority step 3
  (after type_table and peek_phi, before method disambiguation)
- Diagnostic logging with NYASH_AOT_CH_TRACE=1
  - "[aot/collections_hot] recv_backtrace => arr|map"

**Benefits:**
- Reduces Unknown type count in externcall rewrites
- Improves Array/Map get/set optimization coverage
- No CFG changes (jsonfrag=0, structure preserved)

**Testing:** Pending resolution of unrelated Stage-3 local keyword issue

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 04:51:16 +09:00
647ee05d06 fix(emit): stabilize Stage-B wrapper with temp file approach
Root Cause:
- Subshell CODE expansion became path literal "/cat/tmp/matmul.hako"
- Variable lost in nested subshell with cd command
- All benchmark cases (matmul, arraymap, etc.) failed emit

Solution:
- Temp file approach with trap cleanup (CODE_TMP=$(mktemp))
- 3-tier fallback extraction (Python→awk→ruby)
- Enhanced diagnostics with HAKO_SELFHOST_TRACE=1
- Pre-check SKIP logic in microbench for unstable emit

Changes:
- tools/hakorune_emit_mir.sh
  - Temp file approach eliminates subshell variable issues
  - extract_program_json now has 3 fallback strategies
  - Detailed trace output for debugging
  - Variable scope fixes (local → script level)
- tools/perf/microbench.sh
  - matmul pre-check with SKIP + diagnostic hint
  - Prevents false benchmark results on emit failure

Test Results:
 loop:        936 bytes   rc=0
 call:        330 bytes   rc=0
 stringchain: 313 bytes   rc=0
 arraymap:    422 bytes   rc=0
 matmul:     7731 bytes   rc=0 (FIXED!)
 CI guard: emit_provider_no_jsonfrag_canary PASS

Impact:
- All benchmark cases now emit MIR successfully
- Stable execution without subshell variable bugs
- Comprehensive diagnostics for future debugging
- Foundation for provider-first optimization

Next: Apply AotPrep to optimize Array/Map hot paths

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-13 22:52:25 +09:00
8b44c5009f fix(mir): fix else block scope bug - PHI materialization order
Root Cause:
- Else blocks were not propagating variable assignments to outer scope
- Bug 1 (if_form.rs): PHI materialization happened before variable_map reset,
  causing PHI nodes to be lost
- Bug 2 (phi.rs): Variable merge didn't check if else branch modified variables

Changes:
- src/mir/builder/if_form.rs:93-127
  - Reordered: reset variable_map BEFORE materializing PHI nodes
  - Now matches then-branch pattern (reset → materialize → execute)
  - Applied to both "else" and "no else" branches for consistency
- src/mir/builder/phi.rs:137-154
  - Added else_modified_var check to detect variable modifications
  - Use modified value from else_var_map_end_opt when available
  - Fall back to pre-if value only when truly not modified

Test Results:
 Simple block: { x=42 } → 42
 If block: if 1 { x=42 } → 42
 Else block: if 0 { x=99 } else { x=42 } → 42 (FIXED!)
 Stage-B body extraction: "return 42" correctly extracted (was null)

Impact:
- Else block variable assignments now work correctly
- Stage-B compiler body extraction restored
- Selfhost builder path can now function
- Foundation for Phase 21.x progress

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-13 20:16:20 +09:00
801833df8d fix(env): improve Environment::set scope resolution (partial)
Fixed:
- Environment::set now properly searches ancestor chain before creating new binding
- Added exists_in_chain_locked() helper for explicit existence checking
- Simple {} blocks now correctly update outer scope variables

Verified Working:
- local x = 10; { x = 42 }; print(x) → prints 42 

Still Broken:
- else blocks don't update outer scope variables
- local x = 10; if flag { x = 99 } else { x = 42 }; print(x) → prints 10 

Root Cause Identified:
- Issue is in MIR Builder (compile-time), not Environment (runtime)
- src/mir/builder/if_form.rs:108 resets variable_map before else block
- PHI generation at merge doesn't use else_var_map_end correctly
- MIR shows: phi [%32, bb1], [%1, bb2] where %1 is original value, not else value

Next: Fix else block variable merging in if_form.rs

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-13 18:55:14 +09:00
1ac0c6b880 feat(stageb): implement UsingResolverBox foundation (partial)
Implemented:
- UsingResolverBox full implementation in using_resolver_box.hako
  - state_new(): Empty state creation
  - load_modules_json(): Load modules JSON from nyash.toml
  - resolve_path_alias(): Resolve paths from aliases
  - resolve_namespace_alias(): Tail segment matching with case-insensitive support
  - to_context_json(): Generate context JSON for ParserBox
- Added sh_core entry to nyash.toml modules section
  - Maps to lang/src/shared/common/string_helpers.hako
  - Fixes "using not found: 'sh_core'" errors
- Cleaned up compiler_stageb.hako
  - Removed problematic using statements
  - Added documentation

Known Issue (to be fixed next):
- Body extraction bug in compiler_stageb.hako:51-197
  - Multiline source extraction fails for "static box Main { main() {...} }"
  - Results in empty Program JSON body
  - Causes Stage-B emit pipeline to fall back to jsonfrag (ratio=207900%)
  - This is the root cause blocking selfhost builder path

Impact:
-  sh_core resolution errors fixed
-  UsingResolverBox infrastructure complete
-  Stage-B emit pipeline not restored (body extraction bug)
-  Selfhost builder path still blocked

Next Priority: Fix body extraction bug to restore Stage-B pipeline

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-13 18:11:25 +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
9e2fa1e36e Phase 21.6 solidification: chain green (return/binop/loop/call); add Phase 21.7 normalization plan (methodize static boxes). Update CURRENT_TASK.md and docs. 2025-11-11 22:35:45 +09:00
52b62c5772 feat(phase21.5): Stage-B parser loop fix + delegate path stabilization
## 修正内容

### 1. Stage-B パーサー修正(偶然の回避)
- **ファイル**:
  - `lang/src/compiler/parser/expr/parser_expr_box.hako`
  - `lang/src/compiler/parser/stmt/parser_control_box.hako`
- **問題**: ネストループで gpos が正しく進まず、loop の cond/body が壊れる
- **回避策**: new 式のメソッドチェーン処理追加で別ループを導入
- **結果**: MIR 生成が変わって VM gpos バグを回避

### 2. delegate パス動作確認
- **テスト**: `/tmp/loop_min.hako` → rc=10 
- **MIR構造**: 正しい PHI/compare/binop を生成
- **チェーン**: hakorune parser → Rust delegate → LLVM EXE 完動

### 3. ドキュメント追加
- `docs/development/analysis/` - delegate 分析
- `docs/development/guides/` - ループテストガイド
- `docs/development/testing/` - Stage-B 検証報告

### 4. カナリーテスト追加
- `tools/smokes/v2/profiles/quick/core/phase2100/` 配下に複数追加
- emit_boxcall_length_canary_vm.sh
- stageb_parser_loop_json_canary_vm.sh
- 他

### 受け入れ基準
-  delegate パス: rc=10 返す
-  FORCE パス: rc=10 返す(既存)
-  MIR 構造: 正しい PHI incoming と compare
-  既定挙動: 不変(dev トグルのみ)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 21:24:51 +09:00
edb3ace102 feat(phase21.5): selfhost-first bring-up infrastructure
## Task 1: Child Process stderr Capture 
- Fix: Child process now captures stderr (2>&1 instead of 2>/dev/null)
- Added: Detailed failure logs with last 80 lines on error
- Tags: [builder/selfhost-first:fail:child:rc=N] and [fail:no-ok-marker]
- Location: tools/hakorune_emit_mir.sh:try_selfhost_builder()

## Task 2: Builder Box Parameterization + Min Fallback 
- Added: HAKO_MIR_BUILDER_BOX env var (default: hako.mir.builder)
- Added: HAKO_SELFHOST_TRY_MIN=1 for automatic min builder fallback
- Location: tools/hakorune_emit_mir.sh
- Benefit: Isolate using resolution vs implementation issues

## Task 3: Loop Minimal Semantics Verification 
- Verified: PHI/increment/backedge implementation is correct
- Structure: entry(0) → loop(1) → body(2) → exit(3)
- PHI: i = {i0, entry} | {i_next, body}
- Location: lang/src/mir/builder/internal/loop_opts_adapter_box.hako

## Task 4: Using Resolution Diagnostics 
- Added: [mirbuilder/entry:build] debug tag at builder entry
- Added: HAKO_MIR_BUILDER_TRACE propagation
- Location: lang/src/mir/builder/MirBuilderBox.hako
- Benefit: Pinpoint whether using resolution succeeds

## Task 5: EXE Canary Strict Validation 
- Changed: Now requires exact rc=10 (loop limit value)
- Added: LLVM IR dump on failure (first 120 lines)
- Location: tools/smokes/v2/profiles/quick/core/phase2100/stageb_loop_jsonfrag_crate_exe_canary_vm.sh

## Environment Variables
New:
- HAKO_MIR_BUILDER_BOX (default: hako.mir.builder)
- HAKO_SELFHOST_TRY_MIN (default: 0)

Enhanced:
- HAKO_SELFHOST_TRACE → HAKO_MIR_BUILDER_TRACE propagation
- HAKO_SELFHOST_NO_DELEGATE → Better diagnostics

## Implementation Principles
- 既定挙動不変 (Default unchanged)
- Dev toggle guarded (all new features)
- Minimal diff, surgical changes
- Fail-fast with clear diagnostics
- Easy rollback via env vars

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 09:54:27 +09:00
2299da7663 feat(phase21.5): selfhost CWD fix + loop executable semantics + diagnostics
## Task 1: Selfhost Child Process CWD Fix 
- Fix: try_selfhost_builder() now runs from repo root
- Implementation: (cd "$ROOT" && ... "$NYASH_BIN" ...)
- Benefit: nyash.toml using mappings are reliably loaded
- Location: tools/hakorune_emit_mir.sh:96-108
- Resolves: "using not found: 'hako.mir.builder.internal.*'" errors

## Task 2: Loop JSONFrag Executable Semantics 
- Upgrade: FORCE=1 now generates complete executable while-loop
- Structure: entry(0) → loop(1) → body(2) → exit(3)
- Semantics:
  - PHI node: i = {i0, entry} | {i_next, body}
  - Increment: i_next = i + 1
  - Backedge: body → loop
  - Exit: ret i (final loop variable value)
- Location: lang/src/mir/builder/internal/loop_opts_adapter_box.hako:24-44
- Expected: rc=10 (limit value) instead of structure-only validation

## Task 3: Enhanced Diagnostics 
- Added: HAKO_SELFHOST_TRACE=1 outputs comprehensive diagnostics
- Info: prog_json_len, tokens (Loop/Compare counts), cwd, nyash.toml status
- Example: [builder/selfhost-first:trace] prog_json_len=90 tokens=Loop:0,Compare:0 cwd=... nyash.toml=present
- Location: tools/hakorune_emit_mir.sh:87-100
- Benefit: One-line diagnosis of CWD/nyash.toml/using issues

## Task 4: nyash.toml Missing Entries 
- Added: hako.mir.builder.internal.builder_config mapping
- Added: hako.mir.builder.internal.loop_opts_adapter mapping
- Location: nyash.toml
- Benefit: Selfhost-first can resolve internal builder dependencies

## Implementation Principles
- 既定挙動不変 (Default unchanged, FORCE=1 guarded)
- Dev toggle controlled (TRACE=1, NO_DELEGATE=1)
- Minimal diff with clear rollback path
- CWD fix ensures stable using resolution
- Executable semantics enable proper EXE testing

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 09:09:55 +09:00
0d41970313 feat(phase21.5): strlen FAST EXE + loop JSONFrag diagnostics
## Task A: emit v0 boxcall (bin version) 
- Fix: emit_mir_json_for_harness_bin now handles I::Call with Callee::Method
- Added: Proper v0 boxcall emission when NYASH_MIR_UNIFIED_CALL=0
- Location: src/runner/mir_json_emit.rs:641-707
- Test: emit_boxcall_length_canary_vm.sh → PASS

## Task B: strlen FAST EXE (AOT without plugin) 
- Fix: FAST lowering now tracks newbox(StringBox) creation
- Added: newbox_string_args fallback in boxcall.py (lines 133-143)
- Added: StringBox tracking in newbox.py (lines 82-91)
- Benefit: EXE can compute string.length() without StringBox plugin
- Test: s3_backend_selector_crate_exe_strlen_fast_canary_vm.sh → PASS (rc=5)

## Task 1: selfhost-first Diagnostic Logging 
- Added: HAKO_SELFHOST_TRACE=1 outputs Program JSON stats
- Added: HAKO_SELFHOST_NO_DELEGATE=1 shows detailed failure logs
- Added: [builder/selfhost-first:fail:*] markers + last 80 lines
- Location: tools/hakorune_emit_mir.sh:try_selfhost_builder()

## Task 2: loop JsonFrag Hit Rate Improvement 
- Added: FORCE=1 fallback for non-Lt comparison operators
- Added: find_any_local_int_before() fallback when strict fails
- Location: lang/src/mir/builder/internal/lower_loop_simple_box.hako
- Benefit: Higher JSONFrag hit rate under HAKO_MIR_BUILDER_LOOP_FORCE_JSONFRAG=1

## Task 3: crate EXE Failure Diagnostics 
- Added: LLVM IR dump on build failure (first 120 lines)
- Added: Build error log capture (last 40 lines)
- Location: tools/smokes/v2/profiles/quick/core/phase2100/stageb_loop_jsonfrag_crate_exe_canary_vm.sh

## Test Results
- emit_boxcall_length: PASS 
- strlen_fast (FAST=1): PASS (rc=5) 
- loop_jsonfrag: SKIP (diagnostic enhanced) ⚠️

## Implementation Principles
- 既定挙動不変 (Default unchanged)
- Dev toggle guarded (FAST=1, FORCE=1, TRACE=1, NO_DELEGATE=1)
- Minimal diff, easy rollback
- Clear failure diagnostics for future fixes

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 05:50:23 +09:00
07a254fc0d feat(phase21.5): MirBuilder optimization prep + crate EXE infrastructure
Phase 21.5 optimization readiness - C-level performance target:
- MirBuilder: JsonFrag purify toggle (HAKO_MIR_BUILDER_JSONFRAG_PURIFY=1)
- Normalizer: extended f64 canonicalization + dedupe improvements
- loop_opts_adapter: JsonFrag path refinement for crate EXE compatibility

Infrastructure improvements:
- provider_registry: add diagnostics + ring-1 providers (array/console/map/path)
- mir_interpreter: add normalization/purify feature gates
- tools/selfhost_exe_stageb.sh: new end-to-end Stage-B→crate EXE pipeline
- tools/perf/microbench.sh: performance measurement tooling

Smoke tests (phase2100):
- Extend timeout 15s→120s for heavy crate EXE builds
- Add stageb_loop_jsonfrag_crate_exe_canary_vm.sh (target test)
- Add s3_backend_selector_crate_exe_vm_parity_return42_canary_vm.sh

Documentation:
- ENV_VARS.md: add Phase 21.5 optimization toggles
- README updates: clarify crate backend strategy
- phase215-optimization.md: new optimization roadmap

This commit sets the stage for Phase 21.5 critical optimization:
achieving C-level performance to decide hakorune's future viability.
2025-11-11 02:07:12 +09:00
ece91306b7 mirbuilder: integrate Normalizer (toggle), add tag-quiet mode, share f64 canonicalization; expand canaries; doc updates for quick timeout + dev toggles; Phase 21.5 optimization readiness 2025-11-10 23:17:46 +09:00
6055d53eff feat(phase21.5/22.1): MirBuilder JsonFrag refactor + FileBox ring-1 + registry tests
Phase 21.5 (AOT/LLVM Optimization Prep)
- FileBox ring-1 (core-ro) provider: priority=-100, always available, no panic path
  - src/runner/modes/common_util/provider_registry.rs: CoreRoFileProviderFactory
  - Auto-registers at startup, eliminates fallback panic structurally
- StringBox fast path prototypes (length/size optimization)
- Performance benchmarks (C/Python/Hako comparison baseline)

Phase 22.1 (JsonFrag Unification)
- JsonFrag.last_index_of_from() for backward search (VM fallback)
- Replace hand-written lastIndexOf in lower_loop_sum_bc_box.hako
- SentinelExtractorBox for Break/Continue pattern extraction

MirBuilder Refactor (Box → JsonFrag Migration)
- 20+ lower_*_box.hako: Box-heavy → JsonFrag text assembly
- MirBuilderMinBox: lightweight using set for dev env
- Registry-only fast path with [registry:*] tag observation
- pattern_util_box.hako: enhanced pattern matching

Dev Environment & Testing
- Dev toggles: SMOKES_DEV_PREINCLUDE=1 (point-enable), HAKO_MIR_BUILDER_SKIP_LOOPS=1
- phase2160: registry opt-in tests (array/map get/set/push/len) - content verification
- phase2034: rc-dependent → token grep (grep -F based validation)
- run_quick.sh: fast smoke testing harness
- ENV documentation: docs/ENV_VARS.md

Test Results
 quick phase2034: ALL GREEN (MirBuilder internal patterns)
 registry phase2160: ALL GREEN (array/map get/set/push/len)
 rc-dependent tests → content token verification complete
 PREINCLUDE policy: default OFF, point-enable only where needed

Technical Notes
- No INCLUDE by default (maintain minimalism)
- FAIL_FAST=0 in Bring-up contexts only (explicit dev toggles)
- Tag-based route observation ([mirbuilder/min:*], [registry:*])
- MIR structure validation (not just rc parity)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 19:42:42 +09:00
fc5706e3f2 feat(phase22.1): JsonFrag.last_index_of_from() unified search refactor
- Add: JsonFragBox.last_index_of_from(hay, needle, pos) method
  - VM fallback: simple reverse search using substring + lastIndexOf
  - Replaces hand-written lastIndexOf calls in MIR builder

- Refactor: lower_loop_sum_bc_box.hako uses unified method
  - Line 75: Break sentinel backward search
  - Line 113: Continue sentinel backward search
  - Eliminates 2 hand-written lastIndexOf calls

- Test: json_frag_last_index_of_from_canary_vm.sh
  - Loop with break(i==3) and continue(i==2)
  - Expect: 0+1+4 = 5 (skip 2, break at 3)
  - Status: PASS 

Phase 22.1 ultrathink cleanup: code consolidation complete
2025-11-09 23:56:46 +09:00
f6c5dc9e43 Phase 22.x WIP: LLVM backend improvements + MIR builder enhancements
LLVM backend improvements:
- Add native LLVM backend support (NYASH_LLVM_BACKEND=native)
- Add crate backend selector with priority (crate > llvmlite)
- Add native_llvm_builder.py for native IR generation
- Add NYASH_LLVM_NATIVE_TRACE=1 for IR dump

MIR builder enhancements:
- Refactor lower_if_compare_* boxes for better code generation
- Refactor lower_return_* boxes for optimized returns
- Refactor lower_loop_* boxes for loop handling
- Refactor lower_method_* boxes for method calls
- Update pattern_util_box for better pattern matching

Smoke tests:
- Add phase2100 S3 backend selector tests (17 new tests)
- Add phase2120 native backend tests (4 new tests)
- Add phase2034 MIR builder internal tests (2 new tests)
- Add phase2211 TLV shim parity test

Documentation:
- Update ENV_VARS.md with LLVM backend variables
- Update CURRENT_TASK.md with progress
- Update README.md and CHANGELOG.md

Config:
- Add NYASH_LLVM_BACKEND env support in src/config/env.rs
- Update ny_mir_builder.sh for backend selection
- Update dispatch.rs for backend routing

Tools:
- Add tools/native_llvm_builder.py
- Update smokes/v2/profiles/quick/core/phase2100/run_all.sh

Known: Many Hako builder internal files modified for optimization
2025-11-09 23:40:36 +09:00
981ddd890c Phase 22.1 WIP: SSOT resolver + TLV infrastructure + Hako MIR builder setup
Setup infrastructure for Phase 22.1 (TLV C shim & Resolver SSOT):

Core changes:
- Add nyash_tlv, nyash_c_core, nyash_kernel_min_c crates (opt-in)
- Implement SSOT resolver bridge (src/using/ssot_bridge.rs)
- Add HAKO_USING_SSOT=1 / HAKO_USING_SSOT_HAKO=1 env support
- Add HAKO_TLV_SHIM=1 infrastructure (requires --features tlv-shim)

MIR builder improvements:
- Fix using/alias consistency in Hako MIR builder
- Add hako.mir.builder.internal.{prog_scan,pattern_util} to nyash.toml
- Normalize LLVM extern calls: nyash.console.* → nyash_console_*

Smoke tests:
- Add phase2211 tests (using_ssot_hako_parity_canary_vm.sh)
- Add phase2220, phase2230, phase2231 test structure
- Add phase2100 S3 backend selector tests
- Improve test_runner.sh with quiet/timeout controls

Documentation:
- Add docs/ENV_VARS.md (Phase 22.1 env vars reference)
- Add docs/development/runtime/C_CORE_ABI.md
- Update de-rust-roadmap.md with Phase 22.x details

Tools:
- Add tools/hakorune_emit_mir.sh (Hako-first MIR emission wrapper)
- Add tools/tlv_roundtrip_smoke.sh placeholder
- Improve ny_mir_builder.sh with better backend selection

Known issues (to be fixed):
- Parser infinite loop in static method parameter parsing
- Stage-B output contamination with "RC: 0" (needs NYASH_JSON_ONLY=1)
- phase2211/using_ssot_hako_parity_canary_vm.sh fork bomb (needs recursion guard)

Next steps: Fix parser infinite loop + Stage-B quiet mode for green tests
2025-11-09 15:11:18 +09:00
fa3091061d trace: add execution route visibility + debug passthrough; phase2170 canaries; docs
- Add HAKO_TRACE_EXECUTION to trace executor route
  - Rust hv1_inline: stderr [trace] executor: hv1_inline (rust)
  - Hakovm dispatcher: stdout [trace] executor: hakovm (hako)
  - test_runner: trace lines for hv1_inline/core/hakovm routes
- Add HAKO_VERIFY_SHOW_LOGS and HAKO_DEBUG=1 (enables both)
  - verify_v1_inline_file() log passthrough with numeric rc extraction
  - test_runner exports via HAKO_DEBUG
- Canary expansion under phase2170 (state spec)
  - Array: push×5/10 → size, len/length alias, per‑recv/global, flow across blocks
  - Map: set dup-key non-increment, value_state get/has
  - run_all.sh: unify, remove SKIPs; all PASS
- Docs
  - ENV_VARS.md: add Debug/Tracing toggles and examples
  - PLAN.md/CURRENT_TASK.md: mark 21.7 green, add Quickstart lines

All changes gated by env vars; default behavior unchanged.
2025-11-08 23:45:29 +09:00
2dcb89a3b7 HC012完全修復: using alias問題根治 + smart quotes全削除
## 修正内容
1. **HC012 (dead_static_box)**: using alias依存削除
   - Str.int_to_str()呼び出しがVM errorで失敗していた問題を修正
   - local _itoa()ヘルパーメソッド追加で解決
   - expected.json: line番号を1→3に修正(実際のbox宣言位置)

2. **Smart quotes全削除**: プロジェクト全体からUnicode smart quotes除去
   - tools/hako_check/rules/rule_non_ascii_quotes.hako
   - tools/hako_check/tests/HC017_non_ascii_quotes/ng.hako
   - apps/lib/json_native/lexer/scanner.hako
   - lang/src/llvm_ir/LAYER_GUARD.hako

## テスト結果
- 10/11 PASS (HC017は既存issue)
  - HC011-HC016: 
  - HC017: (non_ascii_quotes - 別issue)
  - HC018, HC021-HC022, HC031: 

## 技術的詳細
- using aliasのメソッド呼び出しは現在VM内で不安定
- ルール実装ではlocal helperメソッド使用を推奨
- IR構築は正常(boxes配列2個、calls配列0個)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:59:50 +09:00
772149c86d Analyzer安定化完了: NYASH_DISABLE_PLUGINS=1復元 + plugin無効化根治
## 修正内容
1. **hako_check.sh/run_tests.sh**: NYASH_DISABLE_PLUGINS=1 + NYASH_BOX_FACTORY_POLICY=builtin_first追加
2. **src/box_factory/plugin.rs**: NYASH_DISABLE_PLUGINS=1チェック追加
3. **src/box_factory/mod.rs**: plugin shortcut pathでNYASH_DISABLE_PLUGINS尊重
4. **tools/hako_check/render/graphviz.hako**: smart quotes修正(parse error解消)

## 根本原因
- NYASH_USE_PLUGIN_BUILTINS=1が自動設定され、ArrayBox/MapBoxがplugin経由で生成を試行
- bid/registry.rsで"Plugin loading temporarily disabled"の状態でも試行されエラー
- mod.rs:272のshortcut pathがNYASH_DISABLE_PLUGINSを無視していた

## テスト結果
- 10/11 PASS(HC011,13-18,21-22,31)
- HC012: 既存issue(JSON安定化未完)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:49:25 +09:00
58a6471883 Phase 21.3 WIP: Hako Source Checker improvements - HC011/HC016/HC017 実装完了
主な変更:
-  HC011 (dead methods) 実装・テスト緑
-  HC016 (unused alias) 実装・テスト緑
-  HC017 (non-ascii quotes) 実装完了
- 🔧 tokenizer/parser_core 強化(AST優先ルート)
- 🛡️ plugin_guard.rs 追加(stderr専用出力)
- 📋 テストインフラ整備(run_tests.sh改善)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 00:46:34 +09:00