コード例 #1
0
    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')
コード例 #2
0
ファイル: func_ir.py プロジェクト: david-knigge/mypy
 def deserialize(cls, data: JsonDict, ctx: DeserMaps) -> 'FuncIR':
     return FuncIR(
         FuncDecl.deserialize(data['decl'], ctx),
         [],
         Environment(),
         data['line'],
         data['traceback_name'],
     )
コード例 #3
0
 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
コード例 #4
0
ファイル: ir_builder.py プロジェクト: anygitdata/ubn-nltest
 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]]
コード例 #5
0
 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)
コード例 #6
0
    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]
コード例 #7
0
ファイル: test_emit.py プロジェクト: anygitdata/ubn-nltest
 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)
コード例 #8
0
 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)
コード例 #9
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)
コード例 #10
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
    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)
コード例 #11
0
ファイル: test_emit.py プロジェクト: msullivan/mypyc
 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)
コード例 #12
0
 def enter(self) -> None:
     self.environment = Environment()
     self.environments.append(self.environment)
     self.blocks.append([])
     self.new_block()
コード例 #13
0
 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))