def test_cf_10(self):
     astree = self.run_pipeline(cf_10)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(names), 2)
     self.assertEqual(len(nums), 2)
 def test_cf_10(self):
     astree = self.run_pipeline(cf_10)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(names), 2)
     self.assertEqual(len(nums), 2)
 def test_cf_6(self):
     astree = self.run_pipeline(cf_6)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(names), 0)
     self.assertEqual(len(nums), 1)
     self.assertEqual(nums[0].n, (1 + 2))
 def test_cf_6(self):
     astree = self.run_pipeline(cf_6)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(names), 0)
     self.assertEqual(len(nums), 1)
     self.assertEqual(nums[0].n, (1 + 2))
 def test_cf_7(self):
     astree = self.run_pipeline(cf_7)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     nums = list(self.iter_all(astree, ast.Num))
     # No removal of constant assignment
     self.assertEqual(len(names), 1)
     self.assertEqual(len(nums), 2)
     self.assertEqual(nums[1].n, (1 + 2))
 def test_cf_7(self):
     astree = self.run_pipeline(cf_7)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     nums = list(self.iter_all(astree, ast.Num))
     # No removal of constant assignment
     self.assertEqual(len(names), 1)
     self.assertEqual(len(nums), 2)
     self.assertEqual(nums[1].n, (1 + 2))
Exemple #7
0
    def visit_CoercionNode(self, node):
        if not isinstance(node, nodes.CoercionNode):
            # CoercionNode.__new__ returns the node to be coerced if it doesn't
            # need coercion
            return node

        node_type = node.node.type
        dst_type = node.dst_type
        if __debug__ and self.env and self.env.debug_coercions:
            logger.debug('coercion: %s --> %s\n%s', node_type, dst_type,
                         utils.pformat_ast(node))

        # TODO: the below is a problem due to implicit string <-> int coercions!
        if (node_type.is_string and dst_type.is_numeric
                and not (node_type.is_pointer or node_type.is_null)):
            if dst_type.typename in ('char', 'uchar'):
                raise error.NumbaError(
                    node,
                    "Conversion from string to (u)char not yet supported")
            result = self.str_to_int(dst_type, node)
        elif self.nopython and (is_obj(node_type) ^ is_obj(dst_type)):
            raise error.NumbaError(
                node, "Cannot coerce to or from object in "
                "nopython context")
        elif is_obj(node.dst_type) and not is_obj(node_type):
            node = nodes.ObjectTempNode(
                nodes.CoerceToObject(node.node, node.dst_type, name=node.name))
            result = self.visit(node)
        elif is_obj(node_type) and not is_obj(node.dst_type):
            node = nodes.CoerceToNative(node.node,
                                        node.dst_type,
                                        name=node.name)
            result = self.visit(node)
        elif node_type.is_null:
            if not dst_type.is_pointer:
                raise error.NumbaError(
                    node.node, "NULL must be cast or implicitly "
                    "coerced to a pointer type")
            result = self.visit(nodes.NULL.coerce(dst_type))
        elif node_type.is_numeric and dst_type.is_bool:
            to_bool = ast.Compare(node.node, [ast.NotEq()],
                                  [nodes.const(0, node_type)])
            to_bool = nodes.typednode(to_bool, bool_)
            result = self.visit(to_bool)
        else:
            self.generic_visit(node)

            if dst_type == node.node.type:
                result = node.node
            else:
                result = node

        if __debug__ and self.env and self.env.debug_coercions:
            logger.debug('result = %s', utils.pformat_ast(result))

        return result
 def test_cf_8(self):
     astree = self.run_pipeline(cf_8)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(names), 3)
     self.assertEqual(len(nums), 3)
     for name in names:
         self.assertEqual(name.id, 'N')
     for i, num in enumerate(nums):
         self.assertEqual(num.n, i + 1)
 def test_cf_8(self):
     astree = self.run_pipeline(cf_8)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(names), 3)
     self.assertEqual(len(nums), 3)
     for name in names:
         self.assertEqual(name.id, 'N')
     for i, num in enumerate(nums):
         self.assertEqual(num.n, i + 1)
