feat(mir): Phase 21.7 Step 1-2 - NamingBox decode & Hotfix 7修正

## 実装内容

### Step 1: NamingBox decode関数追加 (naming.rs)
-  `decode_static_method(func_name) -> Option<(box, method, arity)>`
-  `is_static_method_name(func_name) -> bool`
- 対称性: encode ⇔ decode のペア実装で一貫性確保

### Step 2: unified_emitter Hotfix 7修正 (Lines 267-304)
-  StaticCompiler box kind判定追加
-  static box method は receiver 追加をスキップ
-  instance method(RuntimeData/UserDefined)のみ receiver 追加
-  トレース: NYASH_STATIC_METHOD_TRACE=1 でログ出力

## 判定ロジック
```rust
if box_kind == CalleeBoxKind::StaticCompiler {
    // "BoxName.method/arity" 形式か確認
    let func_name = format!("{}.{}/{}", box_name, method, args.len());
    if is_static_method_name(&func_name) {
        // static box method → receiver 追加しない
    }
}
```

## 検証
 Stage-1 テスト: RC=0 (apps/tests/stage1_skip_ws_repro.hako)
 ビルド成功(0 error)

## 次のステップ
- Step 3: methodization実装 (HAKO_MIR_BUILDER_METHODIZE=1)

Co-Authored-By: ChatGPT5 <chatgpt@openai.com>
This commit is contained in:
nyash-codex
2025-11-21 23:52:10 +09:00
parent 74271f3c5b
commit a13f14cea0
11 changed files with 505 additions and 29 deletions

View File

@ -51,13 +51,13 @@ hakorune <command> [<subcommand>] [options] [-- script_args...]
|-----------------------------------|-------------------------------------------|----------------------|
| `run` | .hako をコンパイルして実行(既定 VM | プレースホルダ(`[hakorune] run: not implemented yet` |
| `build exe` | .hako からネイティブ EXE を AOT ビルド | 実装済みenv.codegen経由で `.o` → EXE を生成) |
| `emit program-json` | StageB で Program(JSON v0) を出力 | 実装済み(`BuildBox.emit_program_json_v0` |
| `emit mir-json` | Program(JSON) → MIR(JSON) を出力 | 実装済み(`MirBuilderBox.emit_from_program_json_v0` |
| `emit program-json` | StageB で Program(JSON v0) を出力 | 実装済み(Stage0 ブリッジ + `.hako` Stage1Cli 完了 |
| `emit mir-json` | Program(JSON) → MIR(JSON) を出力 | 実装済み(Stage0 ブリッジ + `.hako` Stage1Cli 完了 |
| `check` | 将来の構文/型/using チェック(予約) | プレースホルダ(`[hakorune] check: not implemented yet` |
Phase 25.1a では、**`emit program-json` / `emit mir-json` / `build exe` の 3 系列のみが実働コード** であり、`run` / `check` はメッセージを返して終了するプレースホルダのまま運用する。CLI の出口コード90〜93やログ形式は docs と実装を同期済み。
### 実装ステータスPhase 25.1a
### 実装ステータスPhase 25.1a+
- `.hako → Program(JSON v0)`:
- StageB (`lang/src/compiler/entry/compiler_stageb.hako`) で `BuildBox.emit_program_json_v0` を呼び出し、`"version":0,"kind":"Program"` を持つ JSON を生成。
@ -267,6 +267,18 @@ hakorune emit mir-json [-o <out>] [--quiet] <source.hako>
- `STAGE1_CLI_DEBUG`:
- `1` のとき Stage1 CLI 側の debug ログ(`[stage1-cli/debug] ...`)と `__mir__.log` を有効化。
- 新形式のエイリアスPhase 25.1 で導入済み):
- `NYASH_STAGE1_MODE` / `NYASH_STAGE1_INPUT` / `NYASH_STAGE1_BACKEND`
- Stage1 stub が最初に参照する統一 env。未設定なら上記 legacy `STAGE1_*` からブリッジ(`stage1_bridge/env.rs`)が補完する。
- 許容値: `emit-program` / `emit-program-json` / `emit-mir` / `emit-mir-json` / `run`。
| 目的 | 新 env | 既存/フォールバック |
|-----------------|---------------------------|------------------------------|
| モード選択 | `NYASH_STAGE1_MODE` | `STAGE1_EMIT_*` / `NYASH_USE_STAGE1_CLI` |
| 入力パス | `NYASH_STAGE1_INPUT` | `STAGE1_SOURCE` |
| backend 指定 | `NYASH_STAGE1_BACKEND` | `STAGE1_BACKEND` |
| Program(JSON) パス | `NYASH_STAGE1_PROGRAM_JSON` | `STAGE1_PROGRAM_JSON` |
env-only 仕様の原則:
- 入口 `Stage1Cli.stage1_main(args)` は `cli_args_raw` を一切参照せず、上記 ENV だけを見てモード/入力ソース/backend を決定する。
- `.hako` 側で Program(JSON v0) / MIR(JSON) を emit したうえで、実行や AOT は常に Stage0/Rust に委譲するStage1 は CLI オーケストレーション専任)。
@ -285,7 +297,7 @@ hakorune check [options] <entry.hako>
- System Hakorune subset 制約
などを検証するためのエントリポイント。
- 実装は `.hako` 側で `tools/hako-check` 相当のロジックを呼び出す想定。
- 実装は `.hako` 側で `tools/hako-check` 相当のロジックを呼び出す想定。
- Phase 25.1 では「名前予約」と「インターフェース定義」のみを行い、実装は Phase 26 以降。
## Stage0 / Stage1 の責務分離CLI 視点)