]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix constant folding optimization for positional only arguments (GH-17837)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 5 Jan 2020 17:21:47 +0000 (09:21 -0800)
committerGitHub <noreply@github.com>
Sun, 5 Jan 2020 17:21:47 +0000 (09:21 -0800)
(cherry picked from commit b121a4a45ff4bab8812a9b26ceffe5ad642f5d5a)

Co-authored-by: Anthony Sottile <asottile@umich.edu>
Lib/test/test_positional_only_arg.py
Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst [new file with mode: 0644]
Python/ast_opt.c

index 63dee7ca434b21f601b3545db0f43c6ff0b770b2..2ef40e3a5a1138d7df1fbc9c596a64f5ef563582 100644 (file)
@@ -1,5 +1,6 @@
 """Unit tests for the positional only argument syntax specified in PEP 570."""
 
+import dis
 import pickle
 import unittest
 
@@ -419,6 +420,17 @@ class PositionalOnlyTestCase(unittest.TestCase):
     def test_annotations(self):
         assert global_inner_has_pos_only().__annotations__ == {'x': int}
 
+    def test_annotations_constant_fold(self):
+        def g():
+            def f(x: not (int is int), /): ...
+
+        # without constant folding we end up with
+        # COMPARE_OP(is), UNARY_NOT
+        # with constant folding we should expect a COMPARE_OP(is not)
+        codes = [(i.opname, i.argval) for i in dis.get_instructions(g)]
+        self.assertNotIn(('UNARY_NOT', None), codes)
+        self.assertIn(('COMPARE_OP', 'is not'), codes)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst
new file mode 100644 (file)
index 0000000..971b065
--- /dev/null
@@ -0,0 +1,2 @@
+Fix constant folding optimization for positional only arguments - by Anthony
+Sottile.
index 96c766fc0957d491f1614f45ae347c3d6d5978cb..f2a2c259149932e8a4c0377c4bb5d8a7a70f51f1 100644 (file)
@@ -617,6 +617,7 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_)
 static int
 astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_)
 {
+    CALL_SEQ(astfold_arg, arg_ty, node_->posonlyargs);
     CALL_SEQ(astfold_arg, arg_ty, node_->args);
     CALL_OPT(astfold_arg, arg_ty, node_->vararg);
     CALL_SEQ(astfold_arg, arg_ty, node_->kwonlyargs);