def compile(self, module: ir.Module, builder: ir.IRBuilder, symbols: SymbolTable) -> ir.Value: if not self.compiled: self.compiled = True parameters = [] for p in self.parameters: ir_type = p[1].ir_type if isinstance(p[1], Class): ir_type = ir_type.as_pointer() parameters.append(ir_type) self.func_type = ir.FunctionType(self.ret_type.ir_type, parameters) self.func = ir.Function(module, self.func_type, name=self.ID) symbols = SymbolTable(parent=symbols) for i, p in enumerate(self.parameters): self.func.args[i].name = p[0] symbols.add_symbol(p[0], self.func.args[i]) block = self.func.append_basic_block('entry') builder = ir.IRBuilder(block) self.block.compile(module, builder, symbols) block = builder.block if not builder.block.is_terminated: if self.ret_type == UnitType: builder.ret_void() else: builder.unreachable() return self.func else: return self.func