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()
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()
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()