From 204e28917852d05a8a2badccfbaad2057dbff529 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Fri, 23 Feb 2007 13:46:02 -0800 Subject: [PATCH] modify sizeof() operator to return size of extension type struct --- Cython/Compiler/ExprNodes.py | 13 +++++++++---- Cython/Compiler/PyrexTypes.py | 7 +++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 3fdbd489..34fce862 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 aca569e9..1b05ed59 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 -- 2.26.2