ctypedef casting, more cdef extern class work
authorRobert Bradshaw <robertwb@math.washington.edu>
Sun, 21 Oct 2007 08:01:15 +0000 (01:01 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Sun, 21 Oct 2007 08:01:15 +0000 (01:01 -0700)
Cython/Compiler/ModuleNode.py
Cython/Compiler/Nodes.py
Cython/Compiler/PyrexTypes.py
Cython/Compiler/Symtab.py

index 6d533d408a96a1bcfcd06eaabdfeee53a00c4468..83c159c9fe83c9ed7de299193a7116ece87fa4db 100644 (file)
@@ -1225,7 +1225,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
         return Naming.modules_prefix + module_name.replace("_", "__").replace(".", "_")
 
     def generate_imported_module(self, module, code):
-        import_module = 0
+        import_module = module.has_extern_class
         for entry in module.cfunc_entries:
             if entry.defined_in_pxd:
                 import_module = 1
@@ -1384,14 +1384,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
 
 
     def generate_module_import_code(self, module, env, code):
-        import_module = 0
+        import_module = module.has_extern_class
         for entry in module.cfunc_entries:
             if entry.defined_in_pxd:
                 import_module = 1
         for entry in module.c_class_entries:
             if entry.defined_in_pxd:
                 import_module = 1
-        print "generate_module_import_code", module, import_module
         if import_module:
             env.use_utility_code(import_module_utility_code)
             name = self.build_module_var_name(module.qualified_name)
index b6634144d0c6de1e6a769aa9c4522bab009a06e8..ba54027b8ce48251f1de05f07384498540b6748d 100644 (file)
@@ -1509,8 +1509,9 @@ class CClassDefNode(StatNode):
                     self.module = module
             if self.module is None:
                 self.module = ModuleScope(self.module_name, None, env.context)
+                self.module.has_extern_class = 1
                 env.cimported_modules.append(self.module)
-        print [e.name for e in env.cimported_modules]
+
         if self.base_class_name:
             if self.base_class_module:
                 base_class_scope = env.find_module(self.base_class_module, self.pos)
@@ -1542,10 +1543,6 @@ class CClassDefNode(StatNode):
             api = self.api)
         scope = self.entry.type.scope
         
-        if self.module_name:
-            self.entry.defined_in_pxd = 1
-            self.module.c_class_entries.append(self.entry)
-
         if self.doc:
             if Options.embed_pos_in_docstring:
                 scope.doc = 'File: %s (starting at line %s)'%relative_position(self.pos)
index b7474288f7caa35ab4aff1c2ad19017346a9bfc6..f5067241ff6769c1d37249be2d2b960645d12bb6 100644 (file)
@@ -163,6 +163,14 @@ class CTypedefType(BaseType):
     def as_argument_type(self):
         return self
 
+    def cast_code(self, expr_code):
+        # If self is really an array (rather than pointer), we can't cast.
+        # For example, the gmp mpz_t. 
+        if self.typedef_base_type.is_ptr:
+            return self.typedef_base_type.cast_code(expr_code)
+        else:
+            return BaseType.cast_code(self, expr_code)
+    
     def __repr__(self):
         return "<CTypedefType %s>" % self.typedef_cname
     
index a35cce4fddfaf4da6c69055bf7f882984d8d61a0..65f9a11ca6961878a55f6f013b813dbfbaee57cd 100644 (file)
@@ -700,6 +700,7 @@ class ModuleScope(Scope):
         self.all_pystring_entries = []
         self.types_imported = {}
         self.pynum_entries = []
+        self.has_extern_class = 0
     
     def qualifying_scope(self):
         return self.parent_module