diff options
author | Andreas Kling <kling@serenityos.org> | 2023-05-13 18:50:27 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-05-14 06:18:28 +0200 |
commit | 81a62f4f598f22c32f676af00da464e6fa18b4a6 (patch) | |
tree | 1e7fa44a735e8f1562fa12958cd1def86e439b9c /Userland | |
parent | b01fcccbbd43abea157143ebfa64976dc389278c (diff) | |
download | serenity-81a62f4f598f22c32f676af00da464e6fa18b4a6.zip |
LibJS/Bytecode: Fix bogus program termination after `try` with `catch`
For `try` statements with a `catch` clause, we were generating *two*
"next" blocks. This meant that not throwing an exception would cause
execution to stop.
Fix this by using the "next" block pointer for the try "entry" and
"handler" blocks.
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 376705fb3e..734c345600 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -2254,10 +2254,10 @@ Bytecode::CodeGenerationErrorOr<void> TryStatement::generate_bytecode(Bytecode:: if (m_finalizer) { generator.emit<Bytecode::Op::Jump>(finalizer_target); } else { - auto& block = generator.make_block(); + if (!next_block) + next_block = &generator.make_block(); generator.emit<Bytecode::Op::LeaveUnwindContext>(); - generator.emit<Bytecode::Op::Jump>(Bytecode::Label { block }); - next_block = █ + generator.emit<Bytecode::Op::Jump>(Bytecode::Label { *next_block }); } } |