diff options
author | Georg Brandl <georg@python.org> | 2006-06-21 17:45:17 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2006-06-21 17:45:17 (GMT) |
commit | ad29e637d882cb0daee2073a3fe9b9a7e6e8d776 (patch) | |
tree | bd5360b09e8383172b2aede2819555fda88a2aa3 /Lib/compiler | |
parent | 10340608f03c80c652dd5c40ca1c48bb4cdf0a41 (diff) | |
download | cpython-ad29e637d882cb0daee2073a3fe9b9a7e6e8d776.zip cpython-ad29e637d882cb0daee2073a3fe9b9a7e6e8d776.tar.gz cpython-ad29e637d882cb0daee2073a3fe9b9a7e6e8d776.tar.bz2 |
fix [ 1509132 ] compiler module builds incorrect AST for TryExceptFinally
Diffstat (limited to 'Lib/compiler')
-rw-r--r-- | Lib/compiler/transformer.py | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py index d30cc1a..71a5d0e 100644 --- a/Lib/compiler/transformer.py +++ b/Lib/compiler/transformer.py @@ -536,12 +536,7 @@ class Transformer: lineno=nodelist[0][2]) def try_stmt(self, nodelist): - # 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] - # | 'try' ':' suite 'finally' ':' suite - if nodelist[3][0] != symbol.except_clause: - return self.com_try_finally(nodelist) - - return self.com_try_except(nodelist) + return self.com_try_except_finally(nodelist) def with_stmt(self, nodelist): return self.com_with(nodelist) @@ -917,18 +912,21 @@ class Transformer: bases.append(self.com_node(node[i])) return bases - def com_try_finally(self, nodelist): - # try_fin_stmt: "try" ":" suite "finally" ":" suite - return TryFinally(self.com_node(nodelist[2]), - self.com_node(nodelist[5]), - lineno=nodelist[0][2]) - - def com_try_except(self, nodelist): - # try_except: 'try' ':' suite (except_clause ':' suite)* ['else' suite] + def com_try_except_finally(self, nodelist): + # ('try' ':' suite + # ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite] + # | 'finally' ':' suite)) + + if nodelist[3][0] == token.NAME: + # first clause is a finally clause: only try-finally + return TryFinally(self.com_node(nodelist[2]), + self.com_node(nodelist[5]), + lineno=nodelist[0][2]) + #tryexcept: [TryNode, [except_clauses], elseNode)] - stmt = self.com_node(nodelist[2]) clauses = [] elseNode = None + finallyNode = None for i in range(3, len(nodelist), 3): node = nodelist[i] if node[0] == symbol.except_clause: @@ -944,9 +942,16 @@ class Transformer: clauses.append((expr1, expr2, self.com_node(nodelist[i+2]))) if node[0] == token.NAME: - elseNode = self.com_node(nodelist[i+2]) - return TryExcept(self.com_node(nodelist[2]), clauses, elseNode, - lineno=nodelist[0][2]) + if node[1] == 'else': + elseNode = self.com_node(nodelist[i+2]) + elif node[1] == 'finally': + finallyNode = self.com_node(nodelist[i+2]) + try_except = TryExcept(self.com_node(nodelist[2]), clauses, elseNode, + lineno=nodelist[0][2]) + if finallyNode: + return TryFinally(try_except, finallyNode, lineno=nodelist[0][2]) + else: + return try_except def com_with(self, nodelist): # with_stmt: 'with' expr [with_var] ':' suite |