diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 3114527dd0..cb3d053b3b 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -2356,8 +2356,6 @@ class D(object):
else:
self.fail("expected ZeroDivisionError from bad property")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_properties_doc_attrib(self):
@@ -2384,8 +2382,6 @@ def test_testcapi_no_segfault(self):
class X(object):
p = property(_testcapi.test_with_docstring)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
def test_properties_plus(self):
class C(object):
foo = property(doc="hello")
diff --git a/Lib/test/test_property.py b/Lib/test/test_property.py
index 5312925d93..8411e903b1 100644
--- a/Lib/test/test_property.py
+++ b/Lib/test/test_property.py
@@ -100,32 +100,24 @@ def test_property_decorator_subclass(self):
self.assertRaises(PropertySet, setattr, sub, "spam", None)
self.assertRaises(PropertyDel, delattr, sub, "spam")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_property_decorator_subclass_doc(self):
sub = SubClass()
self.assertEqual(sub.__class__.spam.__doc__, "SubClass.getter")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_property_decorator_baseclass_doc(self):
base = BaseClass()
self.assertEqual(base.__class__.spam.__doc__, "BaseClass.getter")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
def test_property_decorator_doc(self):
base = PropertyDocBase()
sub = PropertyDocSub()
self.assertEqual(base.__class__.spam.__doc__, "spam spam spam")
self.assertEqual(sub.__class__.spam.__doc__, "spam spam spam")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_property_getter_doc_override(self):
@@ -136,8 +128,6 @@ def test_property_getter_doc_override(self):
self.assertEqual(newgetter.spam, 8)
self.assertEqual(newgetter.__class__.spam.__doc__, "new docstring")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
def test_property___isabstractmethod__descriptor(self):
for val in (True, False, [], [1], '', '1'):
class C(object):
@@ -169,8 +159,6 @@ def test_property_builtin_doc_writable(self):
p.__doc__ = 'extended'
self.assertEqual(p.__doc__, 'extended')
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_property_decorator_doc_writable(self):
@@ -268,8 +256,6 @@ def spam(self):
else:
raise Exception("AttributeError not raised")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_docstring_copy(self):
@@ -282,8 +268,6 @@ def spam(self):
Foo.spam.__doc__,
"spam wrapped in property subclass")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_property_setter_copies_getter_docstring(self):
@@ -317,8 +301,6 @@ def spam(self, value):
FooSub.spam.__doc__,
"spam wrapped in property subclass")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_property_new_getter_new_docstring(self):
@@ -358,20 +340,14 @@ def _format_exc_msg(self, msg):
def setUpClass(cls):
cls.obj = cls.cls()
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
def test_get_property(self):
with self.assertRaisesRegex(AttributeError, self._format_exc_msg("has no getter")):
self.obj.foo
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
def test_set_property(self):
with self.assertRaisesRegex(AttributeError, self._format_exc_msg("has no setter")):
self.obj.foo = None
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
def test_del_property(self):
with self.assertRaisesRegex(AttributeError, self._format_exc_msg("has no deleter")):
del self.obj.foo
diff --git a/vm/src/builtins/property.rs b/vm/src/builtins/property.rs
index 1ea0c61d14..a5e8f12587 100644
--- a/vm/src/builtins/property.rs
+++ b/vm/src/builtins/property.rs
@@ -10,6 +10,7 @@ use crate::{
function::{FuncArgs, PySetterValue},
types::{Constructor, GetDescriptor, Initializer},
};
+use std::sync::atomic::{AtomicBool, Ordering};
#[pyclass(module = false, name = "property", traverse)]
#[derive(Debug)]
@@ -19,6 +20,8 @@ pub struct PyProperty {
deleter: PyRwLock