mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-30 07:31:59 -04:00
f3de70fce5
Six T7 agents independently reached score 0 by restoring an argument the decompiled source had dropped, and no generator could reach the class because every other family rewrites statements that exist while this changes a call's ARITY. R19 closes that gap without cracking anything: it finds every call whose in-scope declaration is narrower than the callee's real definition, then offers one candidate per value already in scope (each parameter, each local declared before the call) and lets the byte oracle pick. The missing argument is never inferred. - known-true check: run on the pre-bank text of func_8017A3D8, which agent a12 solved by hand, R19 emits that agent's exact fix and --try scores it 0 (OTHER; mine 53 ins, target 53) — MATCH. - two spellings were wrong before that passed. It took the return type from the DEFINITION and produced ((void (*)(s32))f)(a) != 0, which cannot compile because the defining TU says void where this one says int — it now repairs the arity only and keeps the TU's declared return type. And it required a simple statement, so it found nothing on the very body it was written from: these calls live in and far more often than in a plain statement. - it also sees the cast-wrapped form ((s32 (*)(void))f)(), which is how m2c usually spells a dropped argument, and replaces the whole wrapper rather than nesting a second cast. - ranked FIRST in every residual class: it emits candidates only for calls whose declaration provably disagrees with the definition, so it costs nothing when it does not apply. The engine selftest's ordering invariant is updated to say so rather than being widened again. - argcheck now carries each definition's return type, which the cast route needs. - selftest: two positive assertions and two controls (the declared return type is kept; the definition's is refused; a call inside a return statement is seen; a matching declaration offers nothing).