Fix #303 as per Lisandro's idea
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Thu, 14 May 2009 14:49:54 +0000 (16:49 +0200)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Thu, 14 May 2009 14:49:54 +0000 (16:49 +0200)
Cython/Compiler/Nodes.py
Cython/Compiler/PyrexTypes.py
Cython/Compiler/Symtab.py

index 2ff86dba7b90bfb12fbcc4e81cc2e224f66ed916..fabb38321cf039f7f0a54dd6ec711e6c2682cd14 100644 (file)
@@ -793,10 +793,17 @@ class CVarDefNode(StatNode):
             dest_scope = env
         self.dest_scope = dest_scope
         base_type = self.base_type.analyse(env)
-        if (dest_scope.is_c_class_scope
-                and self.visibility == 'public' 
-                and base_type.is_pyobject 
-                and (base_type.is_builtin_type or base_type.is_extension_type)):
+
+        # If the field is an external typedef, we cannot be sure about the type,
+        # so do conversion ourself rather than rely on the CPython mechanism (through
+        # a property; made in AnalyseDeclarationsTransform).
+        # Also, if the type is an extension type, then the CPython mechanism does
+        # not do enough type-checking for us.
+        if (dest_scope.is_c_class_scope and
+               ((self.visibility == 'public' 
+                 and base_type.is_pyobject 
+                 and (base_type.is_builtin_type or base_type.is_extension_type)
+                or (base_type.is_typedef and base_type.typedef_is_external)))):
             self.need_properties = []
             need_property = True
             visibility = 'private'
index a106c3861b9ec3372b59c40d35a0da74353e8f7d..57c20341dfe0b2f138a95b85a6f25295ada90fe5 100644 (file)
@@ -161,12 +161,15 @@ class CTypedefType(BaseType):
     #  qualified_name      string
     #  typedef_cname       string
     #  typedef_base_type   PyrexType
+    #  typedef_is_external bool
     
     is_typedef = 1
+    typedef_is_external = 0
     
-    def __init__(self, cname, base_type):
+    def __init__(self, cname, base_type, is_external=0):
         self.typedef_cname = cname
         self.typedef_base_type = base_type
+        self.typedef_is_external = is_external
     
     def resolve(self):
         return self.typedef_base_type.resolve()
index d972309f0a46bfec2935808b3c39ff1760b72dc4..2e5415ef04fecd5961b8ae0bbd69ad99f18cf637 100644 (file)
@@ -347,7 +347,7 @@ class Scope(object):
                 cname = name
             else:
                 cname = self.mangle(Naming.type_prefix, name)
-        type = PyrexTypes.CTypedefType(cname, base_type)
+        type = PyrexTypes.CTypedefType(cname, base_type, (visibility == 'extern'))
         entry = self.declare_type(name, type, pos, cname, visibility)
         type.qualified_name = entry.qualified_name
         return entry