hv1: early-exit at main (no plugin init); tokenizer: Stage-3 single-quote + full escapes (\/ \b \f \' \r fix); builder: route BinOp via SSOT emit_binop_to_dst; hv1 verify canary route (builder→Core); docs: phase-20.39 updates
This commit is contained in:
@ -1,9 +1,27 @@
|
||||
// pattern_util_box.hako — Shared utilities for MirBuilder lowers
|
||||
|
||||
using selfhost.shared.json.utils.json_frag as JsonFragBox
|
||||
using selfhost.shared.common.string_helpers as StringHelpers
|
||||
|
||||
static box PatternUtilBox {
|
||||
map_cmp(sym) { if sym=="<" {return "Lt"} if sym==">" {return "Gt"} if sym=="<=" {return "Le"} if sym==">=" {return "Ge"} if sym=="==" {return "Eq"} if sym=="!=" {return "Ne"} return null }
|
||||
// Normalize limit for canonical (i < limit) form.
|
||||
// When swapped==0, expects op in {'<','<='}; when swapped==1 (Int on lhs, Var on rhs), expects op in {'>','>='}.
|
||||
// Returns adjusted limit string or null if unsupported.
|
||||
normalize_limit_for_lt(op, swapped, limit_str) {
|
||||
local op1 = "" + op
|
||||
local ls = "" + limit_str
|
||||
if swapped == 0 {
|
||||
if op1 == "<" { return ls }
|
||||
if op1 == "<=" { return StringHelpers.int_to_str(JsonFragBox._str_to_int(ls) + 1) }
|
||||
if op1 == "!=" { return ls } // safe for count(init=0,step=1)
|
||||
return null
|
||||
} else {
|
||||
if op1 == ">" { return ls }
|
||||
if op1 == ">=" { return StringHelpers.int_to_str(JsonFragBox._str_to_int(ls) + 1) }
|
||||
return null
|
||||
}
|
||||
}
|
||||
find_local_int_before(s, name, before_pos) {
|
||||
local pos=0; local last=-1
|
||||
loop(true){ local k=JsonFragBox.index_of_from(s, "\"type\":\"Local\"",pos); if k<0||k>=before_pos{break}; local kn=JsonFragBox.index_of_from(s, "\"name\":\"",k); if kn>=0{ local ii=kn+8; local nn=s.length(); local jj=ii; loop(jj<nn){ if s.substring(jj,jj+1)=="\"" {break} jj=jj+1 } if s.substring(ii,jj)==name { last=k } } pos=k+1 }
|
||||
|
||||
Reference in New Issue
Block a user