]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46161: Fix bug in starunpack_helper in compile.c (GH-30235)
authorzq1997 <email2zq@qq.com>
Mon, 17 Jan 2022 17:45:44 +0000 (01:45 +0800)
committerGitHub <noreply@github.com>
Mon, 17 Jan 2022 17:45:44 +0000 (17:45 +0000)
Lib/test/test_class.py
Misc/NEWS.d/next/Core and Builtins/2021-12-23-12-32-45.bpo-46161.EljBmu.rst [new file with mode: 0644]
Python/compile.c

index 7524f58a3ce732a789f513947fea65837477475a..7cf5e06d59e209a0b3cb433ebe1d2658d188245c 100644 (file)
@@ -666,5 +666,23 @@ class ClassTests(unittest.TestCase):
         with self.assertRaisesRegex(TypeError, error_msg):
             object.__init__(E(), 42)
 
+    def testClassWithExtCall(self):
+        class Meta(int):
+            def __init__(*args, **kwargs):
+                pass
+
+            def __new__(cls, name, bases, attrs, **kwargs):
+                return bases, kwargs
+
+        d = {'metaclass': Meta}
+
+        class A(**d): pass
+        self.assertEqual(A, ((), {}))
+        class A(0, 1, 2, 3, 4, 5, 6, 7, **d): pass
+        self.assertEqual(A, (tuple(range(8)), {}))
+        class A(0, *range(1, 8), **d, foo='bar'): pass
+        self.assertEqual(A, (tuple(range(8)), {'foo': 'bar'}))
+
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-23-12-32-45.bpo-46161.EljBmu.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-23-12-32-45.bpo-46161.EljBmu.rst
new file mode 100644 (file)
index 0000000..3eeb358
--- /dev/null
@@ -0,0 +1 @@
+Fix the class building error when the arguments are constants and CALL_FUNCTION_EX is used.
\ No newline at end of file
index b2702da8707f383bcd5e21bda104a2e268a55d31..86f888ef8a39483d93e9302bad227471e17ce14e 100644 (file)
@@ -4233,7 +4233,7 @@ starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed,
             Py_INCREF(val);
             PyTuple_SET_ITEM(folded, i, val);
         }
-        if (tuple) {
+        if (tuple && !pushed) {
             ADDOP_LOAD_CONST_NEW(c, folded);
         } else {
             if (add == SET_ADD) {
@@ -4245,6 +4245,9 @@ starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed,
             ADDOP_I(c, build, pushed);
             ADDOP_LOAD_CONST_NEW(c, folded);
             ADDOP_I(c, extend, 1);
+            if (tuple) {
+                ADDOP(c, LIST_TO_TUPLE);
+            }
         }
         return 1;
     }