mirror of
https://github.com/isledecomp/isle-portable.git
synced 2024-11-26 01:17:55 -05:00
Detect when we exceed original function size (#736)
This commit is contained in:
parent
32bc6c4264
commit
064feab51a
2 changed files with 26 additions and 1 deletions
|
@ -384,7 +384,16 @@ def _find_vtordisp(self):
|
|||
self._db.set_function_pair(orig_addr, recomp_addr)
|
||||
|
||||
def _compare_function(self, match: MatchInfo) -> DiffReport:
|
||||
orig_raw = self.orig_bin.read(match.orig_addr, match.size)
|
||||
# Detect when the recomp function size would cause us to read
|
||||
# enough bytes from the original function that we cross into
|
||||
# the next annotated function.
|
||||
next_orig = self._db.get_next_orig_addr(match.orig_addr)
|
||||
if next_orig is not None:
|
||||
orig_size = min(next_orig - match.orig_addr, match.size)
|
||||
else:
|
||||
orig_size = match.size
|
||||
|
||||
orig_raw = self.orig_bin.read(match.orig_addr, orig_size)
|
||||
recomp_raw = self.recomp_bin.read(match.recomp_addr, match.size)
|
||||
|
||||
# It's unlikely that a function other than an adjuster thunk would
|
||||
|
|
|
@ -73,6 +73,7 @@ def matchinfo_factory(_, row):
|
|||
|
||||
|
||||
class CompareDb:
|
||||
# pylint: disable=too-many-public-methods
|
||||
def __init__(self):
|
||||
self._db = sqlite3.connect(":memory:")
|
||||
self._db.executescript(_SETUP_SQL)
|
||||
|
@ -348,6 +349,21 @@ def _match_on(self, compare_type: SymbolType, addr: int, name: str) -> bool:
|
|||
|
||||
return self.set_pair(addr, recomp_addr, compare_type)
|
||||
|
||||
def get_next_orig_addr(self, addr: int) -> Optional[int]:
|
||||
"""Return the original address (matched or not) that follows
|
||||
the one given. If our recomp function size would cause us to read
|
||||
too many bytes for the original function, we can adjust it."""
|
||||
result = self._db.execute(
|
||||
"""SELECT orig_addr
|
||||
FROM `symbols`
|
||||
WHERE orig_addr > ?
|
||||
ORDER BY orig_addr
|
||||
LIMIT 1""",
|
||||
(addr,),
|
||||
).fetchone()
|
||||
|
||||
return result[0] if result is not None else None
|
||||
|
||||
def match_function(self, addr: int, name: str) -> bool:
|
||||
did_match = self._match_on(SymbolType.FUNCTION, addr, name)
|
||||
if not did_match:
|
||||
|
|
Loading…
Reference in a new issue