| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- """MCD proc-compare scorer. Usage: score.py ORIG_TXT OURS_TXT MOD PAIRS...
- PAIRS = OrigName:OursName. Masks absolute targets, proc refs, dep slots;
- leave-truncates bodies; reports SAME/PREFIX/DIFF per pair."""
- import re, sys
- def procs(path, mod):
- txt = open(path, errors='replace').read()
- heads = [(m.group(1), int(m.group(2), 16))
- for m in re.finditer(r'(?m)^;? ?' + mod + r'\.(\w+): ([0-9a-f]{4})$', txt)]
- ops = []
- for line in txt.splitlines():
- m = re.match(r'^\s*([0-9a-f]{4})\s+((?:[0-9a-f]{2}\s*)+?)(?:\s{2,}|\t+|$)(.*)$', line)
- if m:
- ops.append((int(m.group(1), 16), m.group(2).split(), m.group(3).strip()))
- out = {}
- addrs = sorted(set(a for _, a in heads))
- for name, a in heads:
- if name in out:
- continue
- nxt = min([x for x in addrs if x > a] or [0x10000])
- out[name] = [(o, b, m) for (o, b, m) in ops if a <= o < nxt and b != ['00'] and m]
- return out
- def norm(m):
- m = re.sub(r'\b0[0-9a-f]{3}\b', '@@@@', m)
- m = re.sub(r'call_with_frame proc\d+', 'call_with_frame proc##', m)
- m = re.sub(r'nested_call proc\d+', 'nested_call proc##', m)
- m = re.sub(r'(?<!_)proc\d+', 'proc##', m)
- return m
- def trunc(ms):
- li = [i for i, m in enumerate(ms)
- if m.split()[0] in ('leave', 'leave0', 'leave2', 'leave4', 'leave6',
- 'fct_leave', 'longfct_leave', 'end_program', 'Raise')]
- return ms[:li[-1] + 1] if li else ms
- def main():
- orig_txt, ours_txt, mod = sys.argv[1], sys.argv[2], sys.argv[3]
- A, B = procs(orig_txt, mod), procs(ours_txt, mod)
- same = tot = 0
- for pair in sys.argv[4:]:
- o, u = pair.split(':')
- tot += 1
- if o not in A:
- print(f'{u}/{o} ORIG-MISSING'); continue
- if u not in B:
- print(f'{u}/{o} OURS-MISSING'); continue
- xa, xb = trunc([norm(m) for (_, _, m) in A[o]]), trunc([norm(m) for (_, _, m) in B[u]])
- n = min(len(xa), len(xb))
- if xa == xb:
- same += 1
- print(f'{u}/{o} {len(xa)} vs {len(xb)} SAME')
- elif xa[:n] == xb[:n]:
- print(f'{u}/{o} {len(xa)} vs {len(xb)} PREFIX(+{abs(len(xa)-len(xb))})')
- else:
- print(f'{u}/{o} {len(xa)} vs {len(xb)} DIFF')
- print(f'{same}/{tot} exact')
- main()
|