Commit 4b64c5b0 authored by Vitja Makarov's avatar Vitja Makarov

Merge branch 'master' of github.com:vitek/cython

parents ff94e372 6e2e7a56
......@@ -1302,6 +1302,9 @@ class NameNode(AtomicExprNode):
# Unfortunately the type attribute of type objects
# is used for the pointer to the type they represent.
return type_type
elif self.entry.type.is_cfunction:
# special case: referring to a C function must return its pointer
return PyrexTypes.CPtrType(self.entry.type)
else:
return self.entry.type
......@@ -3360,7 +3363,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):
......
......@@ -199,6 +199,28 @@ 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)
append(1)
assert l == [1], str(l)
cdef int func(int x):
return x+1
def c_functions():
"""
>>> c_functions()
"""
f = func
assert typeof(f) == 'int (*)(int)', typeof(f)
assert 2 == f(1)
def cascade():
"""
>>> cascade()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment