def check_instruction_set_for_if_else(instruction, curr_node, set_of_instructions, num, row, last_node, last_node_state): decompiler_data = DecompilerData() if instruction[0][0] == ".": decompiler_data.label = curr_node decompiler_data.parents_of_label = curr_node.parent decompiler_data.flag_of_else = True elif ("andn2" in instruction[0] or (num < len(set_of_instructions) and "branch" in set_of_instructions[num])) \ and decompiler_data.flag_of_else: if "andn2" not in instruction[0] and "branch" in set_of_instructions[ num]: set_of_instructions.insert(num + 1, row) return set_of_instructions, last_node, last_node_state elif decompiler_data.flag_of_else and "cbranch" in instruction[0]: last_node, last_node_state = change_cfg_for_else_structure( curr_node, instruction) else: decompiler_data.flag_of_else = False return set_of_instructions, last_node, last_node_state
def change_cfg_for_else_structure(curr_node, instruction): decompiler_data = DecompilerData() for parents_of_label in decompiler_data.parents_of_label: parents_of_label.children.remove(decompiler_data.label) last_node = decompiler_data.parents_of_label[1] last_node_state = copy.deepcopy(decompiler_data.parents_of_label[1].state) decompiler_data.from_node[instruction[1]].remove(curr_node) from_node = instruction[1] if decompiler_data.from_node.get(from_node, None) is None: decompiler_data.from_node[from_node] = [] for parents_of_label in decompiler_data.parents_of_label: if parents_of_label != decompiler_data.parents_of_label[1]: decompiler_data.from_node[from_node].append(parents_of_label) decompiler_data.flag_of_else = False return last_node, last_node_state