https://github.com/python/cpython/commit/2f56c68dec97002fdd8563a0e4977b75eb191ab9
commit: 2f56c68dec97002fdd8563a0e4977b75eb191ab9
branch: 3.13
author: Miss Islington (bot) <31488909+miss-isling...@users.noreply.github.com>
committer: kumaraditya303 <kumaradi...@python.org>
date: 2024-11-29T16:36:44Z
summary:

[3.13] gh-127316: fix incorrect assertion in setting `__class__` in 
free-threading (GH-127399) (#127422)

gh-127316: fix incorrect assertion in setting `__class__` in free-threading 
(GH-127399)
(cherry picked from commit 45c5cba318a19dda3ee6f9fc84781cc7a2fbde80)

Co-authored-by: Kumar Aditya <kumaradi...@python.org>

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 3e565cb7ea0f7b..d847acfd6f9edb 100644
--- a/Lib/test/test_free_threading/test_type.py
+++ b/Lib/test/test_free_threading/test_type.py
@@ -125,6 +125,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 fccc8e930f51d6..f1f9110ff73e6d 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -7190,7 +7190,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 -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to