Exceptions raised in 'else' should run 'finally' before raising, not run 'except'
This commit is contained in:
parent
2f18ecbaa1
commit
9bd257e625
@ -2260,9 +2260,16 @@ _anotherExcept:
|
|||||||
consume(TOKEN_COLON, "Expected ':' after 'else'.");
|
consume(TOKEN_COLON, "Expected ':' after 'else'.");
|
||||||
patchJump(exitJumpOffsets[0]);
|
patchJump(exitJumpOffsets[0]);
|
||||||
firstJump = 1;
|
firstJump = 1;
|
||||||
|
emitByte(OP_TRY_ELSE);
|
||||||
beginScope(state);
|
beginScope(state);
|
||||||
block(state, blockWidth, "else");
|
block(state, blockWidth, "else");
|
||||||
endScope(state);
|
endScope(state);
|
||||||
|
if (nextJump == -1) {
|
||||||
|
/* If there were no except: blocks, we need to make sure that the
|
||||||
|
* 'try' handler goes directly to the finally, so that 'break'/'continue'
|
||||||
|
* within the 'try' does not run this 'else' step. */
|
||||||
|
patchJump(tryJump);
|
||||||
|
}
|
||||||
goto _anotherExcept;
|
goto _anotherExcept;
|
||||||
} else if (match(TOKEN_FINALLY)) {
|
} else if (match(TOKEN_FINALLY)) {
|
||||||
consume(TOKEN_COLON, "Expected ':' after 'finally'.");
|
consume(TOKEN_COLON, "Expected ':' after 'finally'.");
|
||||||
|
@ -111,3 +111,4 @@ SIMPLE(OP_INHERIT)
|
|||||||
JUMP(OP_CALL_ITER,+)
|
JUMP(OP_CALL_ITER,+)
|
||||||
JUMP(OP_JUMP_IF_TRUE_OR_POP,+)
|
JUMP(OP_JUMP_IF_TRUE_OR_POP,+)
|
||||||
OPERAND(OP_EXIT_LOOP, (void)0)
|
OPERAND(OP_EXIT_LOOP, (void)0)
|
||||||
|
SIMPLE(OP_TRY_ELSE)
|
||||||
|
6
src/vm.c
6
src/vm.c
@ -2414,6 +2414,12 @@ _finishReturn: (void)0;
|
|||||||
krk_push(BOOLEAN_VAL(isMatch));
|
krk_push(BOOLEAN_VAL(isMatch));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case OP_TRY_ELSE: {
|
||||||
|
if (IS_HANDLER(krk_peek(0))) {
|
||||||
|
krk_currentThread.stackTop[-1] = HANDLER_VAL(OP_FILTER_EXCEPT,AS_HANDLER_TARGET(krk_peek(0)));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case OP_BEGIN_FINALLY: {
|
case OP_BEGIN_FINALLY: {
|
||||||
if (IS_HANDLER(krk_peek(0))) {
|
if (IS_HANDLER(krk_peek(0))) {
|
||||||
if (AS_HANDLER_TYPE(krk_peek(0)) == OP_PUSH_TRY) {
|
if (AS_HANDLER_TYPE(krk_peek(0)) == OP_PUSH_TRY) {
|
||||||
|
12
test/testTryElseRaise.krk
Normal file
12
test/testTryElseRaise.krk
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
try:
|
||||||
|
try:
|
||||||
|
print("good")
|
||||||
|
except:
|
||||||
|
print("bad")
|
||||||
|
else:
|
||||||
|
print('else')
|
||||||
|
raise ValueError
|
||||||
|
finally:
|
||||||
|
print('finally')
|
||||||
|
except ValueError:
|
||||||
|
print("raised ValueError as expected")
|
4
test/testTryElseRaise.krk.expect
Normal file
4
test/testTryElseRaise.krk.expect
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
good
|
||||||
|
else
|
||||||
|
finally
|
||||||
|
raised ValueError as expected
|
Loading…
Reference in New Issue
Block a user