Files
hakorune/lang/src/vm/hakorune-vm/extern_provider.hako
nyash-codex 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

72 lines
3.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// extern_provider.hako — HakoruneExternProviderBox
// Responsibility: minimal extern/global call handling on Hako side.
// Scope (20.38準備): env.get / console.log のみCABI導線は後段で接続
using selfhost.vm.hakorune-vm.str_cast as StrCast
using selfhost.shared.host_bridge.codegen_bridge as CodegenBridgeBox
static box HakoruneExternProviderBox {
get(name, args) {
// name: string like "env.get" or "env.console.log"
if name == "env.get" {
if args == null { return null }
// args: single string key
local key = StrCast.to_str(args)
return env.get(key)
}
if name == "env.console.log" || name == "nyash.console.log" || name == "print" {
// Accept single argument value → print as string
if args == null { print(""); return 0 }
print(StrCast.to_str(args))
return 0
}
if name == "env.console.warn" || name == "nyash.console.warn" {
if args == null { print("[warn]"); return 0 }
print("[warn] " + (""+args))
return 0
}
if name == "env.console.error" || name == "nyash.console.error" {
if args == null { print("[error]"); return 0 }
print("[error] " + (""+args))
return 0
}
if name == "env.mirbuilder.emit" {
// Optional CABI bridge既定OFF: タグを出力しつつ、Rust 側 extern_provider に最小接続
if env.get("HAKO_V1_EXTERN_PROVIDER_C_ABI") == "1" {
print("[extern/c-abi:mirbuilder.emit]")
// Call through to Core extern dispatcher and return the produced JSON (v1)
local out = hostbridge.extern_invoke("env.mirbuilder", "emit", args)
return "" + out
}
// Default: return empty string (verify/dev stub keeps rc=0)
return ""
}
if name == "env.codegen.emit_object" || name == "env.codegen.emit_object_ny" {
// Optional CABI bridge既定OFF: Rust 側 extern_provider に最小接続
if env.get("HAKO_V1_EXTERN_PROVIDER_C_ABI") == "1" {
// 追跡は任意決定性のため既定はOFF
if env.get("HAKO_CABI_TRACE") == "1" { print("[extern/c-abi:codegen.emit_object]") }
// Call through to Core extern dispatcher and return produced object path
// 現段階では Core 側で C-API/llvmlite の切替を行う。
// 互換のため *_ny も最終的に emit_object へ委譲する。
local out = CodegenBridgeBox.emit_object_args(args)
return "" + out
}
// Default: return empty string (verify/dev stub keeps rc=0)
return ""
}
if name == "env.box_introspect.kind" {
if env.get("HAKO_V1_EXTERN_PROVIDER_C_ABI") == "1" {
if env.get("HAKO_CABI_TRACE") == "1" { print("[extern/c-abi:box_introspect.kind]") }
local out = hostbridge.extern_invoke("env.box_introspect", "kind", args)
return "" + out
}
return ""
}
// Unknown: return null for now (caller decides FailFast)
return null
}
}
static box HakoruneExternProviderMain { method main(args) { return 0 } }