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/transformer.py | |
| 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/transformer.py')
| -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  | 
