feat(stageb): Phase 25.1c - Stage-B トレース追加(dev-only)
追加内容:
- StageBTraceBox: dev トレース用 Box 追加(HAKO_STAGEB_TRACE=1 で有効)
- トレースポイント:
- StageBArgsBox.resolve_src: enter/return_len
- StageBBodyExtractorBox.build_body_src: enter_len/return_len
- StageBDriverBox.main: enter/after_resolve_src/after_build_body_src/
after_parse_program2/func_scan methods/exit rc=0
Phase 25.1c 目標:
- Stage-B / Stage-1 CLI 構造デバッグ
- fib canary / selfhost CLI canary の rc=1 原因特定
ポリシー:
- dev env でガード(挙動不変)
- 既定挙動は変更せず、観測のみ追加
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -17,9 +17,28 @@ using lang.compiler.entry.func_scanner as FuncScannerBox
|
||||
using lang.compiler.entry.using_resolver as Stage1UsingResolverBox
|
||||
using lang.compiler.builder.mod as CompilerBuilder
|
||||
|
||||
// Dev-only trace helper (Phase 25.1c)
|
||||
// - Enabled when HAKO_STAGEB_TRACE=1
|
||||
// - Keeps Stage-B behavior unchanged(ログのみ追加)
|
||||
static box StageBTraceBox {
|
||||
log(label) {
|
||||
local flag = env.get("HAKO_STAGEB_TRACE")
|
||||
if flag == null { return 0 }
|
||||
if ("" + flag) != "1" { return 0 }
|
||||
// label が null/Void でも落ちないように守る(dev専用)
|
||||
local msg = "[stageb/trace]"
|
||||
if label != null {
|
||||
msg = msg + " " + ("" + label)
|
||||
}
|
||||
print(msg)
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 25.1c: CLI argument → source resolution
|
||||
static box StageBArgsBox {
|
||||
resolve_src(args) {
|
||||
StageBTraceBox.log("StageBArgsBox.resolve_src:enter")
|
||||
// 1) Collect source from args or env
|
||||
local src = null
|
||||
local src_file = null
|
||||
@ -43,6 +62,13 @@ static box StageBArgsBox {
|
||||
// Original: if src == null { src = env.local.get("HAKO_SOURCE") }
|
||||
if src == null { src = "return 0" }
|
||||
|
||||
{
|
||||
// Trace final source length(dev専用)
|
||||
local l = 0
|
||||
if src != null { l = ("" + src).length() }
|
||||
StageBTraceBox.log("StageBArgsBox.resolve_src:return_len=" + ("" + l))
|
||||
}
|
||||
|
||||
return src
|
||||
}
|
||||
}
|
||||
@ -50,6 +76,12 @@ static box StageBArgsBox {
|
||||
// Phase 25.1c: Body extraction + bundle + using + trim
|
||||
static box StageBBodyExtractorBox {
|
||||
build_body_src(src, args) {
|
||||
{
|
||||
//入口トレース: 入力ソース長と引数有無
|
||||
local l = 0
|
||||
if src != null { l = ("" + src).length() }
|
||||
StageBTraceBox.log("StageBBodyExtractorBox.build_body_src:enter len=" + ("" + l))
|
||||
}
|
||||
// ============================================================================
|
||||
// Depth guard: prevent accidental recursion inside Stage‑B body extractor
|
||||
// ============================================================================
|
||||
@ -609,6 +641,13 @@ static box StageBBodyExtractorBox {
|
||||
if e > b { body_src = s.substring(b, e) } else { body_src = "" }
|
||||
}
|
||||
|
||||
{
|
||||
//出口トレース: 抽出後 body_src 長
|
||||
local l2 = 0
|
||||
if body_src != null { l2 = ("" + body_src).length() }
|
||||
StageBTraceBox.log("StageBBodyExtractorBox.build_body_src:return_len=" + ("" + l2))
|
||||
}
|
||||
|
||||
// Clear depth guard before returning
|
||||
env.set("HAKO_STAGEB_BODY_DEPTH", "0")
|
||||
return body_src
|
||||
@ -630,7 +669,14 @@ static box StageBDriverBox {
|
||||
env.set("HAKO_STAGEB_DRIVER_DEPTH", "1")
|
||||
}
|
||||
|
||||
StageBTraceBox.log("StageBDriverBox.main:enter")
|
||||
|
||||
local src = StageBArgsBox.resolve_src(args)
|
||||
{
|
||||
local l = 0
|
||||
if src != null { l = ("" + src).length() }
|
||||
StageBTraceBox.log("StageBDriverBox.main:after_resolve_src len=" + ("" + l))
|
||||
}
|
||||
|
||||
// 2) Stage‑3 acceptance default ON for selfhost (env may turn off; keep tolerant here)
|
||||
local p = new ParserBox()
|
||||
@ -643,11 +689,22 @@ static box StageBDriverBox {
|
||||
// local externs_json = p.get_externs_json()
|
||||
|
||||
local body_src = StageBBodyExtractorBox.build_body_src(src, args)
|
||||
{
|
||||
local l2 = 0
|
||||
if body_src != null { l2 = ("" + body_src).length() }
|
||||
StageBTraceBox.log("StageBDriverBox.main:after_build_body_src len=" + ("" + l2))
|
||||
}
|
||||
|
||||
// 6) Parse and emit Stage‑1 JSON v0 (Program)
|
||||
// Bridge(JSON v0) が Program v0 を受け取り MIR に lowering するため、ここでは AST(JSON v0) を出力する。
|
||||
// 既定で MIR 直出力は行わない(重い経路を避け、一行出力を保証)。
|
||||
local ast_json = p.parse_program2(body_src)
|
||||
{
|
||||
// AST(JSON v0) の長さを軽く観測
|
||||
local la = 0
|
||||
if ast_json != null { la = ("" + ast_json).length() }
|
||||
StageBTraceBox.log("StageBDriverBox.main:after_parse_program2 len=" + ("" + la))
|
||||
}
|
||||
|
||||
// 6.3) Apply SSA transformations (CompilerBuilder pipeline)
|
||||
{
|
||||
@ -686,6 +743,12 @@ static box StageBDriverBox {
|
||||
// Use FuncScannerBox to extract method definitions from all boxes
|
||||
local methods = FuncScannerBox.scan_all_boxes(src)
|
||||
|
||||
{
|
||||
local cnt = 0
|
||||
if methods != null { cnt = methods.length() }
|
||||
StageBTraceBox.log("StageBDriverBox.main:func_scan methods=" + ("" + cnt))
|
||||
}
|
||||
|
||||
// Build defs JSON array
|
||||
if methods.length() > 0 {
|
||||
defs_json = ",\"defs\":["
|
||||
@ -734,6 +797,7 @@ static box StageBDriverBox {
|
||||
}
|
||||
|
||||
print(ast_json)
|
||||
StageBTraceBox.log("StageBDriverBox.main:exit rc=0")
|
||||
// Clear depth guard before returning
|
||||
env.set("HAKO_STAGEB_DRIVER_DEPTH", "0")
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user