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
