Beispiel #1
0
def store(program, params):
    # Implemented by Amit
    result = store_pattern.match()

    if result is None:
        raise InvalidOpcodeArguments('store', params)

    values = result.groupdict()

    src = values['src']
    src_type = get_type(values['src_type'])
    try:
        src_var = program.get_var(src)  # TODO: validate type?
    except InvalidVarName:
        src_var = src_type(src)

    dest_type = get_type(values['dest_type'])
    dest_var = program.get_var(values['dest']).value

    if dest_type is src_type:
        dest_var.value = src_var.value
    elif issubclass(dest_type, LLInt) and issubclass(src_type, LLInt):
        dest_var.value = src_var.value  # TODO: deal with different sizes

    print("STORE", params)

    program.inc_inst()
Beispiel #2
0
def ret(program, params):
    # ret i32 0
    return_type, return_value = params.split()
    return_obj = get_type(return_type)(return_value)

    # TODO: Should we access value.value here?
    program.state.result_var.value = return_obj
    program.state = program.callstack.pop()
Beispiel #3
0
def alloca(program, result_var, params):
    # TODO: Do something with align?
    result = ALLOCA_PATTERN.match(params)

    if not result:
        raise InvalidOpcodeArguments("alloca", params, result_var)

    values = result.groupdict()

    if result_var in program.state.scope:
        # TODO: Maybe this should throw an exception?
        pass

    allocated = get_type(values['type'])(None)
    ptr = get_type(values['type'] + "*")(None)
    ptr.value = allocated

    program.state.scope[result_var] = ptr
    program.inc_inst()