def get_jump_index_of_conditional(elem, desc): # depending on the python version the jump # index may be given relative or absolute if desc['relative']: jump_index = parse_absolute_index_from_elem_indic(elem) else: jump_index = elem['arg'] return jump_index
def prepare_try_element(elems, next_asm_indexes, elem, next_index_in_sequence): elem['mnemo'] = 'TRY_CONSTRUCT' # update name for clarity next_indexes = {} except_index = parse_absolute_index_from_elem_indic(elem) except_info = analyse_except_startup_code(elems, next_asm_indexes, except_index) except_expr_index = except_info['except_expression_index'] if except_expr_index != None: next_indexes[EXCEPT_EXPRESSION_CLAUSE] = \ except_info['except_expression_index'] next_indexes[EXCEPT_CLAUSE] = except_info['except_adapted_index'] next_indexes[TRY_CLAUSE] = next_index_in_sequence elem['next_indexes'] = next_indexes elem['except_target'] = except_info['except_target'] elem['except_expression'] = None # if any, we don't know it yet anyway
def prepare_try_element(elems, next_asm_indexes, elem, next_index_in_sequence): elem['mnemo'] = 'TRY_CONSTRUCT' # update name for clarity next_indexes = {} except_index = parse_absolute_index_from_elem_indic(elem) except_info = analyse_except_startup_code( elems, next_asm_indexes, except_index) except_expr_index = except_info['except_expression_index'] if except_expr_index != None: next_indexes[EXCEPT_EXPRESSION_CLAUSE] = \ except_info['except_expression_index'] next_indexes[EXCEPT_CLAUSE] = except_info['except_adapted_index'] next_indexes[TRY_CLAUSE] = next_index_in_sequence elem['next_indexes'] = next_indexes elem['except_target'] = except_info['except_target'] elem['except_expression'] = None # if any, we don't know it yet anyway
def analyse_structures(asm_indexes, indexed_asm): next_asm_indexes = {} # compute a dict of next indexes in the sequence for i in range(len(asm_indexes)-1): index = asm_indexes[i] next_index = asm_indexes[i+1] next_asm_indexes[index] = next_index next_asm_indexes[next_index] = None for index in asm_indexes: next_index_in_sequence = next_asm_indexes[index] elem = indexed_asm[index] # by default next index is the next instruction elem['next_indexes'] = { NORMAL_FLOW: next_index_in_sequence } mnemo = elem['mnemo'] if mnemo == 'JUMP_FORWARD': # replace relative indexes by absolute ones elem['mnemo'] = 'JUMP_ABSOLUTE' elem['arg'] = None # for clarity elem['next_indexes'] = { NORMAL_FLOW: parse_absolute_index_from_elem_indic(elem) } elif mnemo == 'JUMP_ABSOLUTE': # set next index to the jump target elem['next_indexes'] = { NORMAL_FLOW: elem['arg'] } elif mnemo == 'LOAD_CONST' and elem['indic'].startswith('<code object'): elem['mnemo'] = 'LOAD_CONST_CODE' elif mnemo in 'SETUP_EXCEPT': prepare_try_element(indexed_asm, next_asm_indexes, elem, next_index_in_sequence) elif mnemo in [ 'RETURN_VALUE', 'BREAK_LOOP', 'RAISE_VARARGS', 'END_OF_CLAUSE', 'YIELD_VALUE' ]: elem['next_indexes'] = {} # and initialize info about conditions elem['clause_footprints'] = {} recognise_for_loops(asm_indexes, indexed_asm) for index in asm_indexes: elem = indexed_asm[index] mnemo = elem['mnemo'] if mnemo in CONDITIONAL_JUMPS: next_index_in_sequence = elem['next_indexes'][NORMAL_FLOW] prepare_if_element(elem, mnemo, next_index_in_sequence) #for index in asm_indexes: # print indexed_asm[index] handle_boolean_conditions(indexed_asm, asm_indexes[0]) recognise_while_loops(asm_indexes, indexed_asm) set_constructs_boundaries(asm_indexes, indexed_asm) return asm_indexes, indexed_asm