| 232 | |
| 233 | |
| 234 | class 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 |
no outgoing calls
no test coverage detected