def setUp(self) -> None: self.env = Environment() self.n = self.env.add_local(Var('n'), int_rprimitive) self.m = self.env.add_local(Var('m'), int_rprimitive) self.k = self.env.add_local(Var('k'), int_rprimitive) self.l = self.env.add_local(Var('l'), list_rprimitive) # noqa self.ll = self.env.add_local(Var('ll'), list_rprimitive) self.o = self.env.add_local(Var('o'), object_rprimitive) self.o2 = self.env.add_local(Var('o2'), object_rprimitive) self.d = self.env.add_local(Var('d'), dict_rprimitive) self.b = self.env.add_local(Var('b'), bool_rprimitive) self.t = self.env.add_local(Var('t'), RTuple([int_rprimitive, bool_rprimitive])) self.tt = self.env.add_local( Var('tt'), RTuple( [RTuple([int_rprimitive, bool_rprimitive]), bool_rprimitive])) ir = ClassIR('A', 'mod') ir.attributes = OrderedDict([('x', bool_rprimitive), ('y', int_rprimitive)]) compute_vtable(ir) ir.mro = [ir] self.r = self.env.add_local(Var('r'), RInstance(ir)) self.context = EmitterContext(NameGenerator([['mod']])) self.emitter = Emitter(self.context, self.env) self.declarations = Emitter(self.context, self.env) self.visitor = FunctionEmitterVisitor(self.emitter, self.declarations, 'prog.py', 'prog')
def deserialize(cls, data: JsonDict, ctx: DeserMaps) -> 'FuncIR': return FuncIR( FuncDecl.deserialize(data['decl'], ctx), [], Environment(), data['line'], data['traceback_name'], )
def __init__(self, context: EmitterContext, env: Optional[Environment] = None) -> None: self.context = context self.names = context.names self.env = env or Environment() self.fragments = [] # type: List[str] self._indent = 0
def __init__( self, current_module: str, mapper: Mapper, ) -> None: self.current_module = current_module self.mapper = mapper self.environment = Environment() self.blocks = [] # type: List[BasicBlock] # Stack of except handler entry blocks self.error_handlers = [None] # type: List[Optional[BasicBlock]]
def setUp(self) -> None: self.env = Environment() self.n = self.env.add_local(Var('n'), IntRType()) self.m = self.env.add_local(Var('m'), IntRType()) self.k = self.env.add_local(Var('k'), IntRType()) self.l = self.env.add_local(Var('l'), ListRType()) self.ll = self.env.add_local(Var('ll'), ListRType()) self.o = self.env.add_local(Var('o'), ObjectRType()) self.o2 = self.env.add_local(Var('o2'), ObjectRType()) self.d = self.env.add_local(Var('d'), DictRType()) self.b = self.env.add_local(Var('b'), BoolRType()) self.context = EmitterContext() self.emitter = Emitter(self.context, self.env) self.declarations = Emitter(self.context, self.env) self.visitor = FunctionEmitterVisitor(self.emitter, self.declarations)
def __init__(self, types: Dict[Expression, Type], mapper: Mapper) -> None: self.types = types self.environment = Environment() self.environments = [self.environment] self.blocks = [] # type: List[List[BasicBlock]] self.functions = [] # type: List[FuncIR] self.classes = [] # type: List[ClassIR] self.targets = [] # type: List[Register] # These lists operate as stack frames for loops. Each loop adds a new # frame (i.e. adds a new empty list [] to the outermost list). Each # break or continue is inserted within that frame as they are visited # and at the end of the loop the stack is popped and any break/continue # gotos have their targets rewritten to the next basic block. self.break_gotos = [] # type: List[List[Goto]] self.continue_gotos = [] # type: List[List[Goto]] self.mapper = mapper self.imports = [] # type: List[str] self.current_module_name = None # type: Optional[str]
def setUp(self) -> None: self.env = Environment() self.n = self.env.add_local(Var('n'), int_rprimitive) self.context = EmitterContext(NameGenerator([['mod']])) self.emitter = Emitter(self.context, self.env)
def setUp(self) -> None: self.var = Var('arg') self.arg = RuntimeArg('arg', int_rprimitive) self.env = Environment() self.reg = self.env.add_local(self.var, int_rprimitive) self.block = BasicBlock(0)
def generate_class(cl: ClassIR, module: str, emitter: Emitter) -> None: """Generate C code for a class. This is the main entry point to the module. """ name = cl.name name_prefix = cl.name_prefix(emitter.names) fullname = '{}.{}'.format(module, name) setup_name = new_name = clear_name = dealloc_name = '0' traverse_name = getseters_name = vtable_name = '0' if not cl.is_trait: setup_name = '{}_setup'.format(name_prefix) new_name = '{}_new'.format(name_prefix) traverse_name = '{}_traverse'.format(name_prefix) clear_name = '{}_clear'.format(name_prefix) dealloc_name = '{}_dealloc'.format(name_prefix) getseters_name = '{}_getseters'.format(name_prefix) vtable_name = '{}_vtable'.format(name_prefix) methods_name = '{}_methods'.format(name_prefix) base_arg = "&{}".format( emitter.type_struct_name(cl.base)) if cl.base and not cl.traits else "0" def emit_line() -> None: emitter.emit_line() emit_line() generate_object_struct(cl, emitter) emit_line() # If there is a __init__ method, generate a function for tp_init and # extract the args (which we'll use for the native constructor) init_fn = cl.get_method('__init__') if init_fn: init_name = '{}_init'.format(name_prefix) init_args = init_fn.args[1:] generate_init_for_class(cl, init_name, init_fn, emitter) else: init_name = '0' init_args = [] call_fn = cl.get_method('__call__') call_name = '{}{}'.format(PREFIX, call_fn.cname(emitter.names)) if call_fn else '0' if not cl.is_trait: emitter.emit_line('static PyObject *{}(void);'.format(setup_name)) # TODO: Use RInstance ctor = FuncIR(cl.name, None, module, FuncSignature(init_args, object_rprimitive), [], Environment()) emitter.emit_line(native_function_header(ctor, emitter) + ';') emit_line() generate_new_for_class(cl, new_name, vtable_name, setup_name, emitter) emit_line() generate_traverse_for_class(cl, traverse_name, emitter) emit_line() generate_clear_for_class(cl, clear_name, emitter) emit_line() generate_dealloc_for_class(cl, dealloc_name, clear_name, emitter) emit_line() generate_native_getters_and_setters(cl, emitter) vtable_name = generate_vtables(cl, vtable_name, emitter) emit_line() generate_getseter_declarations(cl, emitter) emit_line() generate_getseters_table(cl, getseters_name, emitter) emit_line() generate_methods_table(cl, methods_name, emitter) emit_line() emitter.emit_line(textwrap.dedent("""\ static PyTypeObject {type_struct} = {{ PyVarObject_HEAD_INIT(NULL, 0) "{fullname}", /* tp_name */ sizeof({struct_name}), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor){dealloc_name}, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ {tp_call}, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 0, /* tp_doc */ (traverseproc){traverse_name}, /* tp_traverse */ (inquiry){clear_name}, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ {methods_name}, /* tp_methods */ 0, /* tp_members */ {getseters_name}, /* tp_getset */ {base_arg}, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ {init_name}, /* tp_init */ 0, /* tp_alloc */ {new_name}, /* tp_new */ }};\ """).format(type_struct=emitter.type_struct_name(cl), struct_name=cl.struct_name(emitter.names), fullname=fullname, traverse_name=traverse_name, clear_name=clear_name, dealloc_name=dealloc_name, tp_call=call_name, new_name=new_name, methods_name=methods_name, getseters_name=getseters_name, init_name=init_name, base_arg=base_arg, )) emitter.emit_line() if not cl.is_trait: generate_setup_for_class(cl, setup_name, vtable_name, emitter) emitter.emit_line() generate_constructor_for_class(cl, ctor, init_fn, setup_name, vtable_name, emitter) emitter.emit_line() generate_getseters(cl, emitter)
def generate_class(cl: ClassIR, module: str, emitter: Emitter) -> None: """Generate C code for a class. This is the main entry point to the module. """ name = cl.name fullname = '{}.{}'.format(module, name) new_name = '{}_new'.format(name) traverse_name = '{}_traverse'.format(name) clear_name = '{}_clear'.format(name) dealloc_name = '{}_dealloc'.format(name) getseters_name = '{}_getseters'.format(name) vtable_name = '{}_vtable'.format(name) def emit_line() -> None: emitter.emit_line() # Use dummy empty __init__ for now. # TODO: Use UserRType init = FuncIR(cl.name, [], ObjectRType(), [], Environment()) emitter.emit_line(native_function_header(init) + ';') emit_line() generate_object_struct(cl, emitter) emit_line() generate_new_for_class(cl, new_name, vtable_name, emitter) emit_line() generate_traverse_for_class(cl, traverse_name, emitter) emit_line() generate_clear_for_class(cl, clear_name, emitter) emit_line() generate_dealloc_for_class(cl, dealloc_name, clear_name, emitter) emit_line() generate_native_getters_and_setters(cl, emitter) generate_vtable(cl, vtable_name, emitter) emit_line() generate_getseter_declarations(cl, emitter) emit_line() generate_getseters_table(cl, getseters_name, emitter) emit_line() emitter.emit_line(textwrap.dedent("""\ static PyTypeObject {type_struct} = {{ PyVarObject_HEAD_INIT(NULL, 0) "{fullname}", /* tp_name */ sizeof({struct_name}), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor){dealloc_name}, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 0, /* tp_doc */ (traverseproc){traverse_name}, /* tp_traverse */ (inquiry){clear_name}, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ {getseters_name}, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ {new_name}, /* tp_new */ }};\ """).format(type_struct=type_struct_name(cl.name), struct_name=cl.struct_name, fullname=fullname, traverse_name=traverse_name, clear_name=clear_name, dealloc_name=dealloc_name, new_name=new_name, getseters_name=getseters_name)) emitter.emit_line() generate_constructor_for_class(cl, new_name, vtable_name, emitter) emitter.emit_line() generate_getseters(cl, emitter)
def setUp(self) -> None: self.env = Environment() self.n = self.env.add_local(Var('n'), IntRType()) self.context = EmitterContext() self.emitter = Emitter(self.context, self.env)
def enter(self) -> None: self.environment = Environment() self.environments.append(self.environment) self.blocks.append([]) self.new_block()
def setUp(self) -> None: self.var = Var('arg') self.arg = RuntimeArg('arg', IntRType()) self.env = Environment() self.reg = self.env.add_local(self.var, IntRType()) self.block = BasicBlock(Label(0))