Fixed explicit coercion of ctypedef'ed C types.
authorNikita Nemkin <nikita@nemkin.ru>
Fri, 1 Mar 2013 19:57:52 +0000 (01:57 +0600)
committerRobert Bradshaw <robertwb@gmail.com>
Sun, 3 Mar 2013 07:45:05 +0000 (23:45 -0800)
Cython/Compiler/PyrexTypes.py
tests/run/ctypedef_delegation.pyx [new file with mode: 0644]

index 91aaecb..fe8a0e5 100755 (executable)
@@ -295,9 +295,9 @@ def create_typedef_type(name, base_type, cname, is_external=0):
 class CTypedefType(BaseType):
     #
     #  Pseudo-type defined with a ctypedef statement in a
-    #  'cdef extern from' block. Delegates most attribute
-    #  lookups to the base type. ANYTHING NOT DEFINED
-    #  HERE IS DELEGATED!
+    #  'cdef extern from' block.
+    #  Delegates most attribute lookups to the base type.
+    #  (Anything not defined here or in the BaseType is delegated.)
     #
     #  qualified_name      string
     #  typedef_name        string
@@ -439,6 +439,9 @@ class CTypedefType(BaseType):
     def py_type_name(self):
         return self.typedef_base_type.py_type_name()
 
+    def can_coerce_to_pyobject(self, env):
+        return self.typedef_base_type.can_coerce_to_pyobject(env)
+
 
 class MemoryViewSliceType(PyrexType):
 
@@ -774,10 +777,9 @@ class MemoryViewSliceType(PyrexType):
 
 class BufferType(BaseType):
     #
-    #  Delegates most attribute
-    #  lookups to the base type. ANYTHING NOT DEFINED
-    #  HERE IS DELEGATED!
-
+    #  Delegates most attribute lookups to the base type.
+    #  (Anything not defined here or in the BaseType is delegated.)
+    #
     # dtype            PyrexType
     # ndim             int
     # mode             str
diff --git a/tests/run/ctypedef_delegation.pyx b/tests/run/ctypedef_delegation.pyx
new file mode 100644 (file)
index 0000000..19adfc2
--- /dev/null
@@ -0,0 +1,9 @@
+
+ctypedef char* LPSTR
+
+def typedef_delegation():
+    """
+    >>> typedef_delegation()
+    """
+    cdef LPSTR c_str = b"ascii"
+    assert <bytes>c_str == b"ascii"