summaryrefslogtreecommitdiffstats
path: root/Lib/compiler
diff options
context:
space:
mode:
authorMichael W. Hudson <mwh@python.net>2004-08-17 17:29:16 (GMT)
committerMichael W. Hudson <mwh@python.net>2004-08-17 17:29:16 (GMT)
commit0ccff074cd806bc7e963a1e0ff6ce25e0d11cce9 (patch)
treec8e7be65d3051aa878fe53169b9bdeb4d3b4227e /Lib/compiler
parentb51b23405b6cf82ab4ec20f3d5ef4b895bd0786f (diff)
downloadcpython-0ccff074cd806bc7e963a1e0ff6ce25e0d11cce9.zip
cpython-0ccff074cd806bc7e963a1e0ff6ce25e0d11cce9.tar.gz
cpython-0ccff074cd806bc7e963a1e0ff6ce25e0d11cce9.tar.bz2
This is Mark Russell's patch:
[ 1009560 ] Fix @decorator evaluation order From the description: Changes in this patch: - Change Grammar/Grammar to require newlines between adjacent decorators. - Fix order of evaluation of decorators in the C (compile.c) and python (Lib/compiler/pycodegen.py) compilers - Add better order of evaluation check to test_decorators.py (test_eval_order) - Update the decorator documentation in the reference manual (improve description of evaluation order and update syntax description) and the comment: Used Brett's evaluation order (see http://mail.python.org/pipermail/python-dev/2004-August/047835.html) (I'm checking this in for Anthony who was having problems getting SF to talk to him)
Diffstat (limited to 'Lib/compiler')
-rw-r--r--Lib/compiler/pycodegen.py4
-rw-r--r--Lib/compiler/transformer.py17
2 files changed, 8 insertions, 13 deletions
diff --git a/Lib/compiler/pycodegen.py b/Lib/compiler/pycodegen.py
index e5d1ff1..02e7764 100644
--- a/Lib/compiler/pycodegen.py
+++ b/Lib/compiler/pycodegen.py
@@ -367,12 +367,12 @@ class CodeGenerator:
def _visitFuncOrLambda(self, node, isLambda=0):
if not isLambda and node.decorators:
- for decorator in reversed(node.decorators.nodes):
+ for decorator in node.decorators.nodes:
self.visit(decorator)
ndecorators = len(node.decorators.nodes)
else:
ndecorators = 0
-
+
gen = self.FunctionGen(node, self.scopes, isLambda,
self.class_name, self.get_module())
walk(node.code, gen)
diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py
index 53a0fda..cdeb5ff 100644
--- a/Lib/compiler/transformer.py
+++ b/Lib/compiler/transformer.py
@@ -201,13 +201,14 @@ class Transformer:
def decorator(self, nodelist):
# '@' dotted_name [ '(' [arglist] ')' ]
- assert len(nodelist) in (2, 4, 5)
+ assert len(nodelist) in (3, 5, 6)
assert nodelist[0][0] == token.AT
+ assert nodelist[-1][0] == token.NEWLINE
assert nodelist[1][0] == symbol.dotted_name
funcname = self.decorator_name(nodelist[1][1:])
- if len(nodelist) > 2:
+ if len(nodelist) > 3:
assert nodelist[2][0] == token.LPAR
expr = self.com_call_function(funcname, nodelist[3])
else:
@@ -217,16 +218,10 @@ class Transformer:
def decorators(self, nodelist):
# decorators: decorator ([NEWLINE] decorator)* NEWLINE
- listlen = len(nodelist)
- i = 0
items = []
- while i < listlen:
- assert nodelist[i][0] == symbol.decorator
- items.append(self.decorator(nodelist[i][1:]))
- i += 1
-
- if i < listlen and nodelist[i][0] == token.NEWLINE:
- i += 1
+ for dec_nodelist in nodelist:
+ assert dec_nodelist[0] == symbol.decorator
+ items.append(self.decorator(dec_nodelist[1:]))
return Decorators(items)
def funcdef(self, nodelist):