From 78429a6aa6bb4f8527f0c6be678555ef26b62d19 Mon Sep 17 00:00:00 2001 From: Gustavo Niemeyer Date: Mon, 16 Dec 2002 13:54:02 +0000 Subject: Fixing bug [#448679] Left to right * Python/compile.c (com_dictmaker): Reordered evaluation of dictionaries to follow strict LTR evaluation. * Lib/compiler/pycodegen.py (CodeGenerator.visitDict): Reordered evaluation of dictionaries to follow strict LTR evaluation. * Doc/ref/ref5.tex Documented the general LTR evaluation order idea. * Misc/NEWS Documented change in evaluation order of dictionaries. --- Doc/ref/ref5.tex | 18 ++++++++++++++++++ Lib/compiler/pycodegen.py | 4 ++-- Misc/NEWS | 4 ++++ Python/compile.c | 4 ++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Doc/ref/ref5.tex b/Doc/ref/ref5.tex index 34c99ef..c0212d0 100644 --- a/Doc/ref/ref5.tex +++ b/Doc/ref/ref5.tex @@ -1026,6 +1026,24 @@ tuple, but rather yields the value of that expression. \code{()}.) \indexii{trailing}{comma} +\section{Evaluation order\label{evalorder}} +\indexii{evaluation}{order} + +Python evaluates expressions from left to right. Notice that while +evaluating an assignment, the right-hand side is evaluated before +the left-hand side. + +In the following lines, expressions will be evaluated in the +arithmetic order of their suffixes: + +\begin{verbatim} +expr1, expr2, expr3, expr4 +(expr1, expr2, expr3, expr4) +{expr1: expr2, expr3: expr4} +expr1 + expr2 * (expr3 - expr4) +func(expr1, expr2, *expr3, **expr4) +expr3, expr4 = expr1, expr2 +\end{verbatim} \section{Summary\label{summary}} diff --git a/Lib/compiler/pycodegen.py b/Lib/compiler/pycodegen.py index a0aa73a..ac978c0 100644 --- a/Lib/compiler/pycodegen.py +++ b/Lib/compiler/pycodegen.py @@ -1129,9 +1129,9 @@ class CodeGenerator: self.emit('SET_LINENO', lineno2) lineno = lineno2 self.emit('DUP_TOP') - self.visit(v) - self.emit('ROT_TWO') self.visit(k) + self.visit(v) + self.emit('ROT_THREE') self.emit('STORE_SUBSCR') class NestedScopeMixin: diff --git a/Misc/NEWS b/Misc/NEWS index 12df9ec..dea62dd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -331,6 +331,10 @@ Core and builtins - sys.exit() inadvertently allowed more than one argument. An exception will now be raised if more than one argument is used. +- Changed evaluation order of dictionaries to conform to the general + left to right evaluation order rule. Now {f1(): f2()} will evaluate + f1 first. + Extension modules ----------------- diff --git a/Python/compile.c b/Python/compile.c index b438ce4..1755521 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1529,9 +1529,9 @@ com_dictmaker(struct compiling *c, node *n) It wants the stack to look like (value) (dict) (key) */ com_addbyte(c, DUP_TOP); com_push(c, 1); - com_node(c, CHILD(n, i+2)); /* value */ - com_addbyte(c, ROT_TWO); com_node(c, CHILD(n, i)); /* key */ + com_node(c, CHILD(n, i+2)); /* value */ + com_addbyte(c, ROT_THREE); com_addbyte(c, STORE_SUBSCR); com_pop(c, 3); } -- cgit v0.12