modify sizeof() operator to return size of extension type struct
authorRobert Bradshaw <robertwb@math.washington.edu>
Fri, 23 Feb 2007 21:46:02 +0000 (13:46 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Fri, 23 Feb 2007 21:46:02 +0000 (13:46 -0800)
Cython/Compiler/ExprNodes.py
Cython/Compiler/PyrexTypes.py

index 3fdbd4891fc126dec833b270e5ef43524ea30221..34fce8621e1851a5197479df864a398fde678d2d 100644 (file)
@@ -2352,7 +2352,7 @@ class SizeofTypeNode(SizeofNode):
         base_type = self.base_type.analyse(env)
         _, arg_type = self.declarator.analyse(base_type, env)
         self.arg_type = arg_type
-        if arg_type.is_pyobject:
+        if arg_type.is_pyobject and not arg_type.is_extension_type:
             error(self.pos, "Cannot take sizeof Python object")
         elif arg_type.is_void:
             error(self.pos, "Cannot take sizeof void")
@@ -2361,7 +2361,12 @@ class SizeofTypeNode(SizeofNode):
         self.type = PyrexTypes.c_int_type
         
     def calculate_result_code(self):
-        arg_code = self.arg_type.declaration_code("")
+        if self.arg_type.is_extension_type:
+            # the size of the pointer is boring
+            # we want the size of the actual struct
+            arg_code = self.arg_type.declaration_code("", deref=1)
+        else:
+            arg_code = self.arg_type.declaration_code("")
         return "(sizeof(%s))" % arg_code
     
 
@@ -2744,14 +2749,14 @@ class CondExprNode(ExprNode):
     def compute_result_type(self, type1, type2):
         if type1 == type2:
             return type1
-        elif type1.is_pyobject or type2.is_pyobject:
-            return py_object_type
         elif type1.is_numeric and type2.is_numeric:
             return PyrexTypes.widest_numeric_type(type1, type2)
         elif type1.is_extension_type and type1.subtype_of_resolved_type(type2):
             return type2
         elif type2.is_extension_type and type2.subtype_of_resolved_type(type1):
             return type1
+        elif type1.is_pyobject or type2.is_pyobject:
+            return py_object_type
         else:
             return None
         
index aca569e9a06e8dce59ccca11a3f522781cb68c32..1b05ed59622f55bdf20008608a1a9fb46c52bc82 100644 (file)
@@ -225,7 +225,7 @@ class PyExtensionType(PyObjectType):
         return self.typeobj_cname is None and self.module_name is not None
     
     def declaration_code(self, entity_code, 
-            for_display = 0, dll_linkage = None, pyrex = 0):
+            for_display = 0, dll_linkage = None, pyrex = 0, deref = 0):
         if pyrex:
             return "%s %s" % (self.name, entity_code)
         else:
@@ -234,7 +234,10 @@ class PyExtensionType(PyObjectType):
             else:
                 base_format = "struct %s"
             base = public_decl(base_format % self.objstruct_cname, dll_linkage)
-            return "%s *%s" % (base,  entity_code)
+            if deref:
+                return "%s %s" % (base,  entity_code)
+            else:
+                return "%s *%s" % (base,  entity_code)
 
     def attributes_known(self):
         return self.scope is not None