summaryrefslogtreecommitdiff
path: root/python/highlevelil.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/highlevelil.py')
-rw-r--r--python/highlevelil.py22
1 files changed, 15 insertions, 7 deletions
diff --git a/python/highlevelil.py b/python/highlevelil.py
index 2b4d9153..afdc2b2e 100644
--- a/python/highlevelil.py
+++ b/python/highlevelil.py
@@ -20,7 +20,7 @@
import ctypes
import struct
-from typing import Optional, Generator, List, Union, NewType, Tuple, ClassVar, Mapping, Set, Callable, Any, Iterator
+from typing import Optional, Generator, List, Union, NewType, Tuple, ClassVar, Mapping, Set, Callable, Any, Iterator, overload
from dataclasses import dataclass
from enum import Enum
@@ -798,10 +798,11 @@ class HighLevelILInstruction(BaseILInstruction):
:Example:
>>> def get_constant_less_than_value(inst: HighLevelILInstruction, value: int) -> int:
- >>> if isinstance(inst, Constant) and inst.constant < value:
- >>> return inst.constant
+ ... if isinstance(inst, Constant) and inst.constant < value:
+ ... return inst.constant
>>>
- >>> list(inst.traverse(get_constant_less_than_value, 10))
+ >>> for result in inst.traverse(get_constant_less_than_value, 10):
+ ... print(f"Found a constant {result} < 10 in {repr(inst)}")
"""
if (result := cb(self, *args, **kwargs)) is not None:
yield result
@@ -2556,7 +2557,7 @@ class HighLevelILFunction:
def traverse(self, cb: Callable[['HighLevelILInstruction', Any], Any], *args: Any, **kwargs: Any) -> Iterator[Any]:
"""
- ``traverse`` iterates through all the instructions in the HighLevelILInstruction and calls the callback function for
+ ``traverse`` iterates through all the instructions in the HighLevelILFunction and calls the callback function for
each instruction and sub-instruction. See the `Developer Docs <https://docs.binary.ninja/dev/concepts.html#walking-ils>`_ for more examples.
:param Callable[[HighLevelILInstruction, Any], Any] cb: The callback function to call for each node in the HighLevelILInstruction
@@ -2572,7 +2573,8 @@ class HighLevelILFunction:
... case Localcall(dest=Constant(constant=c), params=[_, _, p]) if c == target and not isinstance(p, Constant):
... return i
>>> target_address = bv.get_symbol_by_raw_name('_memcpy').address
- >>> list(current_il_function.traverse(find_non_constant_memcpy, target_address))
+ >>> for result in current_il_function.traverse(find_non_constant_memcpy, target_address):
+ ... print(f"Found suspicious memcpy: {repr(i)}")
"""
root = self.root
if root is None:
@@ -3089,7 +3091,13 @@ class HighLevelILBasicBlock(basicblock.BasicBlock):
for idx in range(self.start, self.end):
yield self.il_function[idx]
- def __getitem__(self, idx) -> Union[List[HighLevelILInstruction], HighLevelILInstruction]:
+ @overload
+ def __getitem__(self, idx: int) -> 'HighLevelILInstruction': ...
+
+ @overload
+ def __getitem__(self, idx: slice) -> List['HighLevelILInstruction']: ...
+
+ def __getitem__(self, idx: Union[int, slice]) -> Union[List[HighLevelILInstruction], HighLevelILInstruction]:
size = self.end - self.start
if isinstance(idx, slice):
return [self[index] for index in range(*idx.indices(size))] # type: ignore