mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-05 08:57:59 -04:00
fix(symfix): key the slate by (binary, fn); §420 multi-cluster rebase banks 4 in 57s
aprop_symfix deduped its slate by BARE FUNCTION NAME, so a four-row slate for func_8016AB6C across ov_SC03_107/ov_SC07_007/010/011 reported "1 drafts audited" - and the three dropped rows each needed a DIFFERENT rebase, because each overlay has its own target symbols. Same root as reloc_filter's binof and gate_lane's homonym staging: three tools, one R48/§238 defect. With all four visible, the structure is two uniform delta clusters of two, identical in shape across all four overlays - one seed body's two data clusters each moving as a block. STALE-DELTA only admits ONE cluster, so it refused all four as AMBIGUOUS. §420 records the safe generalisation (runs of constant delta, every run >= 2 members, D_ symbols only) and the verification step. Rebased by hand under that rule, all four still MATCH at closeness 0, and the gate banked 4/4 in 57 seconds with no drafting (commit:3629). Frontier 165, 45 banked.
This commit is contained in:
@@ -188,12 +188,19 @@ def main():
|
||||
|
||||
recs = [r for r in json.load(open(a.slate)) if isinstance(r, dict) and (r.get('fn') or r.get('name'))]
|
||||
skip = set(json.load(open(a.skip))) if a.skip else set()
|
||||
# KEY BY (binary, fn), NEVER BY NAME (R48/§238). A slate legitimately carries the SAME function
|
||||
# name for several binaries — one shared body copied into four overlays is the common case — and
|
||||
# a name-keyed `seen` silently audited ONE of them. Measured S71: a 4-row slate for
|
||||
# func_8016AB6C across ov_SC03_107/ov_SC07_007/010/011 reported "1 drafts audited", and the
|
||||
# three unexamined rows each needed a DIFFERENT rebase because each overlay's target symbols
|
||||
# differ.
|
||||
seen, rows = set(), []
|
||||
for r in recs:
|
||||
fn = r.get('fn') or r['name']
|
||||
if fn in skip or fn in seen:
|
||||
key = (r['binary'], fn)
|
||||
if fn in skip or key in seen:
|
||||
continue
|
||||
seen.add(fn)
|
||||
seen.add(key)
|
||||
draft = r.get('draft') or f".run/aprop1/{fn}/{fn}.c"
|
||||
st, stale, asm_only = audit_one(fn, r['binary'], draft)
|
||||
rows.append(dict(fn=fn, binary=r['binary'], draft=draft, status=st,
|
||||
|
||||
Reference in New Issue
Block a user