diff --git a/scripts/code.py b/scripts/code.py index 596dc373..7da027c2 100755 --- a/scripts/code.py +++ b/scripts/code.py @@ -375,8 +375,6 @@ class DwarfInfo: return self.entries.get(k, d) else: - import difflib - # organize entries by name if not hasattr(self, '_by_name'): self._by_name = {} @@ -384,20 +382,24 @@ class DwarfInfo: if entry.name is not None: self._by_name[entry.name] = entry - # exact match? avoid difflib if we can for speed + # exact match? do a quick lookup if k in self._by_name: return self._by_name[k] - # find the best matching dwarf entry with difflib + # find the best matching dwarf entry with a simple + # heuristic # # this can be different from the actual symbol because # of optimization passes else: - name, entry = max( - self._by_name.items(), - key=lambda entry: difflib.SequenceMatcher( - None, entry[0], k, False).ratio(), - default=(None, None)) - return entry + def key(entry): + i = k.find(entry.name) + if i == -1: + return None + return (i, len(k)-(i+len(entry.name)), k) + return min( + filter(key, self._by_name.values()), + key=key, + default=d) def __getitem__(self, k): v = self.get(k) diff --git a/scripts/ctx.py b/scripts/ctx.py index 5224a903..017d8d24 100755 --- a/scripts/ctx.py +++ b/scripts/ctx.py @@ -384,8 +384,6 @@ class DwarfInfo: return self.entries.get(k, d) else: - import difflib - # organize entries by name if not hasattr(self, '_by_name'): self._by_name = {} @@ -393,20 +391,24 @@ class DwarfInfo: if entry.name is not None: self._by_name[entry.name] = entry - # exact match? avoid difflib if we can for speed + # exact match? do a quick lookup if k in self._by_name: return self._by_name[k] - # find the best matching dwarf entry with difflib + # find the best matching dwarf entry with a simple + # heuristic # # this can be different from the actual symbol because # of optimization passes else: - name, entry = max( - self._by_name.items(), - key=lambda entry: difflib.SequenceMatcher( - None, entry[0], k, False).ratio(), - default=(None, None)) - return entry + def key(entry): + i = k.find(entry.name) + if i == -1: + return None + return (i, len(k)-(i+len(entry.name)), k) + return min( + filter(key, self._by_name.values()), + key=key, + default=d) def __getitem__(self, k): v = self.get(k) diff --git a/scripts/data.py b/scripts/data.py index 998190a8..e8c09347 100755 --- a/scripts/data.py +++ b/scripts/data.py @@ -375,8 +375,6 @@ class DwarfInfo: return self.entries.get(k, d) else: - import difflib - # organize entries by name if not hasattr(self, '_by_name'): self._by_name = {} @@ -384,20 +382,24 @@ class DwarfInfo: if entry.name is not None: self._by_name[entry.name] = entry - # exact match? avoid difflib if we can for speed + # exact match? do a quick lookup if k in self._by_name: return self._by_name[k] - # find the best matching dwarf entry with difflib + # find the best matching dwarf entry with a simple + # heuristic # # this can be different from the actual symbol because # of optimization passes else: - name, entry = max( - self._by_name.items(), - key=lambda entry: difflib.SequenceMatcher( - None, entry[0], k, False).ratio(), - default=(None, None)) - return entry + def key(entry): + i = k.find(entry.name) + if i == -1: + return None + return (i, len(k)-(i+len(entry.name)), k) + return min( + filter(key, self._by_name.values()), + key=key, + default=d) def __getitem__(self, k): v = self.get(k) diff --git a/scripts/structs.py b/scripts/structs.py index b3c6db7f..353dbc16 100755 --- a/scripts/structs.py +++ b/scripts/structs.py @@ -272,8 +272,6 @@ class DwarfInfo: return self.entries.get(k, d) else: - import difflib - # organize entries by name if not hasattr(self, '_by_name'): self._by_name = {} @@ -281,20 +279,24 @@ class DwarfInfo: if entry.name is not None: self._by_name[entry.name] = entry - # exact match? avoid difflib if we can for speed + # exact match? do a quick lookup if k in self._by_name: return self._by_name[k] - # find the best matching dwarf entry with difflib + # find the best matching dwarf entry with a simple + # heuristic # # this can be different from the actual symbol because # of optimization passes else: - name, entry = max( - self._by_name.items(), - key=lambda entry: difflib.SequenceMatcher( - None, entry[0], k, False).ratio(), - default=(None, None)) - return entry + def key(entry): + i = k.find(entry.name) + if i == -1: + return None + return (i, len(k)-(i+len(entry.name)), k) + return min( + filter(key, self._by_name.values()), + key=key, + default=d) def __getitem__(self, k): v = self.get(k)