From d3982ce7e1349450878912e1f732ae06c1667567 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Thu, 25 Feb 2010 13:08:20 +0100 Subject: [PATCH] safety fix --- Cython/Compiler/Optimize.py | 11 +++++++---- tests/run/charptr_len.pyx | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Cython/Compiler/Optimize.py b/Cython/Compiler/Optimize.py index c3730cbe..45642a57 100644 --- a/Cython/Compiler/Optimize.py +++ b/Cython/Compiler/Optimize.py @@ -1205,10 +1205,6 @@ class OptimizeBuiltinCalls(Visitor.EnvTransform): ]) def _handle_simple_function_len(self, node, pos_args): - # note: this only works because we already replaced len() by - # PyObject_Length() which returns a Py_ssize_t instead of a - # Python object, so we can return a plain size_t instead - # without caring about Python object conversion etc. if len(pos_args) != 1: self._error_wrong_arg_count('len', node, pos_args, 1) return node @@ -1217,6 +1213,13 @@ class OptimizeBuiltinCalls(Visitor.EnvTransform): arg = arg.arg if not arg.type.is_string: return node + if not node.type.is_numeric: + # this optimisation only works when we already replaced + # len() by PyObject_Length() which returns a Py_ssize_t + # instead of a Python object, so we can return a plain + # size_t instead without caring about Python object + # conversion etc. + return node node = ExprNodes.PythonCapiCallNode( node.pos, "strlen", self.Pyx_strlen_func_type, args = [arg], diff --git a/tests/run/charptr_len.pyx b/tests/run/charptr_len.pyx index 84c94008..f1372ec0 100644 --- a/tests/run/charptr_len.pyx +++ b/tests/run/charptr_len.pyx @@ -3,6 +3,10 @@ __doc__ = """ 7 >>> lentest_char_c() 7 +>>> lentest_char_c_short() +7 +>>> lentest_char_c_float() +7.0 >>> lentest_uchar() 7 @@ -36,6 +40,20 @@ def lentest_char_c(): cdef Py_ssize_t l = len(s) return l +@cython.test_assert_path_exists( + "//PythonCapiCallNode", + ) +def lentest_char_c_short(): + cdef short l = len(s) + return l + +@cython.test_assert_path_exists( + "//PythonCapiCallNode", + ) +def lentest_char_c_float(): + cdef float l = len(s) + return l + @cython.test_assert_path_exists( "//PythonCapiCallNode", -- 2.26.2