Пример #1
0
    def visit_FuncCall(self, node):
        type = self.type
        opcode = node.name.name
        args = self.visits(node.args.exprs) if node.args else []

        if opcode == "list":
            return args
        elif not type and not ops.is_void(opcode):
            error(
                node, "Expected a type for sub-expression "
                "(add a cast or assignment)")
        elif not hasattr(self.builder, opcode):
            if opcode in self.mod.functions:
                func = self.mod.get_function(opcode)
                return self.builder.call(type, func, args)

            # error(node, "No opcode %s" % (opcode,))
            op = Op(opcode, type or types.Opaque, args)
            self.builder.emit(op)
            return op

        buildop = getattr(self.builder, opcode)
        if ops.is_void(opcode):
            return buildop(*args)
        else:
            return buildop(type or types.Opaque, *args)
Пример #2
0
    def visit_FuncCall(self, node):
        type = self.type
        opcode = node.name.name
        args = self.visits(node.args.exprs) if node.args else []

        if opcode == "list":
            return args
        elif not type and not ops.is_void(opcode):
            error(node, "Expected a type for sub-expression "
                        "(add a cast or assignment)")
        elif not hasattr(self.builder, opcode):
            if opcode in self.mod.functions:
                func = self.mod.get_function(opcode)
                return self.builder.call(type, func, args)

            # error(node, "No opcode %s" % (opcode,))
            op = Op(opcode, type or types.Opaque, args)
            self.builder.emit(op)
            return op

        buildop = getattr(self.builder, opcode)
        if ops.is_void(opcode):
            return buildop(*args)
        else:
            return buildop(type or types.Opaque, *args)
Пример #3
0
    def _op(op):
        """Helper to create Builder methods"""
        def _process(self, ty, args=None, result=None, **metadata):
            if args is None:
                args = []
            assert ty is not None
            assert isinstance(args, list), args
            assert not any(arg is None for arg in flatten(args)), args
            result = Op(op, ty, args, result)
            if metadata:
                result.add_metadata(metadata)
            self._insert_op(result)
            return result

        def _process_void(self, *args, **kwds):
            result = kwds.pop('result', None)
            op = _process(self, types.Void, list(args), result)
            if kwds:
                op.add_metadata(kwds)
            return op

        if ops.is_void(op):
            build_op = _process_void
        else:
            build_op = _process

        if config.op_verify:
            build_op = op_verifier(build_op)

        return build_op
Пример #4
0
    def _op(op):
        """Helper to create Builder methods"""
        def _process(self, ty, args=None, result=None, **metadata):
            if args is None:
                args = []
            assert ty is not None
            assert isinstance(args, list), args
            assert not any(arg is None for arg in flatten(args)), args
            result = Op(op, ty, args, result)
            if metadata:
                result.add_metadata(metadata)
            self._insert_op(result)
            return result

        def _process_void(self, *args, **kwds):
            result = kwds.pop('result', None)
            op = _process(self, types.Void, list(args), result)
            if kwds:
                op.add_metadata(kwds)
            return op

        if ops.is_void(op):
            build_op = _process_void
        else:
            build_op = _process

        if config.op_verify:
            build_op = op_verifier(build_op)

        return build_op
Пример #5
0
    def visit_FuncCall(self, node):
        type = self.type
        opcode = node.name.name
        args = self.visits(node.args.exprs) if node.args else []

        if opcode == "list":
            return args
        elif not type and not ops.is_void(opcode):
            error(node, "Expected a type for sub-expression "
                        "(add a cast or assignment)")
        elif not hasattr(self.builder, opcode):
            error(node, "No opcode %s" % (opcode,))

        buildop = getattr(self.builder, opcode)
        if ops.is_void(opcode):
            return buildop(*args)
        else:
            return buildop(type or "Unset", args)
Пример #6
0
    def visit_FuncCall(self, node):
        type = self.type
        opcode = node.name.name
        args = self.visits(node.args.exprs) if node.args else []

        if opcode == "list":
            return args
        elif not type and not ops.is_void(opcode):
            error(
                node, "Expected a type for sub-expression "
                "(add a cast or assignment)")
        elif not hasattr(self.builder, opcode):
            if opcode in self.mod.functions:
                return self.builder.call(type,
                                         [self.mod.get_function(opcode), args])
            error(node, "No opcode %s" % (opcode, ))

        buildop = getattr(self.builder, opcode)
        if ops.is_void(opcode):
            return buildop(*args)
        else:
            return buildop(type or "Unset", args)
