Example #1
0
 def visit_Assign(self, node):
     if not has_parent_node(node, bases.TastyCBase.protocol_name):
         return node
     node.value = self.visit(node.value)
     if not node.value:
         return
     return node
Example #2
0
 def visit_ClassDef(self, node):
     if __debug__:
         state.log.debug("transform %s", dump(node, True, True))
     if not has_parent_node(node, bases.TastyCBase.protocol_name):
         return node
     self.generic_visit(node)
     return node
Example #3
0
    def visit_If(self, node):
        if not bases.has_parent_node(node, bases.TastyCBase.protocol_name):
            return

        if isinstance(node.test, Attribute):
            symbol_record = self.symbol_table.identify(get_fqnn(node.test))
            node.test.return_info = (symbol_record["kwargs"], )
        else:
            self.visit(node.test)
            if not hasattr(node.test, "return_info"):
                raise NotImplementedError(
                    "Inferency of test component of 'if' code not implemented"
                    % type(node.test))

        for i in node.body:
            self.visit(i)
        while True:
            else_ = node.orelse
            num_items = len(else_)
            if num_items == 1:
                if isinstance(else_[0], If):
                    node = else_[0]
                    for i in node.body:
                        self.visit(i)
                else:
                    for i in else_:
                        self.visit(i)
                    break
            else:
                break
Example #4
0
    def visit_If(self, node):
        if __debug__:
            state.log.debug("\npass dispatch %s", dump(node, True, True))
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return

        for i in node.body:
            self.visit(i)
Example #5
0
    def visit_Expr(self, node):
        if __debug__:
            state.log.debug("\npass dispatch %s", dump(node))

        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return

        self.visit(node.value)
        assert hasattr(node, "value")
Example #6
0
    def visit_AugAssign(self, node):
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return node

        assert not isinstance(node.op, LShift)

        if self.check_remove(node):
            return
        return node
Example #7
0
    def visit_Expr(self, node):
        if __debug__:
            state.log.debug("transform %s", dump(node, True, True))
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return node

        node.value = self.visit(node.value)
        if not node.value:
            return
        return node
Example #8
0
    def visit_Call(self, node):
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return node

        if __debug__:
            state.log.debug("\nprune %s", dump(node))

        if node.methodname in ("output", "setup_output", "input"):
            return node

        if self.check_remove(node):
            return
        return node
Example #9
0
    def visit_For(self, node):
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return node

        new_body = list()
        for i in node.body:
            tmp = self.visit(i)
            if tmp:
                new_body.append(tmp)
        node.body = new_body

        if not node.body:
            return
        return node
Example #10
0
    def visit_If(self, node):
        if __debug__:
            state.log.debug("transform %s", dump(node, True, True))
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return node

        new_body = list()
        for i in node.body:
            tmp = self.visit(i)
            if tmp:
                new_body.append(tmp)
        node.body = new_body
        if not new_body:
            return
        return node
Example #11
0
    def visit_If(self, node):
        # state.log.debug("\ncosts %s", dump(node, True, True))
        if not bases.has_parent_node(node, bases.TastyCBase.protocol_name):
            return

        if isinstance(node.test, Attribute) or isinstance(node.test, Subscript):
            return_rec = node.test.return_info[0]
            self.cost_obj(
                **return_rec["type"].calc_costs("__nonzero__", tuple(), (return_rec["bitlen"],), (return_rec["dim"],),
                                                node.role,
                                                node.passive, self.precompute))
        else:
            self.visit(node.test)

        for i in node.body:
            self.visit(i)
Example #12
0
    def visit_Call(self, node):
        if __debug__:
            state.log.debug("transform %s", dump(node))
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return node

        if node.call_type == CALL_TYPE_CTOR:
            return self.visit_Constructor(node)
        elif node.call_type == CALL_TYPE_TASTY_FUNC_CALL:
            return self.visit_tasty_func_call(node)
        elif node.call_type == CALL_TYPE_TASTY_FUNC_CTOR:
            return self.visit_tasty_func_ctor(node)
        elif node.call_type == CALL_TYPE_METHOD:
            return self.visit_Method(node)
        else:
            raise ValueError("found unsupported value %r for node.call_type" %
                             node.call_type)
