Files
hakorune/src/mir/builder/emission/constant.rs

84 lines
2.5 KiB
Rust
Raw Normal View History

//! ConstantEmissionBox — Const 命令の発行を集約(仕様不変)
//!
//! ✅ Phase 25.1b Fix: All constant emission now uses function-local ID generator
//! when inside a function context to ensure proper SSA verification.
use crate::mir::builder::MirBuilder;
use crate::mir::{ConstValue, MirInstruction, ValueId};
#[inline]
pub fn emit_integer(b: &mut MirBuilder, val: i64) -> ValueId {
let dst = b.next_value_id();
let _ = b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Integer(val),
});
// Phase 84-1: Integer constant type annotation
b.value_types.insert(dst, crate::mir::MirType::Integer);
dst
}
#[inline]
pub fn emit_bool(b: &mut MirBuilder, val: bool) -> ValueId {
let dst = b.next_value_id();
let _ = b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Bool(val),
});
// Phase 84-1: Bool constant type annotation
b.value_types.insert(dst, crate::mir::MirType::Bool);
dst
}
#[inline]
pub fn emit_float(b: &mut MirBuilder, val: f64) -> ValueId {
let dst = b.next_value_id();
let _ = b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Float(val),
});
// Phase 84-1: Float constant type annotation
b.value_types.insert(dst, crate::mir::MirType::Float);
dst
}
#[inline]
pub fn emit_string<S: Into<String>>(b: &mut MirBuilder, s: S) -> ValueId {
let dst = b.next_value_id();
let _ = b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::String(s.into()),
});
fix(mir): Phase 25.1 StaticCompiler receiver型推論バグ根治 ## 問題 Stage-1ブリッジで `StringHelpers.skip_ws/2` 呼び出し時に: - ParserBox.length(receiver=ValueId未定義) でVM落ち - receiver が捏造される(型情報なし) ## 根本原因 1. CalleeResolver: receiver型なし→捏造ValueId生成 2. 順序問題: materialization → guard(逆であるべき) 3. 型注釈不足: String定数・BinOp結果に型情報なし ## 解決策(3 Phase) ### Phase 1: guard.rs Global フォールバック (lines 100-146) - receiver型なし→Global変換で捏造ValueId防止 - Phase 3-C: 文字列メソッド→StringBox正規化追加 ### Phase 2: unified_emitter.rs 順序反転 (lines 176-188) - guard FIRST → materialization (Method のみ) - Global 呼び出しの receiver 実体化を回避 ### Phase 3-A: emit_string 型注釈 (constant.rs:46-49) - String定数に value_types + value_origin_newbox 登録 ### Phase 3-B: BinOp(Add) 型注釈強化 (ops.rs:70-86,145-166,178-198) - value_origin_newbox もチェック(value_types のみ→両方) - 結果も両方のマップに登録 ### Phase 3-C: StaticCompiler 文字列メソッド正規化 (guard.rs:106-129) - length/substring等→StringBox.method に統一 - ParserBox.length → StringBox.length ## 検証 ✅ RC=0 達成(apps/tests/stage1_skip_ws_repro.hako) ✅ 正規化トレース確認(ParserBox→StringBox) ✅ receiver捏造完全防止 Co-Authored-By: ChatGPT5 <chatgpt@openai.com>
2025-11-21 13:53:50 +09:00
// 🎯 Phase 3-A: String constant type annotation
// Ensures string constants have proper Box type for method resolution
b.value_types
.insert(dst, crate::mir::MirType::Box("StringBox".to_string()));
fix(mir): Phase 25.1 StaticCompiler receiver型推論バグ根治 ## 問題 Stage-1ブリッジで `StringHelpers.skip_ws/2` 呼び出し時に: - ParserBox.length(receiver=ValueId未定義) でVM落ち - receiver が捏造される(型情報なし) ## 根本原因 1. CalleeResolver: receiver型なし→捏造ValueId生成 2. 順序問題: materialization → guard(逆であるべき) 3. 型注釈不足: String定数・BinOp結果に型情報なし ## 解決策(3 Phase) ### Phase 1: guard.rs Global フォールバック (lines 100-146) - receiver型なし→Global変換で捏造ValueId防止 - Phase 3-C: 文字列メソッド→StringBox正規化追加 ### Phase 2: unified_emitter.rs 順序反転 (lines 176-188) - guard FIRST → materialization (Method のみ) - Global 呼び出しの receiver 実体化を回避 ### Phase 3-A: emit_string 型注釈 (constant.rs:46-49) - String定数に value_types + value_origin_newbox 登録 ### Phase 3-B: BinOp(Add) 型注釈強化 (ops.rs:70-86,145-166,178-198) - value_origin_newbox もチェック(value_types のみ→両方) - 結果も両方のマップに登録 ### Phase 3-C: StaticCompiler 文字列メソッド正規化 (guard.rs:106-129) - length/substring等→StringBox.method に統一 - ParserBox.length → StringBox.length ## 検証 ✅ RC=0 達成(apps/tests/stage1_skip_ws_repro.hako) ✅ 正規化トレース確認(ParserBox→StringBox) ✅ receiver捏造完全防止 Co-Authored-By: ChatGPT5 <chatgpt@openai.com>
2025-11-21 13:53:50 +09:00
b.value_origin_newbox.insert(dst, "StringBox".to_string());
dst
}
#[inline]
pub fn emit_null(b: &mut MirBuilder) -> ValueId {
let dst = b.next_value_id();
let _ = b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Null,
});
// Phase 84-1: Null constant type annotation
// Note: MirType has no Null variant, using Unknown as fallback
b.value_types.insert(dst, crate::mir::MirType::Unknown);
dst
}
#[inline]
pub fn emit_void(b: &mut MirBuilder) -> ValueId {
let dst = b.next_value_id();
let _ = b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Void,
});
// Phase 84-1: Void constant type annotation
b.value_types.insert(dst, crate::mir::MirType::Void);
dst
}