Exemple #10
0
    def visit_CoercionNode(self, node):
        if not isinstance(node, nodes.CoercionNode):
            # CoercionNode.__new__ returns the node to be coerced if it doesn't
            # need coercion
            return node

        node_type = node.node.type
        dst_type = node.dst_type
        if __debug__ and self.env and self.env.debug_coercions:
            logger.debug('coercion: %s --> %s\n%s',
                         node_type, dst_type, utils.pformat_ast(node))

        # TODO: the below is a problem due to implicit string <-> int coercions!
        if (node_type.is_string and dst_type.is_numeric and not
            (node_type.is_pointer or node_type.is_null)):
            if dst_type.typename in ('char', 'uchar'):
                raise error.NumbaError(
                    node, "Conversion from string to (u)char not yet supported")
            result = self.str_to_int(dst_type, node)
        elif self.nopython and (is_obj(node_type) ^ is_obj(dst_type)):
            raise error.NumbaError(node, "Cannot coerce to or from object in "
                                         "nopython context")
        elif is_obj(node.dst_type) and not is_obj(node_type):
            node = nodes.ObjectTempNode(nodes.CoerceToObject(
                    node.node, node.dst_type, name=node.name))
            result = self.visit(node)
        elif is_obj(node_type) and not is_obj(node.dst_type):
            node = nodes.CoerceToNative(node.node, node.dst_type,
                                        name=node.name)
            result = self.visit(node)
        elif node_type.is_null:
            if not dst_type.is_pointer:
                raise error.NumbaError(node.node,
                                       "NULL must be cast or implicitly "
                                       "coerced to a pointer type")
            result = self.visit(nodes.NULL.coerce(dst_type))
        elif node_type.is_numeric and dst_type.is_bool:
            to_bool = ast.Compare(node.node, [ast.NotEq()],
                                  [nodes.const(0, node_type)])
            to_bool = nodes.typednode(to_bool, bool_)
            result = self.visit(to_bool)
        else:
            self.generic_visit(node)

            if dst_type == node.node.type:
                result = node.node
            else:
                result = node

        if __debug__ and self.env and self.env.debug_coercions:
            logger.debug('result = %s', utils.pformat_ast(result))

        return result
Exemple #11
0
    def visit_CoercionNode(self, node):
        if not isinstance(node, nodes.CoercionNode):
            # CoercionNode.__new__ returns the node to be coerced if it doesn't
            # need coercion
            return node

        node_type = node.node.type
        dst_type = node.dst_type
        if __debug__ and self.env and self.env.debug_coercions:
            logger.debug('coercion: %s --> %s\n%s', node_type, dst_type,
                         utils.pformat_ast(node))

        if self.nopython and (is_obj(node_type) ^ is_obj(dst_type)):
            raise error.NumbaError(
                node, "Cannot coerce to or from object in "
                "nopython context")

        if is_obj(node.dst_type) and not is_obj(node_type):
            node = nodes.ObjectTempNode(
                nodes.CoerceToObject(node.node, node.dst_type, name=node.name))
            result = self.visit(node)
        elif is_obj(node_type) and not is_obj(node.dst_type):
            node = nodes.CoerceToNative(node.node,
                                        node.dst_type,
                                        name=node.name)
            result = self.visit(node)
        elif node_type.is_null:
            if not dst_type.is_pointer:
                raise error.NumbaError(
                    node.node, "NULL must be cast or implicitly "
                    "coerced to a pointer type")
            result = self.visit(nodes.NULL.coerce(dst_type))
        elif node_type.is_numeric and dst_type.is_bool:
            to_bool = ast.Compare(node.node, [ast.NotEq()],
                                  [nodes.const(0, node_type)])
            to_bool = nodes.typednode(to_bool, bool_)
            result = self.visit(to_bool)
        elif node_type.is_c_string and dst_type.is_numeric:
            # TODO: int <-> string conversions are explicit, this should not
            # TODO: be a coercion
            if self.nopython:
                node = nodes.CoercionNode(
                    function_util.external_call(
                        self.context,
                        self.llvm_module,
                        ('atol' if dst_type.is_int else 'atof'),
                        args=[node.node]),
                    dst_type,
                    name=node.name,
                )
            else:
                if dst_type.is_int:
                    cvtobj = function_util.external_call(
                        self.context,
                        self.llvm_module,
                        'PyInt_FromString' if not PY3 else 'PyLong_FromString',
                        args=[node.node, nodes.NULL,
                              nodes.const(10, int_)])
                else:
                    cvtobj = function_util.external_call(
                        self.context,
                        self.llvm_module,
                        'PyFloat_FromString',
                        args=[node.node, nodes.const(0, Py_ssize_t)])
                node = nodes.CoerceToNative(nodes.ObjectTempNode(cvtobj),
                                            dst_type,
                                            name=node.name)
            result = self.visit(node)
        else:
            self.generic_visit(node)

            if dst_type == node.node.type:
                result = node.node
            else:
                result = node

        if __debug__ and self.env and self.env.debug_coercions:
            logger.debug('result = %s', utils.pformat_ast(result))

        return result
