MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / BasicBlockList

Class BasicBlockList

python/function.py:234–289  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

232
233
234class BasicBlockList:
235 def __init__(
236 self, function: Union['Function', 'lowlevelil.LowLevelILFunction', 'mediumlevelil.MediumLevelILFunction',
237 'highlevelil.HighLevelILFunction']
238 ):
239 self._count, self._blocks = function._basic_block_list()
240 self._function = function
241 self._n = 0
242
243 def __repr__(self):
244 return f"<BasicBlockList {len(self)} BasicBlocks: {list(self)}>"
245
246 def __del__(self):
247 if core is not None:
248 core.BNFreeBasicBlockList(self._blocks, len(self))
249
250 def __len__(self):
251 return self._count.value
252
253 def __iter__(self):
254 return BasicBlockList(self._function)
255
256 def __next__(self) -> 'basicblock.BasicBlock':
257 if self._n >= len(self):
258 raise StopIteration
259 block = core.BNNewBasicBlockReference(self._blocks[self._n])
260 assert block is not None, "core.BNNewBasicBlockReference returned None"
261 self._n += 1
262 return self._function._instantiate_block(block)
263
264 @overload
265 def __getitem__(self, i: int) -> 'basicblock.BasicBlock': ...
266
267 @overload
268 def __getitem__(self, i: slice) -> List['basicblock.BasicBlock']: ...
269
270 def __getitem__(self, i: Union[int, slice]) -> Union['basicblock.BasicBlock', List['basicblock.BasicBlock']]:
271 if isinstance(i, int):
272 if i < 0:
273 i = len(self) + i
274 if i >= len(self):
275 raise IndexError(f"Index {i} out of bounds for BasicBlockList of size {len(self)}")
276 block = core.BNNewBasicBlockReference(self._blocks[i])
277 assert block is not None, "core.BNNewBasicBlockReference returned None"
278 return self._function._instantiate_block(block)
279 elif isinstance(i, slice):
280 result = []
281 if i.start < 0 or i.start >= len(self) or i.stop < 0 or i.stop >= len(self):
282 raise IndexError(f"Slice {i} out of bounds for FunctionList of size {len(self)}")
283
284 for j in range(i.start, i.stop, i.step if i.step is not None else 1):
285 block = core.BNNewBasicBlockReference(self._blocks[j])
286 assert block is not None, "core.BNNewBasicBlockReference returned None"
287 result.append(self._function._instantiate_block(block))
288 return result
289 raise ValueError("BasicBlockList.__getitem__ supports argument of type integer or slice only")
290
291

Callers 2

__iter__Method · 0.85
basic_blocksMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected