New submission from Nick Coghlan <ncogh...@gmail.com>:
While working on the PEP 642 reference implementation I removed the "default:" case from the switch statement in astfold_expr as part of making sure the new SkippedBinding node was being handled everywhere it needed to be. This change picked up that NamedExpr_kind wasn't being handled either, and a check with the dis module confirmed that using the walrus operator turns off constant folding: ``` [ncoghlan@thechalk cpython]$ ./python Python 3.10.0a2+ (heads/pep-642-constraint-patterns-dirty:4db2fbd609, Nov 7 2020, 16:42:19) [GCC 10.2.1 20201016 (Red Hat 10.2.1-6)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import dis >>> dis.dis("1 + 1") 1 0 LOAD_CONST 0 (2) 2 RETURN_VALUE >>> dis.dis("(x := 1 + 1)") 1 0 LOAD_CONST 0 (1) 2 LOAD_CONST 0 (1) 4 BINARY_ADD 6 DUP_TOP 8 STORE_NAME 0 (x) 10 RETURN_VALUE >>> ``` The missing switch statement entry is just: ``` case NamedExpr_kind: CALL(astfold_expr, expr_ty, node_->v.NamedExpr.value); break; ``` Which gives the expected result: ``` [ncoghlan@thechalk cpython]$ ./python -c "import dis; dis.dis('(x := 1 +1)')" 1 0 LOAD_CONST 0 (2) 2 DUP_TOP 4 STORE_NAME 0 (x) 6 RETURN_VALUE ``` ---------- messages: 380494 nosy: ncoghlan priority: normal severity: normal stage: needs patch status: open title: Constant folding is skipped in named expressions type: performance versions: Python 3.10 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue42282> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com