Example #13
0
    def visit_Assign(self, node):
        if __debug__:
            state.log.debug("\npass dispatch pre %s", dump(node, True, True))
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return

        self.visit(node.value)

        if isinstance(node.value, Attribute):
            symbol_record = self.symbol_table.identify(get_fqnn(node.value))
            symbol_record[
                "bitmask"] = node.bitmask = Value.S_ONLINE if node.role else Value.C_ONLINE
        elif isinstance(node.value, Num):
            node.bitmask = 15
        else:
            node.bitmask = node.value.bitmask

        assert hasattr(node, "bitmask")
Example #14
0
    def visit_Call(self, node):
        """
        """

        if not bases.has_parent_node(node, bases.TastyCBase.protocol_name):
            return

        if node.call_type == CALL_TYPE_CTOR:
            self.visit_constructor(node)
        elif node.call_type == CALL_TYPE_TASTY_FUNC_CALL:
            self.visit_tasty_function_call(node)
        elif node.call_type == CALL_TYPE_TASTY_FUNC_CTOR:
            self.visit_tasty_function_ctor(node)
        elif node.call_type == CALL_TYPE_METHOD:
            self.visit_method(node)
        elif node.call_type == CALL_TYPE_CONVERSION:
            self.visit_conversion(node)
        else:
            raise ValueError("found unsupported value %r for node.call_type" % node.call_type)
Example #15
0
    def visit_Subscript(self, node):
        if not has_parent_node(node, self.protocol_name):
            return
        if __debug__:
            state.log.debug("\ninfer %d %s", id(node), dump(node, True, True))

        fqnn = get_fqnn(node.value)
        symbol_record = self.symbol_table.identify(fqnn)
        kwargs = symbol_record["kwargs"]
        node_type = kwargs["type"]
        node.initial_info = kwargs
        node.input_types = tuple()
        node.bit_lengths = (kwargs["bitlen"], )
        node.dims = (kwargs["dim"], )
        node.signeds = (kwargs["signed"], )
        node.methodname = "__getitem__"
        node.return_info = node_type.returns(node.methodname, node.input_types,
                                             node.bit_lengths, node.dims,
                                             node.signeds)
Example #16
0
    def visit_Assign(self, node):
        if not has_parent_node(node, self.protocol_name):
            return
        if __debug__:
            state.log.debug("\ninfer %s", dump(node, True, True))

        value_node = node.value
        try:
            annotate_node(value_node)
        except (NotImplementedError, UnknownSymbolError):
            self.visit(value_node)

        if __debug__:
            state.log.debug("\nactual node %s", dump(node, True, True))
        assert hasattr(value_node, "return_info")

        for target in node.targets:
            handle_target_node(self, target, value_node)

        self.symbol_table.dump()
Example #17
0
    def visit_Assign(self, node):
        if not has_parent_node(node, bases.TastyCBase.protocol_name):
            return node
        if __debug__:
            state.log.debug("prune %s", dump(node, True, True))

        node.value = self.visit(node.value)
        if not node.value or self.check_remove(node):
            for target in node.targets:
                if (isinstance(target, Attribute)
                        or isinstance(target, Subscript)):
                    self.symbol_table.remove_symbol(get_fqnn(target))
                elif isinstance(target, Tuple):
                    for item in target.elts:
                        self.symbol_table.remove_symbol(get_fqnn(item))
                elif isinstance(target, Name):
                    self.symbol_table.remove_symbol(get_fqnn(target))
                else:
                    raise NotImplementedError("pruning of assign " \
                        "for node %r not yet implemented" % type(target))
            return
        return node
Example #18
0
 def visit_Compare(self, node):
     if not has_parent_node(node, bases.TastyCBase.protocol_name):
         return node
     return node
Example #19
0
 def visit_Compare(self, node):
     if __debug__:
         state.log.debug("\npass dispatch %s", dump(node, True, True))
     if not has_parent_node(node, bases.TastyCBase.protocol_name):
         return
     self.check_affects(node)