https://github.com/python/cpython/commit/45c5cba318a19dda3ee6f9fc84781cc7a2fbde80
commit: 45c5cba318a19dda3ee6f9fc84781cc7a2fbde80
branch: main
author: Kumar Aditya <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2024-11-29T21:44:20+05:30
summary:
gh-127316: fix incorrect assertion in setting `__class__` in free-threading
(#127399)
files:
M Lib/test/test_free_threading/test_type.py
M Objects/dictobject.c
diff --git a/Lib/test/test_free_threading/test_type.py
b/Lib/test/test_free_threading/test_type.py
index 51463b6bb8c1b4..53f6d778bbecbc 100644
--- a/Lib/test/test_free_threading/test_type.py
+++ b/Lib/test/test_free_threading/test_type.py
@@ -124,6 +124,21 @@ def work():
for thread in threads:
thread.join()
+ def test_object_class_change(self):
+ class Base:
+ def __init__(self):
+ self.attr = 123
+ class ClassA(Base):
+ pass
+ class ClassB(Base):
+ pass
+
+ obj = ClassA()
+ # keep reference to __dict__
+ d = obj.__dict__
+ obj.__class__ = ClassB
+
+
def run_one(self, writer_func, reader_func):
writer = Thread(target=writer_func)
readers = []
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 49b213eaa817e2..a13d8084d14d66 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -7300,7 +7300,7 @@ _PyDict_DetachFromObject(PyDictObject *mp, PyObject *obj)
// We could be called with an unlocked dict when the caller knows the
// values are already detached, so we assert after inline values check.
- _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(mp);
+ ASSERT_WORLD_STOPPED_OR_OBJ_LOCKED(mp);
assert(mp->ma_values->embedded == 1);
assert(mp->ma_values->valid == 1);
assert(Py_TYPE(obj)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]