Exemple #12
0
 def test_cf_4(self):
     astree = self.run_pipeline(cf_4)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     self.assertEqual(len(names), 1)
     self.assertEqual(names[0].id, 'True')
 def test_cf_4(self):
     astree = self.run_pipeline(cf_4)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     self.assertEqual(len(names), 1)
     self.assertEqual(names[0].id, 'True')
 def test_cf_5(self):
     astree = self.run_pipeline(cf_5)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     self.assertEqual(len(names), 1)
     self.assertEqual(names[0].id, str(1 != 2 and 3 < 4 and 5 > 8 / 9))
 def test_cf_2(self):
     astree = self.run_pipeline(cf_2)
     print utils.pformat_ast(astree)
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(nums), 1)
     self.assertEqual(nums[0].n, (1 + 2 - 3 * 4 / 5 // 6 ** 7))
 def test_cf_3(self):
     astree = self.run_pipeline(cf_3)
     print utils.pformat_ast(astree)
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(nums), 1)
     self.assertEqual(nums[0].n, (0xbad & 0xbeef | 0xcafe))
Exemple #17
0
    def visit_CoercionNode(self, node):
        if not isinstance(node, nodes.CoercionNode):
            # CoercionNode.__new__ returns the node to be coerced if it doesn't
            # need coercion
            return node

        node_type = node.node.type
        dst_type = node.dst_type
        if __debug__ and self.env and self.env.debug_coercions:
            logger.debug('coercion: %s --> %s\n%s',
                         node_type, dst_type, utils.pformat_ast(node))

        if self.nopython and is_obj(node_type):
            raise error.NumbaError(node, "Cannot coerce to or from object in "
                                         "nopython context")

        if is_obj(node.dst_type) and not is_obj(node_type):
            node = nodes.ObjectTempNode(nodes.CoerceToObject(
                    node.node, node.dst_type, name=node.name))
            result = self.visit(node)
        elif is_obj(node_type) and not is_obj(node.dst_type):
            node = nodes.CoerceToNative(node.node, node.dst_type,
                                        name=node.name)
            result = self.visit(node)
        elif node_type.is_null:
            if not dst_type.is_pointer:
                raise error.NumbaError(node.node,
                                       "NULL must be cast or implicitly "
                                       "coerced to a pointer type")
            result = self.visit(nodes.NULL.coerce(dst_type))
        elif node_type.is_numeric and dst_type.is_bool:
            to_bool = ast.Compare(node.node, [ast.NotEq()],
                                  [nodes.const(0, node_type)])
            to_bool = nodes.typednode(to_bool, bool_)
            result = self.visit(to_bool)
        elif node_type.is_c_string and dst_type.is_numeric:
            # TODO: int <-> string conversions are explicit, this should not
            # TODO: be a coercion
            if self.nopython:
                node = nodes.CoercionNode(
                    function_util.external_call(
                                self.context,
                                self.llvm_module,
                                ('atol' if dst_type.is_int else 'atof'),
                                args=[node.node]),
                    dst_type, name=node.name,)
            else:
                if dst_type.is_int:
                    cvtobj = function_util.external_call(
                                              self.context,
                                              self.llvm_module,
                                              'PyInt_FromString' if not PY3 else 'PyLong_FromString',
                                              args=[node.node, nodes.NULL,
                                                    nodes.const(10, int_)])
                else:
                    cvtobj = function_util.external_call(
                                          self.context,
                                          self.llvm_module,
                                          'PyFloat_FromString',
                                          args=[node.node,
                                                nodes.const(0, Py_ssize_t)])
                node = nodes.CoerceToNative(nodes.ObjectTempNode(cvtobj),
                                            dst_type, name=node.name)
            result = self.visit(node)
        else:
            self.generic_visit(node)

            if dst_type == node.node.type:
                result = node.node
            else:
                result = node

        if __debug__ and self.env and self.env.debug_coercions:
            logger.debug('result = %s', utils.pformat_ast(result))

        return result
Exemple #18
0
 def test_cf_2(self):
     astree = self.run_pipeline(cf_2)
     print utils.pformat_ast(astree)
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(nums), 1)
     self.assertEqual(nums[0].n, (1 + 2 - 3 * 4 / 5 // 6 ** 7))
Exemple #19
0
 def test_cf_3(self):
     astree = self.run_pipeline(cf_3)
     print utils.pformat_ast(astree)
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(nums), 1)
     self.assertEqual(nums[0].n, (0xbad & 0xbeef | 0xcafe))
Exemple #20
0
 def test_cf_5(self):
     astree = self.run_pipeline(cf_5)
     print utils.pformat_ast(astree)
     names = list(self.iter_all(astree, ast.Name))
     self.assertEqual(len(names), 1)
     self.assertEqual(names[0].id, str(1 != 2 and 3 < 4 and 5 > 8 / 9))
Exemple #21
0
 def test_cf_3(self):
     astree = self.run_pipeline(cf_3)
     print((utils.pformat_ast(astree)))
     nums = list(self.iter_all(astree, ast.Num))
     self.assertEqual(len(nums), 1)
     self.assertEqual(nums[0].n, (0xBAD & 0xBEEF | 0xCAFE))