Commit dc4c6c5c authored by Craig Citro's avatar Craig Citro

Fix a bug with automatic conversion of public attributes to properties.

parent 27b5165d
...@@ -3427,7 +3427,8 @@ class AttributeNode(ExprNode): ...@@ -3427,7 +3427,8 @@ class AttributeNode(ExprNode):
def generate_deletion_code(self, code): def generate_deletion_code(self, code):
interned_attr_cname = code.intern_identifier(self.attribute) interned_attr_cname = code.intern_identifier(self.attribute)
self.obj.generate_evaluation_code(code) 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, code.put_error_if_neg(self.pos,
'PyObject_DelAttr(%s, %s)' % ( 'PyObject_DelAttr(%s, %s)' % (
self.obj.py_result(), self.obj.py_result(),
......
...@@ -952,6 +952,15 @@ property NAME: ...@@ -952,6 +952,15 @@ property NAME:
def __set__(self, value): def __set__(self, value):
ATTR = value ATTR = value
""", level='c_class') """, 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""" basic_property_ro = TreeFragment(u"""
property NAME: property NAME:
def __get__(self): def __get__(self):
...@@ -1055,7 +1064,10 @@ property NAME: ...@@ -1055,7 +1064,10 @@ property NAME:
def create_Property(self, entry): def create_Property(self, entry):
if entry.visibility == 'public': 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': elif entry.visibility == 'readonly':
template = self.basic_property_ro template = self.basic_property_ro
property = template.substitute({ property = template.substitute({
......
...@@ -15,6 +15,7 @@ cdef void f(): ...@@ -15,6 +15,7 @@ cdef void f():
_ERRORS = u""" _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: Illegal use of special attribute __weakref__
5:20: Illegal use of special attribute __weakref__
5:20: Special attribute __weakref__ cannot be exposed to Python 5:20: Special attribute __weakref__ cannot be exposed to Python
8:22: Illegal use of special attribute __weakref__ 8:22: Illegal use of special attribute __weakref__
8:22: Special attribute __weakref__ cannot be exposed to Python 8:22: Special attribute __weakref__ cannot be exposed to Python
......
...@@ -15,7 +15,7 @@ def tomato(): ...@@ -15,7 +15,7 @@ def tomato():
>>> lines = __test__.keys() >>> lines = __test__.keys()
>>> len(lines) >>> len(lines)
2 3
>>> 'Spam.eggs.__get__ (line 5)' in lines >>> 'Spam.eggs.__get__ (line 5)' in lines
True True
>>> 'tomato (line 11)' in lines >>> 'tomato (line 11)' in lines
...@@ -26,3 +26,17 @@ def tomato(): ...@@ -26,3 +26,17 @@ def tomato():
spam = Spam() spam = Spam()
lettuce = spam.eggs lettuce = spam.eggs
return lettuce 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
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