Skip to content

Commit

Permalink
LibJS: Reset scheduled-jump flag when throwing an exception
Browse files Browse the repository at this point in the history
Otherwise we might attempt to follow the scheduled jump later
  • Loading branch information
Hendiadyoin1 authored and awesomekling committed Oct 30, 2023
1 parent f5645e3 commit 4da5b8e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
1 change: 1 addition & 0 deletions Userland/Libraries/LibJS/Bytecode/Interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
22 changes: 22 additions & 0 deletions Userland/Libraries/LibJS/Tests/try-finally-break.js
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
});

0 comments on commit 4da5b8e

Please sign in to comment.