diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 3fdbd4891fc126dec833b270e5ef43524ea30221..34fce8621e1851a5197479df864a398fde678d2d 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -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 diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index aca569e9a06e8dce59ccca11a3f522781cb68c32..1b05ed59622f55bdf20008608a1a9fb46c52bc82 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -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