Commit 204e2891 authored by Robert Bradshaw's avatar Robert Bradshaw

modify sizeof() operator to return size of extension type struct

parent 78ed7c3a
...@@ -2352,7 +2352,7 @@ class SizeofTypeNode(SizeofNode): ...@@ -2352,7 +2352,7 @@ class SizeofTypeNode(SizeofNode):
base_type = self.base_type.analyse(env) base_type = self.base_type.analyse(env)
_, arg_type = self.declarator.analyse(base_type, env) _, arg_type = self.declarator.analyse(base_type, env)
self.arg_type = arg_type 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") error(self.pos, "Cannot take sizeof Python object")
elif arg_type.is_void: elif arg_type.is_void:
error(self.pos, "Cannot take sizeof void") error(self.pos, "Cannot take sizeof void")
...@@ -2361,6 +2361,11 @@ class SizeofTypeNode(SizeofNode): ...@@ -2361,6 +2361,11 @@ class SizeofTypeNode(SizeofNode):
self.type = PyrexTypes.c_int_type self.type = PyrexTypes.c_int_type
def calculate_result_code(self): def calculate_result_code(self):
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("") arg_code = self.arg_type.declaration_code("")
return "(sizeof(%s))" % arg_code return "(sizeof(%s))" % arg_code
...@@ -2744,14 +2749,14 @@ class CondExprNode(ExprNode): ...@@ -2744,14 +2749,14 @@ class CondExprNode(ExprNode):
def compute_result_type(self, type1, type2): def compute_result_type(self, type1, type2):
if type1 == type2: if type1 == type2:
return type1 return type1
elif type1.is_pyobject or type2.is_pyobject:
return py_object_type
elif type1.is_numeric and type2.is_numeric: elif type1.is_numeric and type2.is_numeric:
return PyrexTypes.widest_numeric_type(type1, type2) return PyrexTypes.widest_numeric_type(type1, type2)
elif type1.is_extension_type and type1.subtype_of_resolved_type(type2): elif type1.is_extension_type and type1.subtype_of_resolved_type(type2):
return type2 return type2
elif type2.is_extension_type and type2.subtype_of_resolved_type(type1): elif type2.is_extension_type and type2.subtype_of_resolved_type(type1):
return type1 return type1
elif type1.is_pyobject or type2.is_pyobject:
return py_object_type
else: else:
return None return None
......
...@@ -225,7 +225,7 @@ class PyExtensionType(PyObjectType): ...@@ -225,7 +225,7 @@ class PyExtensionType(PyObjectType):
return self.typeobj_cname is None and self.module_name is not None return self.typeobj_cname is None and self.module_name is not None
def declaration_code(self, entity_code, 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: if pyrex:
return "%s %s" % (self.name, entity_code) return "%s %s" % (self.name, entity_code)
else: else:
...@@ -234,6 +234,9 @@ class PyExtensionType(PyObjectType): ...@@ -234,6 +234,9 @@ class PyExtensionType(PyObjectType):
else: else:
base_format = "struct %s" base_format = "struct %s"
base = public_decl(base_format % self.objstruct_cname, dll_linkage) base = public_decl(base_format % self.objstruct_cname, dll_linkage)
if deref:
return "%s %s" % (base, entity_code)
else:
return "%s *%s" % (base, entity_code) return "%s *%s" % (base, entity_code)
def attributes_known(self): def attributes_known(self):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment