diff options
author | Michael W. Hudson <mwh@python.net> | 2004-08-17 17:29:16 (GMT) |
---|---|---|
committer | Michael W. Hudson <mwh@python.net> | 2004-08-17 17:29:16 (GMT) |
commit | 0ccff074cd806bc7e963a1e0ff6ce25e0d11cce9 (patch) | |
tree | c8e7be65d3051aa878fe53169b9bdeb4d3b4227e /Lib/compiler | |
parent | b51b23405b6cf82ab4ec20f3d5ef4b895bd0786f (diff) | |
download | cpython-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.py | 4 | ||||
-rw-r--r-- | Lib/compiler/transformer.py | 17 |
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): |