cython-devel

changeset 1727:6124ef21b1cf

Fix memleak when break used in try statement
author Robert Bradshaw <robertwb@math.washington.edu>
date Fri Feb 20 21:22:46 2009 -0800 (2 years ago)
parents 3c571857fd31
children a1c61ffe08ae
files Cython/Compiler/Nodes.py
line diff
1.1 --- a/Cython/Compiler/Nodes.py Fri Feb 20 15:04:51 2009 -0800 1.2 +++ b/Cython/Compiler/Nodes.py Fri Feb 20 21:22:46 2009 -0800 1.3 @@ -3310,9 +3310,6 @@ 1.4 if not code.break_label: 1.5 error(self.pos, "break statement not inside loop") 1.6 else: 1.7 - #code.putln( 1.8 - # "goto %s;" % 1.9 - # code.break_label) 1.10 code.put_goto(code.break_label) 1.11 1.12 1.13 @@ -4041,13 +4038,15 @@ 1.14 1.15 def generate_execution_code(self, code): 1.16 old_return_label = code.return_label 1.17 + old_break_label = code.break_label 1.18 old_error_label = code.new_error_label() 1.19 our_error_label = code.error_label 1.20 except_end_label = code.new_label('exception_handled') 1.21 except_error_label = code.new_label('except_error') 1.22 except_return_label = code.new_label('except_return') 1.23 try_return_label = code.new_label('try_return') 1.24 - try_end_label = code.new_label('try') 1.25 + try_break_label = code.new_label('try_break') 1.26 + try_end_label = code.new_label('try_end') 1.27 1.28 code.putln("{") 1.29 code.putln("PyObject %s;" % 1.30 @@ -4059,6 +4058,7 @@ 1.31 code.putln( 1.32 "/*try:*/ {") 1.33 code.return_label = try_return_label 1.34 + code.break_label = try_break_label 1.35 self.body.generate_execution_code(code) 1.36 code.putln( 1.37 "}") 1.38 @@ -4093,6 +4093,13 @@ 1.39 for var in Naming.exc_save_vars: 1.40 code.put_xdecref(var, py_object_type) 1.41 code.put_goto(old_error_label) 1.42 + 1.43 + if code.label_used(try_break_label): 1.44 + code.put_label(try_break_label) 1.45 + for var in Naming.exc_save_vars: code.put_xgiveref(var) 1.46 + code.putln("__Pyx_ExceptionReset(%s);" % 1.47 + ', '.join(Naming.exc_save_vars)) 1.48 + code.put_goto(old_break_label) 1.49 1.50 if code.label_used(except_return_label): 1.51 code.put_label(except_return_label) 1.52 @@ -4110,6 +4117,7 @@ 1.53 code.putln("}") 1.54 1.55 code.return_label = old_return_label 1.56 + code.break_label = old_break_label 1.57 code.error_label = old_error_label 1.58 1.59 def annotate(self, code):