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

@ -157,23 +157,40 @@ static box Stage1Cli {
// env から直接読み取り、Stage1CliConfigBox は将来の構造化用として温存する。
// mode 判定env-only
local mode = "disabled"
if env.get("STAGE1_EMIT_PROGRAM_JSON") == "1" {
mode = "emit_program_json"
} else if env.get("STAGE1_EMIT_MIR_JSON") == "1" {
mode = "emit_mir_json"
} else if env.get("NYASH_USE_STAGE1_CLI") == "1" {
mode = "run"
// 新形式NYASH_STAGE1_MODEがあればそちらを優先し、旧 STAGE1_* はフォールバックとして扱う。
local mode = env.get("NYASH_STAGE1_MODE")
if mode != null { mode = "" + mode }
if mode == null || mode == "" {
if env.get("STAGE1_EMIT_PROGRAM_JSON") == "1" {
mode = "emit-program"
} else if env.get("STAGE1_EMIT_MIR_JSON") == "1" {
mode = "emit-mir"
} else if env.get("NYASH_USE_STAGE1_CLI") == "1" {
mode = "run"
} else {
mode = "disabled"
}
}
// backend と入力まわり
local backend = env.get("STAGE1_BACKEND")
local backend = env.get("NYASH_STAGE1_BACKEND")
if backend == null || backend == "" {
backend = env.get("STAGE1_BACKEND")
}
if backend == null { backend = "vm" }
backend = "" + backend
local source = env.get("STAGE1_SOURCE")
local source = env.get("NYASH_STAGE1_INPUT")
if source == null || source == "" {
source = env.get("STAGE1_SOURCE")
}
local source_text = env.get("STAGE1_SOURCE_TEXT")
local prog_path = env.get("STAGE1_PROGRAM_JSON")
local prog_path = env.get("NYASH_STAGE1_PROGRAM_JSON")
if prog_path == null || prog_path == "" {
prog_path = env.get("STAGE1_PROGRAM_JSON")
}
// デバッグは当面 STAGE1_CLI_DEBUG を優先し、将来 NYASH_DEBUG に統合する。
local debug = env.get("STAGE1_CLI_DEBUG")
// Log entry point for debugging
@ -196,7 +213,7 @@ static box Stage1Cli {
}
// Dispatch by mode
if mode == "emit_program_json" {
if mode == "emit-program" || mode == "emit_program_json" {
if source == null || source == "" {
if source_text != null && source_text != "" {
source = source_text // Fallback to direct text for testing
@ -211,7 +228,7 @@ static box Stage1Cli {
return 0
}
if mode == "emit_mir_json" {
if mode == "emit-mir" || mode == "emit_mir_json" {
local prog_json = null
if prog_path != null && prog_path != "" {
prog_json = me._read_file("[stage1-cli] emit mir-json", prog_path)