mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 16:44:58 +00:00
LibJS: Extract most of Interpreter's run() into execute_statement()
Interpreter::run() was so far being used both as the "public API entry point" for running a JS::Program as well as internally to execute JS::Statement|s of all kinds - this is now more distinctly separated. A program as returned by the parser is still going through run(), which is responsible for creating the initial global call frame, but all other statements are executed via execute_statement() directly. Fixes #3437, a regression introduced by adding ASSERT(!exception()) to run() without considering the effects that would have on internal usage.
This commit is contained in:
parent
bd6390d8cb
commit
ec43f73b74
5 changed files with 55 additions and 25 deletions
25
Libraries/LibJS/Tests/exception-in-catch-block.js
Normal file
25
Libraries/LibJS/Tests/exception-in-catch-block.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
test("Issue #1992, exception thrown in catch {} block", () => {
|
||||
var tryHasBeenExecuted = false;
|
||||
var catchHasBeenExecuted = false;
|
||||
var finallyHasBeenExecuted = false;
|
||||
expect(() => {
|
||||
try {
|
||||
tryHasBeenExecuted = true;
|
||||
foo();
|
||||
// execution must not reach this step
|
||||
expect().fail();
|
||||
} catch (e) {
|
||||
catchHasBeenExecuted = true;
|
||||
bar();
|
||||
// ...also not this step
|
||||
expect().fail();
|
||||
} finally {
|
||||
finallyHasBeenExecuted = true;
|
||||
}
|
||||
// ...or this step
|
||||
expect().fail();
|
||||
}).toThrow(ReferenceError, "'bar' is not defined");
|
||||
expect(tryHasBeenExecuted).toBeTrue();
|
||||
expect(catchHasBeenExecuted).toBeTrue();
|
||||
expect(finallyHasBeenExecuted).toBeTrue();
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue