示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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