From: Craig Citro Date: Wed, 7 Jul 2010 08:11:24 +0000 (-0700) Subject: Fix a bug with automatic conversion of public attributes to properties. X-Git-Tag: 0.13.beta0~35 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=dc4c6c5c778bc6dbfed77f4a1bb6784d1873b51c;p=cython.git Fix a bug with automatic conversion of public attributes to properties. --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 965a8ec4..852286f4 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -3427,7 +3427,8 @@ class AttributeNode(ExprNode): def generate_deletion_code(self, code): interned_attr_cname = code.intern_identifier(self.attribute) self.obj.generate_evaluation_code(code) - if self.is_py_attr: + if self.is_py_attr or (isinstance(self.entry.scope, Symtab.PropertyScope) + and self.entry.scope.entries.has_key(u'__del__')): code.put_error_if_neg(self.pos, 'PyObject_DelAttr(%s, %s)' % ( self.obj.py_result(), diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index adb41c3c..a9eab143 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -952,6 +952,15 @@ property NAME: def __set__(self, value): ATTR = value """, level='c_class') + basic_pyobject_property = TreeFragment(u""" +property NAME: + def __get__(self): + return ATTR + def __set__(self, value): + ATTR = value + def __del__(self): + ATTR = None + """, level='c_class') basic_property_ro = TreeFragment(u""" property NAME: def __get__(self): @@ -1055,7 +1064,10 @@ property NAME: def create_Property(self, entry): if entry.visibility == 'public': - template = self.basic_property + if entry.type.is_pyobject: + template = self.basic_pyobject_property + else: + template = self.basic_property elif entry.visibility == 'readonly': template = self.basic_property_ro property = template.substitute({ diff --git a/tests/errors/e_extweakref.pyx b/tests/errors/e_extweakref.pyx index 8354dcb5..4b689969 100644 --- a/tests/errors/e_extweakref.pyx +++ b/tests/errors/e_extweakref.pyx @@ -15,6 +15,7 @@ cdef void f(): _ERRORS = u""" 5:20: Illegal use of special attribute __weakref__ 5:20: Illegal use of special attribute __weakref__ +5:20: Illegal use of special attribute __weakref__ 5:20: Special attribute __weakref__ cannot be exposed to Python 8:22: Illegal use of special attribute __weakref__ 8:22: Special attribute __weakref__ cannot be exposed to Python diff --git a/tests/run/extpropertyref.pyx b/tests/run/extpropertyref.pyx index c015454d..0feb9631 100644 --- a/tests/run/extpropertyref.pyx +++ b/tests/run/extpropertyref.pyx @@ -15,7 +15,7 @@ def tomato(): >>> lines = __test__.keys() >>> len(lines) - 2 + 3 >>> 'Spam.eggs.__get__ (line 5)' in lines True >>> 'tomato (line 11)' in lines @@ -26,3 +26,17 @@ def tomato(): spam = Spam() lettuce = spam.eggs return lettuce + +cdef class Bacon(object): + cdef object number_of_slices + cdef public object is_a_vegetable + +def breakfast(): + """ + >>> breakfast() + """ + cdef Bacon myslices = Bacon() + myslices.is_a_vegetable = True + assert myslices.is_a_vegetable, myslices.is_a_vegetable + del myslices.is_a_vegetable + assert myslices.is_a_vegetable is None, myslices.is_a_vegetable