fix [ 1509132 ] compiler module builds incorrect AST for TryExceptFinally

This commit is contained in:
Georg Brandl 2006-06-21 17:45:17 +00:00
parent 10340608f0
commit ad29e637d8
2 changed files with 40 additions and 18 deletions

View File

@ -536,12 +536,7 @@ class Transformer:
lineno=nodelist[0][2]) lineno=nodelist[0][2])
def try_stmt(self, nodelist): def try_stmt(self, nodelist):
# 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] return self.com_try_except_finally(nodelist)
# | 'try' ':' suite 'finally' ':' suite
if nodelist[3][0] != symbol.except_clause:
return self.com_try_finally(nodelist)
return self.com_try_except(nodelist)
def with_stmt(self, nodelist): def with_stmt(self, nodelist):
return self.com_with(nodelist) return self.com_with(nodelist)
@ -917,18 +912,21 @@ class Transformer:
bases.append(self.com_node(node[i])) bases.append(self.com_node(node[i]))
return bases return bases
def com_try_finally(self, nodelist): def com_try_except_finally(self, nodelist):
# try_fin_stmt: "try" ":" suite "finally" ":" suite # ('try' ':' suite
return TryFinally(self.com_node(nodelist[2]), # ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite]
self.com_node(nodelist[5]), # | 'finally' ':' suite))
lineno=nodelist[0][2])
def com_try_except(self, nodelist): if nodelist[3][0] == token.NAME:
# try_except: 'try' ':' suite (except_clause ':' suite)* ['else' suite] # 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)] #tryexcept: [TryNode, [except_clauses], elseNode)]
stmt = self.com_node(nodelist[2])
clauses = [] clauses = []
elseNode = None elseNode = None
finallyNode = None
for i in range(3, len(nodelist), 3): for i in range(3, len(nodelist), 3):
node = nodelist[i] node = nodelist[i]
if node[0] == symbol.except_clause: if node[0] == symbol.except_clause:
@ -944,9 +942,16 @@ class Transformer:
clauses.append((expr1, expr2, self.com_node(nodelist[i+2]))) clauses.append((expr1, expr2, self.com_node(nodelist[i+2])))
if node[0] == token.NAME: if node[0] == token.NAME:
elseNode = self.com_node(nodelist[i+2]) if node[1] == 'else':
return TryExcept(self.com_node(nodelist[2]), clauses, elseNode, elseNode = self.com_node(nodelist[i+2])
lineno=nodelist[0][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): def com_with(self, nodelist):
# with_stmt: 'with' expr [with_var] ':' suite # with_stmt: 'with' expr [with_var] ':' suite

View File

@ -4,8 +4,25 @@ Python News
(editors: check NEWS.help for information about editing NEWS using ReST.) (editors: check NEWS.help for information about editing NEWS using ReST.)
What's New in Python 2.5 beta 2?
================================
*Release date: XX-JUL-2006*
Core and builtins
-----------------
Library
-------
- The compiler module now correctly compiles the new try-except-finally
statement (bug #1509132).
What's New in Python 2.5 beta 1? What's New in Python 2.5 beta 1?
================================= ================================
*Release date: 20-JUN-2006* *Release date: 20-JUN-2006*