From: Stefan Behnel Date: Sat, 26 Jan 2013 13:23:47 +0000 (+0100) Subject: disable broken optimisation for except-as special case X-Git-Tag: 0.19b1~276 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f49d1f6f5472785fcde5952ab03ee64d76a7ed56;p=platform%2Fupstream%2Fpython-cython.git disable broken optimisation for except-as special case --- 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))