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):
