Files
hakorune/lang/src/vm/boxes/v1_phi_adapter.hako

71 lines
2.7 KiB
Plaintext

// v1_phi_adapter.hako — V1PhiAdapterBox
// Responsibility: adapt MIR JSON v1 PHI incoming lists to the format expected
// by existing PhiDecodeBox/PhiApplyBox if needed. Currently acts as a
// pass-through for pairs [value, bb]. Kept as a place-holder for future needs.
box V1PhiAdapterBox {
// Pick value register id from a phi object segment for a given predecessor bb id.
// seg: JSON object text for one phi instruction
// prev_bb: integer predecessor block id
pick_incoming_value_id(seg, prev_bb, flow_trace) {
if seg == null { return null }
local trace = 0
if flow_trace != null { if flow_trace == 1 { trace = 1 } }
if trace == 1 { print("[phi_adapter] pick_incoming prev_bb=" + (""+prev_bb) + " from seg") }
// locate incoming array boundaries robustly (tolerate spaces/newlines)
local key = "\"incoming\""
local pk = seg.indexOf(key)
if pk < 0 { return null }
local lb = seg.indexOf("[", pk)
if lb < 0 { return null }
local rb = JsonFragBox._seek_array_end(seg, lb)
if rb <= lb { return null }
local arr = seg.substring(lb + 1, rb)
// iterate top-level pairs [val, pred]
local pos = 0
loop(true) {
if pos >= arr.length() { break }
local lb2 = arr.indexOf("[", pos)
if lb2 < 0 { break }
local rb2 = JsonFragBox._seek_array_end(arr, lb2)
if rb2 <= lb2 { break }
// inside the pair (without brackets)
local pair = arr.substring(lb2 + 1, rb2)
// read value id (first integer)
local vstr = JsonFragBox.read_int_from(pair, 0)
if vstr != null {
local vint = JsonFragBox._str_to_int(vstr)
// find comma separating bb
local comma = pair.indexOf(",")
local bstr = null
if comma >= 0 {
bstr = JsonFragBox.read_int_from(pair, comma + 1)
} else {
// fallback: try last integer in the pair by scanning from end backwards
// (rare, but keeps tolerant against missing comma with spaces)
local j = pair.length() - 1
loop(j >= 0) {
local ch = pair.substring(j, j+1)
if (ch >= "0" && ch <= "9") || ch == "-" { j = j - 1 } else { break }
}
local k = j + 1
// find start of the number
loop(k > 0) {
local ch2 = pair.substring(k-1, k)
if (ch2 >= "0" && ch2 <= "9") || ch2 == "-" { k = k - 1 } else { break }
}
bstr = pair.substring(k, j + 1)
}
if bstr != null {
local bint = JsonFragBox._str_to_int(bstr)
if bint == prev_bb { return vint }
}
}
pos = rb2 + 1
}
return null
}
}
static box V1PhiAdapterMain { method main(args) { return 0 } }