cython-devel

changeset 1781:6c54ca49c2af

Fix memleak in try-continue
author Robert Bradshaw <robertwb@math.washington.edu>
date Thu Feb 26 00:38:33 2009 -0800 (2 years ago)
parents d2d71289fa0c
children e66a36990c06
files Cython/Compiler/Nodes.py
line diff
1.1 --- a/Cython/Compiler/Nodes.py Wed Feb 25 23:48:44 2009 -0800 1.2 +++ b/Cython/Compiler/Nodes.py Thu Feb 26 00:38:33 2009 -0800 1.3 @@ -4039,6 +4039,7 @@ 1.4 def generate_execution_code(self, code): 1.5 old_return_label = code.return_label 1.6 old_break_label = code.break_label 1.7 + old_continue_label = code.continue_label 1.8 old_error_label = code.new_error_label() 1.9 our_error_label = code.error_label 1.10 except_end_label = code.new_label('exception_handled') 1.11 @@ -4046,6 +4047,7 @@ 1.12 except_return_label = code.new_label('except_return') 1.13 try_return_label = code.new_label('try_return') 1.14 try_break_label = code.new_label('try_break') 1.15 + try_continue_label = code.new_label('try_continue') 1.16 try_end_label = code.new_label('try_end') 1.17 1.18 code.putln("{") 1.19 @@ -4059,6 +4061,7 @@ 1.20 "/*try:*/ {") 1.21 code.return_label = try_return_label 1.22 code.break_label = try_break_label 1.23 + code.continue_label = try_continue_label 1.24 self.body.generate_execution_code(code) 1.25 code.putln( 1.26 "}") 1.27 @@ -4100,6 +4103,13 @@ 1.28 code.putln("__Pyx_ExceptionReset(%s);" % 1.29 ', '.join(Naming.exc_save_vars)) 1.30 code.put_goto(old_break_label) 1.31 + 1.32 + if code.label_used(try_continue_label): 1.33 + code.put_label(try_continue_label) 1.34 + for var in Naming.exc_save_vars: code.put_xgiveref(var) 1.35 + code.putln("__Pyx_ExceptionReset(%s);" % 1.36 + ', '.join(Naming.exc_save_vars)) 1.37 + code.put_goto(old_continue_label) 1.38 1.39 if code.label_used(except_return_label): 1.40 code.put_label(except_return_label) 1.41 @@ -4118,6 +4128,7 @@ 1.42 1.43 code.return_label = old_return_label 1.44 code.break_label = old_break_label 1.45 + code.continue_label = old_continue_label 1.46 code.error_label = old_error_label 1.47 1.48 def annotate(self, code): 1.49 @@ -4219,10 +4230,13 @@ 1.50 self.excinfo_tuple.generate_evaluation_code(code) 1.51 self.excinfo_target.generate_assignment_code(self.excinfo_tuple, code) 1.52 1.53 + 1.54 + old_break_label, old_continue_label = code.break_label, code.continue_label 1.55 + code.break_label = code.new_label('except_break') 1.56 + code.continue_label = code.new_label('except_continue') 1.57 + 1.58 old_exc_vars = code.funcstate.exc_vars 1.59 code.funcstate.exc_vars = self.exc_vars 1.60 - old_break_label = code.break_label 1.61 - code.break_label = code.new_label('except_break') 1.62 self.body.generate_execution_code(code) 1.63 code.funcstate.exc_vars = old_exc_vars 1.64 for var in self.exc_vars: 1.65 @@ -4235,6 +4249,14 @@ 1.66 code.putln("__Pyx_DECREF(%s); %s = 0;" % (var, var)) 1.67 code.put_goto(old_break_label) 1.68 code.break_label = old_break_label 1.69 + 1.70 + if code.label_used(code.continue_label): 1.71 + code.put_label(code.continue_label) 1.72 + for var in self.exc_vars: 1.73 + code.putln("__Pyx_DECREF(%s); %s = 0;" % (var, var)) 1.74 + code.put_goto(old_continue_label) 1.75 + code.continue_label = old_continue_label 1.76 + 1.77 code.putln( 1.78 "}") 1.79