From: Stefan Behnel Date: Thu, 13 Jan 2011 16:12:55 +0000 (+0100) Subject: fix ticket #644: infer type of C-API optimised methods of builtin types as Python... X-Git-Tag: 0.14.1rc0~15 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=3ac5fb86833de2831e72bd368fab6b6f1fb03ec2;p=cython.git fix ticket #644: infer type of C-API optimised methods of builtin types as Python object instead of C function --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 688a5091..93eba7cc 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -3356,7 +3356,14 @@ class AttributeNode(ExprNode): elif self.analyse_as_unbound_cmethod(env): return self.entry.type else: - self.analyse_attribute(env, obj_type = self.obj.infer_type(env)) + obj_type = self.obj.infer_type(env) + self.analyse_attribute(env, obj_type = obj_type) + if obj_type.is_builtin_type and self.type.is_cfunction: + # special case: C-API replacements for C methods of + # builtin types cannot be inferred as C functions as + # that would prevent their use as bound methods + self.type = py_object_type + return py_object_type return self.type def analyse_target_declaration(self, env): diff --git a/tests/run/type_inference.pyx b/tests/run/type_inference.pyx index 74e14490..e36e43ba 100644 --- a/tests/run/type_inference.pyx +++ b/tests/run/type_inference.pyx @@ -199,6 +199,15 @@ def builtin_type_operations(): T2 = () * 2 assert typeof(T2) == "tuple object", typeof(T2) +def builtin_type_methods(): + """ + >>> builtin_type_methods() + """ + l = [] + assert typeof(l) == 'list object', typeof(l) + append = l.append + assert typeof(append) == 'Python object', typeof(append) + cdef int func(int x): return x+1