core: Fix restoration of loop target in try statement

I am not sure why this occurs either, it only appears that after the
assignment, `old_loop_target` and `loop_target` are both referencing the
same variable, causing the next line to set both variables as None.
David Mak 2023-09-21 16:17:29 +08:00
parent 025fb089c9
commit 49660c4e6f
2 changed files with 39 additions and 2 deletions

View File

@ -789,7 +789,9 @@ pub fn gen_try<'ctx, 'a, G: CodeGenerator>(
ctx.outer_catch_clauses = old_clauses;
ctx.unwind_target = old_unwind;
ctx.return_target = old_return;
ctx.loop_target = old_loop_target;
if let Some(old_loop_target) = old_loop_target {
ctx.loop_target.replace(old_loop_target);
}
old_loop_target = None;
let old_unwind = if !finalbody.is_empty() {
@ -911,7 +913,9 @@ pub fn gen_try<'ctx, 'a, G: CodeGenerator>(
}
ctx.unwind_target = old_unwind;
ctx.loop_target = old_loop_target;
if let Some(old_loop_target) = old_loop_target {
ctx.loop_target.replace(old_loop_target);
}
ctx.return_target = old_return;
ctx.builder.position_at_end(landingpad);

View File

@ -0,0 +1,33 @@
# Break within try statement within a loop
# Taken from https://book.pythontips.com/en/latest/for_-_else.html
@extern
def output_int32(x: int32, newline: bool=True):
...
@extern
def output_float64(x: float, newline: bool=True):
...
@extern
def output_str(x: str, newline: bool=True):
...
def run() -> int32:
for n in range(2, 10):
for x in range(2, n):
try:
if n % x == 0:
output_int32(n, newline=False)
output_str(" equals ", newline=False)
output_int32(x, newline=False)
output_str(" * ", newline=False)
output_float64(n / x)
except: # Assume this is intended to catch x == 0
break
else:
# loop fell through without finding a factor
output_int32(n, newline=False)
output_str(" is a prime number")
return 0