Пример #7
0
    def _op(op):
        """Helper to create Builder methods"""
        def _process(self, ty, args, result=None):
            assert ty is not None
            # args = nestedmap(make_arg, args)
            result = Op(op, ty, args, result)
            self._insert_op(result)
            return result

        if ops.is_void(op):
            def build_op(self, *args, **kwds):
                return _process(self, types.Void, args, kwds.pop('result', None))
        else:
            build_op = _process

        return build_op
Пример #8
0
    def _op(op):
        """Helper to create Builder methods"""
        def _process(self, ty, args, result=None):
            assert ty is not None
            # args = nestedmap(make_arg, args)
            result = Op(op, ty, args, result)
            self._insert_op(result)
            return result

        if ops.is_void(op):

            def build_op(self, *args, **kwds):
                return _process(self, types.Void, args,
                                kwds.pop('result', None))
        else:
            build_op = _process

        return build_op
Пример #9
0
def resolve_context(func, env):
    """Reduce typesets in context to concrete types"""
    context = env['flypy.typing.context']

    for op, typeset in context.items():
        if typeset:
            typeset = context[op]
            try:
                ty = reduce(typejoin, typeset)
            except TypeError as e:
                raise TypeError(
                    "Cannot type-join types for op %s: %s" % (op, e))

            context[op] = ty

        elif isinstance(op, ir.Op) and not ops.is_void(op.opcode):
            print(func)
            raise TypeError("op %s has no type in function %s" % (op, func.name))
Пример #10
0
def resolve_context(func, env):
    """Reduce typesets in context to concrete types"""
    context = env['flypy.typing.context']

    for op, typeset in context.iteritems():
        if typeset:
            typeset = context[op]
            try:
                ty = reduce(typejoin, typeset)
            except TypeError, e:
                raise TypeError("Cannot type-join types for op %s: %s" %
                                (op, e))

            context[op] = ty

        elif isinstance(op, ir.Op) and not ops.is_void(op.opcode):
            print(func)
            raise TypeError("op %s has no type in function %s" %
                            (op, func.name))
Пример #11
0
 def insert(self, opcode, *args):
     type = types.Void if ops.is_void(opcode) else types.Opaque
     op = Op(opcode, type, list(args))
     op.add_metadata({'lineno': self.lineno})
     self.builder.emit(op)
     return op
Пример #12
0
def gen_builder_methods():
    """Generate code for pykit.ir.builder operations"""
    print("""
    #===------------------------------------------------------------------===
    # Generated by pykit.utils._generate
    #===------------------------------------------------------------------===
    """)

    names = {
        ops.List: 'lst',
        ops.Value: 'value',
        ops.Const: 'const',
        ops.Any: 'any',
        ops.Obj: 'obj'
    }

    for lineno, op in order:
        if op[0].isupper():
            print("    %-20s = _const(ops.%s)" % (op, op))
        else:
            counts = defaultdict(int)
            params = []
            args = []
            stmts = []

            if not ops.is_void(op):
                params.append("returnType")

            for s in ops.op_syntax[op]:
                if s == ops.Star:
                    params.append('*args')
                    args.append('list(args)')
                else:
                    param = "%s%d" % (names[s], counts[s])
                    params.append(param)
                    args.append(param)

                    if s == ops.List:
                        ty = "list"
                    elif s == ops.Value:
                        ty = "Value"
                    elif s == ops.Const:
                        ty = "Const"
                    else:
                        continue

                    stmts.append("assert isinstance(%s, %s)" % (param, ty))

                counts[s] += 1

            params = ", ".join(params) + "," if params else ""
            args = ", ".join(args)
            if not ops.is_void(op):
                stmts.append('assert returnType is not None')
            else:
                stmts.append('returnType = types.Void')

            d = {
                'op': op, 'params': params, 'args': args,
                'stmts': '\n        '.join(stmts),
            }

            print("""
    def %(op)s(self, %(params)s **kwds):
        %(stmts)s
        register = kwds.pop('result', None)
        op = Op('%(op)s', returnType, [%(args)s], register, metadata=kwds)
        if config.op_verify:
            verify_op_syntax(op)
        self._insert_op(op)
        return op""" % d)
Пример #13
0
 def insert(self, opcode, *args):
     type = types.Void if ops.is_void(opcode) else types.Opaque
     op = Op(opcode, type, list(args))
     op.add_metadata({'lineno': self.lineno})
     self.builder.emit(op)
     return op