def goto_referring_address(self, acting_client): current_address = self.get_address(acting_client) if current_address is None: return ERRMSG_NO_IDENTIFIABLE_DESTINATION addresses = list(disassembly.get_referring_addresses(self.disassembly_data, current_address)) if not len(addresses): return ERRMSG_NO_IDENTIFIABLE_DESTINATION # Addresses appear in numerical order. addresses.sort() # Symbols appear in place of addresses where they exist. converted_addresses = addresses[:] self._convert_addresses_to_symbols_where_possible(converted_addresses) address_rows = [] for i, address in enumerate(addresses): code_string = self.get_source_code_for_address(acting_client, address) address_rows.append((self._address_to_string(address), converted_addresses[i], code_string)) selected_address = acting_client.request_address_selection(TEXT_SELECT_REFERRING_ADDRESS_SHORT, TEXT_SELECT_REFERRING_ADDRESS_LONG, TEXT_GO_TO_SELECTION, address_rows, addresses) if selected_address is None: return False next_line_number = disassembly.get_line_number_for_address(self.disassembly_data, selected_address) if next_line_number is None: return ERRMSG_BUG_UNABLE_TO_GOTO_LINE self.set_line_number(acting_client, next_line_number) self.address_stack.append(current_address) return True
def get_referring_addresses_for_address(self, acting_client, address): return list(disassembly.get_referring_addresses(self.disassembly_data, address))