From f49d1f6f5472785fcde5952ab03ee64d76a7ed56 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Sat, 26 Jan 2013 14:23:47 +0100 Subject: [PATCH] disable broken optimisation for except-as special case --- Cython/Compiler/Nodes.py | 6 +----- tests/run/tryexcept.pyx | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index a88cc6d..f83da40 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -6093,14 +6093,10 @@ class ExceptClauseNode(Node): if (not getattr(self.body, 'stats', True) and self.excinfo_target is None - and (self.target is None or self.is_except_as)): + and self.target is None): # most simple case: no exception variable, empty body (pass) # => reset the exception state, done code.putln("PyErr_Restore(0,0,0);") - if self.is_except_as and self.target: - # "except ... as x" deletes x after use - # target is known to be a NameNode - self.target.generate_deletion_code(code) code.put_goto(end_label) code.putln("}") return diff --git a/tests/run/tryexcept.pyx b/tests/run/tryexcept.pyx index 85330b3..2302ffb 100644 --- a/tests/run/tryexcept.pyx +++ b/tests/run/tryexcept.pyx @@ -384,6 +384,22 @@ def except_as_raise_deletes_target(x, a): print(b) # raises UnboundLocalError if except clause was executed return i +def except_as_raise_with_empty_except(x, a): + """ + >>> except_as_raise_with_empty_except(None, TypeError) + >>> except_as_raise_with_empty_except(TypeError('test'), TypeError) + >>> except_as_raise_with_empty_except(ValueError('test'), TypeError) + Traceback (most recent call last): + ValueError: test + >>> except_as_raise_with_empty_except(None, TypeError) + """ + try: + if x: + raise x + b = 1 + except a as b: # previously raised UnboundLocalError + pass + def except_as_deletes_target_in_gen(x, a): """ >>> list(except_as_deletes_target_in_gen(None, TypeError)) -- 2.7.4