])
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
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],
7
>>> lentest_char_c()
7
+>>> lentest_char_c_short()
+7
+>>> lentest_char_c_float()
+7.0
>>> lentest_uchar()
7
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",