Permalink
Browse files

fixed ref-count bug in try-except handling

  • Loading branch information...
1 parent bc80f4d commit bc07e3397e0305982f985eecb1f73cdac557e60e Stefan Behnel committed Nov 17, 2008
Showing with 57 additions and 0 deletions.
  1. +2 −0 Cython/Compiler/Nodes.py
  2. +55 −0 tests/run/exceptionrefcount.pyx
View
@@ -3882,6 +3882,8 @@ def generate_execution_code(self, code):
self.else_clause.generate_execution_code(code)
code.putln(
"}")
+ for var in Naming.exc_save_vars:
+ code.put_xdecref_clear(var, py_object_type)
code.put_goto(try_end_label)
code.put_label(our_error_label)
code.put_var_xdecrefs_clear(self.cleanup_list)
@@ -0,0 +1,55 @@
+__doc__ = u"""
+>>> class SampleException(Exception): pass
+>>> import sys
+
+>>> def assert_refcount(rc1, rc2, func):
+... # test ref-counts, but allow a bit of freedom
+... assert rc2 <= rc1 + 4, "%s, before: %d, after %d" % (
+... func.__name__, rc1, rc2)
+
+>>> def run_test(repeat, test_func):
+... initial_refcount = sys.getrefcount(SampleException)
+... for i in range(repeat):
+... try: raise SampleException
+... except:
+... refcount1 = sys.getrefcount(SampleException)
+... test_func()
+... refcount2 = sys.getrefcount(SampleException)
+...
+... assert_refcount(refcount1, refcount2, test_func)
+... assert_refcount(initial_refcount, refcount2, test_func)
+... refcount3 = sys.getrefcount(SampleException)
+... assert_refcount(refcount1, refcount3, test_func)
+... assert_refcount(initial_refcount, refcount3, test_func)
+
+>>> run_test(50, test_no_exception_else)
+>>> run_test(50, test_no_exception)
+>>> run_test(50, test_exception)
+>>> run_test(50, test_finally)
+"""
+
+def test_no_exception():
+ try:
+ a = 1+1
+ except:
+ pass
+
+def test_no_exception_else():
+ try:
+ a = 1+1
+ except:
+ pass
+ else:
+ b = 1+1
+
+def test_exception():
+ try:
+ raise TypeError
+ except:
+ pass
+
+def test_finally():
+ try:
+ a = 1+1
+ finally:
+ b = 1+1

0 comments on commit bc07e33

Please sign in to comment.