feat(parserstmt): add shallow recursion guard to ParserStmtBox.parse
This commit is contained in:
@ -9,6 +9,17 @@ using lang.compiler.parser.stmt.parser_exception_box
|
|||||||
|
|
||||||
static box ParserStmtBox {
|
static box ParserStmtBox {
|
||||||
parse(src, i, ctx) {
|
parse(src, i, ctx) {
|
||||||
|
// Shallow recursion guard: prevent ParserStmtBox.parse from recursively
|
||||||
|
// re-entering itself on the same VM stack(Stage‑B/selfhost 安全弁)。
|
||||||
|
{
|
||||||
|
local depth = env.get("HAKO_STAGEB_STMT_DEPTH")
|
||||||
|
if depth != null && ("" + depth) != "0" {
|
||||||
|
print("[stageb/recursion] ParserStmtBox.parse recursion detected")
|
||||||
|
// Fail-fast: return empty stmt and keep position unchanged
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
env.set("HAKO_STAGEB_STMT_DEPTH", "1")
|
||||||
|
}
|
||||||
local j = ctx.skip_ws(src, i)
|
local j = ctx.skip_ws(src, i)
|
||||||
local stmt_start = j
|
local stmt_start = j
|
||||||
|
|
||||||
@ -182,6 +193,8 @@ static box ParserStmtBox {
|
|||||||
if j < src.length() { j = j + 1 } else { j = src.length() }
|
if j < src.length() { j = j + 1 } else { j = src.length() }
|
||||||
}
|
}
|
||||||
ctx.gpos_set(j)
|
ctx.gpos_set(j)
|
||||||
|
// Clear depth guard before returning
|
||||||
|
env.set("HAKO_STAGEB_STMT_DEPTH", "0")
|
||||||
return "{\"type\":\"Expr\",\"expr\":" + e + "}"
|
return "{\"type\":\"Expr\",\"expr\":" + e + "}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user