summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustavo Niemeyer <gustavo@niemeyer.net>2002-12-16 13:54:02 (GMT)
committerGustavo Niemeyer <gustavo@niemeyer.net>2002-12-16 13:54:02 (GMT)
commit78429a6aa6bb4f8527f0c6be678555ef26b62d19 (patch)
treee733c09ec2db70d79822c60895286ffacd97e003
parentc389ec8d55efe0a812906ec68cf5c690290b3428 (diff)
downloadcpython-78429a6aa6bb4f8527f0c6be678555ef26b62d19.zip
cpython-78429a6aa6bb4f8527f0c6be678555ef26b62d19.tar.gz
cpython-78429a6aa6bb4f8527f0c6be678555ef26b62d19.tar.bz2
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.
-rw-r--r--Doc/ref/ref5.tex18
-rw-r--r--Lib/compiler/pycodegen.py4
-rw-r--r--Misc/NEWS4
-rw-r--r--Python/compile.c4
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);
}