From 4565f7476db79135d45efa693be26b9d01f3745d Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Fri, 21 Nov 2025 13:28:35 +0900 Subject: [PATCH] =?UTF-8?q?wip(mir):=20StaticCompiler=20receiver=E6=AD=A3?= =?UTF-8?q?=E8=A6=8F=E5=8C=96=E3=81=AE=E9=83=A8=E5=88=86=E7=9A=84=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20-=20=E5=B0=86=E6=9D=A5=E3=81=AE=E6=A0=B9=E6=B2=BB?= =?UTF-8?q?=E3=81=AB=E5=90=91=E3=81=91=E3=81=9F=E5=9F=BA=E7=9B=A4=E6=95=B4?= =?UTF-8?q?=E5=82=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【修正内容】 1. src/mir/builder/calls/guard.rs - receiver型情報がない場合のpass-through処理追加 - ME-CALL として後段処理に委譲 2. src/mir/builder/ssa/local.rs - receiver kind で型情報がない場合、origin から型を推論 - value_types への伝播を強化 【現状】 - 完全な根治には至っていない(MIR builder設計レベルの複雑な依存関係) - .hako側workaround (51d53c29) が実用的な解決策として機能中 【根本原因】 - value_origin_newbox に ParserBox が保持される - value_types に実際の型(String等)が欠落 - receiver に型情報がないまま StaticCompiler Method に解決される問題 【今後の方向性】 - MIR builder の型伝播システム全体の見直しが必要 - Phase 25.1: Stage-1 bridge receiver bug (partial fix) --- src/mir/builder/calls/guard.rs | 20 +++++++++++++++++--- src/mir/builder/ssa/local.rs | 8 +++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/mir/builder/calls/guard.rs b/src/mir/builder/calls/guard.rs index d6f93f19..0f07a5ad 100644 --- a/src/mir/builder/calls/guard.rs +++ b/src/mir/builder/calls/guard.rs @@ -59,11 +59,11 @@ impl<'a> CalleeGuardBox<'a> { { // Only apply guard if box_kind is StaticCompiler if box_kind == CalleeBoxKind::StaticCompiler { + let trace_enabled = + std::env::var("NYASH_CALLEE_RESOLVE_TRACE").ok().as_deref() == Some("1"); + // Check if receiver has a Box type if let Some(MirType::Box(receiver_box)) = self.value_types.get(&recv) { - let trace_enabled = - std::env::var("NYASH_CALLEE_RESOLVE_TRACE").ok().as_deref() == Some("1"); - // If receiver box type matches the static box name, this is a me-call // Let it through for static method lowering (don't normalize) if receiver_box == box_name { @@ -97,6 +97,20 @@ impl<'a> CalleeGuardBox<'a> { certainty, box_kind: CalleeBoxKind::RuntimeData, // Switch to runtime }); + } else { + // StaticCompiler Method but receiver has NO Box type + // → Pass through as ME-CALL (let downstream handle it) + if trace_enabled { + eprintln!("[static-runtime-guard] StaticCompiler receiver has NO Box type:"); + eprintln!( + " {}.{} receiver %{} has no type info", + box_name, method, recv.0 + ); + eprintln!(" → Passing through as ME-CALL (downstream will resolve)"); + } + + // Pass through unchanged - let finalize_method_receiver() handle it + return Ok(callee); } } } diff --git a/src/mir/builder/ssa/local.rs b/src/mir/builder/ssa/local.rs index 4770feb0..32ac533b 100644 --- a/src/mir/builder/ssa/local.rs +++ b/src/mir/builder/ssa/local.rs @@ -116,7 +116,13 @@ pub fn ensure(builder: &mut MirBuilder, v: ValueId, kind: LocalKind) -> ValueId builder.value_types.insert(loc, t); } if let Some(cls) = builder.value_origin_newbox.get(&v).cloned() { - builder.value_origin_newbox.insert(loc, cls); + builder.value_origin_newbox.insert(loc, cls.clone()); + + // CRITICAL FIX: For receiver kind, if type is missing but origin exists, + // infer MirType::Box from origin + if kind == LocalKind::Recv && builder.value_types.get(&loc).is_none() { + builder.value_types.insert(loc, crate::mir::MirType::Box(cls)); + } } builder.local_ssa_map.insert(key, loc); loc