def make_il(self, il_code, symbol_table, c): """Make IL code for returning this value.""" if self.return_value and not c.return_type.is_void(): il_value = self.return_value.make_il(il_code, symbol_table, c) check_cast(il_value, c.return_type, self.return_value.r) ret = set_type(il_value, c.return_type, il_code) il_code.add(control_cmds.Return(ret)) elif self.return_value and c.return_type.is_void(): err = "function with void return type cannot return value" raise CompilerError(err, self.r) elif not self.return_value and not c.return_type.is_void(): err = "function with non-void return type must return value" raise CompilerError(err, self.r) else: il_code.add(control_cmds.Return())
def make_il(self, il_code, symbol_table, c): """Make IL code for returning this value.""" il_value = self.return_value.make_il(il_code, symbol_table, c) check_cast(il_value, ctypes.integer, self.return_value.r) ret = set_type(il_value, ctypes.integer, il_code) il_code.add(control_cmds.Return(ret))
def make_il(self, il_code, symbol_table, c): """Make code for this node.""" # This node will have c.is_global set True, so we must change it to # for the children context. c = c.set_global(False) self.body.make_il(il_code, symbol_table, c) zero = ILValue(ctypes.integer) il_code.register_literal_var(zero, 0) il_code.add(control_cmds.Return(zero))
def do_body(self, il_code, symbol_table, c): """Create code for function body. Caller must check that this function has a body. """ is_main = self.identifier.content == "main" for param in self.param_names: if not param: err = "function definition missing parameter name" raise CompilerError(err, self.range) if is_main: self.check_main_type() c = c.set_return(self.ctype.ret) il_code.start_func(self.identifier.content) symbol_table.new_scope() num_params = len(self.ctype.args) iter = zip(self.ctype.args, self.param_names, range(num_params)) for ctype, param, i in iter: arg = symbol_table.add_variable( param, ctype, symbol_table.DEFINED, None, symbol_table.AUTOMATIC) il_code.add(value_cmds.LoadArg(arg, i)) self.body.make_il(il_code, symbol_table, c, no_scope=True) if not il_code.always_returns() and is_main: zero = ILValue(ctypes.integer) il_code.register_literal_var(zero, 0) il_code.add(control_cmds.Return(zero)) elif not il_code.always_returns(): il_code.add(control_cmds.Return(None)) symbol_table.end_scope()