https://github.com/python/cpython/commit/b99c6620b282b9ccac1018c86310aa5324fca753
commit: b99c6620b282b9ccac1018c86310aa5324fca753
branch: 3.13
author: Jelle Zijlstra <[email protected]>
committer: Yhg1s <[email protected]>
date: 2024-09-30T18:53:17-07:00
summary:

[3.13] gh-124442: make `__static_attributes__` deterministic by sorting 
(GH-124492) (#124738)

* [3.13] gh-124442: make `__static_attributes__` deterministic by sorting 
(GH-124492)
(cherry picked from commit 04c837d9d8a474777ef9c1412fbba14f0682366c)

Co-authored-by: Kira <[email protected]>
Signed-off-by: kp2pml30 <[email protected]>
Co-authored-by: Jelle Zijlstra <[email protected]>
Co-authored-by: Adam Turner <[email protected]>

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2024-09-25-11-53-22.gh-issue-124442.EXC1Ve.rst
M Lib/test/test_compile.py
M Python/compile.c

diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 9c6bc31ff4922e..cdd942b56cb7e5 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1,6 +1,7 @@
 import contextlib
 import dis
 import io
+import itertools
 import math
 import opcode
 import os
@@ -2619,6 +2620,22 @@ def test_nested(self):
         self.compare_instructions(seq, [('LOAD_CONST', 1, 1, 0, 0, 0)])
         self.compare_instructions(seq.get_nested()[0], [('LOAD_CONST', 2, 2, 
0, 0, 0)])
 
+    def test_static_attributes_are_sorted(self):
+        code = (
+            'class T:\n'
+            '    def __init__(self):\n'
+            '        self.{V1} = 10\n'
+            '        self.{V2} = 10\n'
+            '    def foo(self):\n'
+            '        self.{V3} = 10\n'
+        )
+        attributes = ("a", "b", "c")
+        for perm in itertools.permutations(attributes):
+            var_names = {f'V{i + 1}': name for i, name in enumerate(perm)}
+            ns = run_code(code.format(**var_names))
+            t = ns['T']
+            self.assertEqual(t.__static_attributes__, attributes)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2024-09-25-11-53-22.gh-issue-124442.EXC1Ve.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2024-09-25-11-53-22.gh-issue-124442.EXC1Ve.rst
new file mode 100644
index 00000000000000..58e79f22ac0f90
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2024-09-25-11-53-22.gh-issue-124442.EXC1Ve.rst
@@ -0,0 +1,2 @@
+Fix nondeterminism in compilation by sorting the value of
+:attr:`~type.__static_attributes__`. Patch by kp2pml30.
diff --git a/Python/compile.c b/Python/compile.c
index 7752a6885cc4e2..7d93f2a05f66d9 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2544,7 +2544,18 @@ compiler_class_body(struct compiler *c, stmt_ty s, int 
firstlineno)
         return ERROR;
     }
     assert(c->u->u_static_attributes);
-    PyObject *static_attributes = PySequence_Tuple(c->u->u_static_attributes);
+    PyObject *static_attributes_unsorted = 
PySequence_List(c->u->u_static_attributes);
+    if (static_attributes_unsorted == NULL) {
+        compiler_exit_scope(c);
+        return ERROR;
+    }
+    if (PyList_Sort(static_attributes_unsorted) != 0) {
+        compiler_exit_scope(c);
+        Py_DECREF(static_attributes_unsorted);
+        return ERROR;
+    }
+    PyObject *static_attributes = PySequence_Tuple(static_attributes_unsorted);
+    Py_DECREF(static_attributes_unsorted);
     if (static_attributes == NULL) {
         compiler_exit_scope(c);
         return ERROR;

_______________________________________________
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]

Reply via email to