disable broken optimisation for except-as special case
authorStefan Behnel <stefan_ml@behnel.de>
Sat, 26 Jan 2013 13:23:47 +0000 (14:23 +0100)
committerStefan Behnel <stefan_ml@behnel.de>
Sat, 26 Jan 2013 13:23:47 +0000 (14:23 +0100)
Cython/Compiler/Nodes.py
tests/run/tryexcept.pyx

index a88cc6d..f83da40 100644 (file)
@@ -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
index 85330b3..2302ffb 100644 (file)
@@ -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))