mirror of
https://github.com/SerenityOS/serenity
synced 2026-05-05 22:52:10 +02:00
LibJS: Reset scheduled-jump flag when throwing an exception
Otherwise we might attempt to follow the scheduled jump later
This commit is contained in:
committed by
Andreas Kling
parent
f5645e3c9c
commit
4da5b8ec67
@@ -277,6 +277,7 @@ void Interpreter::run_bytecode()
|
||||
|
||||
if (result.is_error()) [[unlikely]] {
|
||||
reg(Register::exception()) = *result.throw_completion().value();
|
||||
m_scheduled_jump = {};
|
||||
auto const* handler = m_current_block->handler();
|
||||
auto const* finalizer = m_current_block->finalizer();
|
||||
if (!handler && !finalizer)
|
||||
|
||||
@@ -339,3 +339,25 @@ test("labelled break in finally overrides labelled break in try", () => {
|
||||
|
||||
expect(executionOrder).toEqual([1, 2]);
|
||||
});
|
||||
|
||||
test("Throw while breaking", () => {
|
||||
const executionOrder = [];
|
||||
try {
|
||||
for (const i = 1337; ; expect().fail("Jumped to for loop update block")) {
|
||||
try {
|
||||
executionOrder.push(1);
|
||||
break;
|
||||
} finally {
|
||||
executionOrder.push(2);
|
||||
throw 1;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
executionOrder.push(3);
|
||||
}
|
||||
expect(() => {
|
||||
i;
|
||||
}).toThrowWithMessage(ReferenceError, "'i' is not defined");
|
||||
|
||||
expect(executionOrder).toEqual([1, 2, 3]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user