summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2023-05-13 18:50:27 +0200
committerAndreas Kling <kling@serenityos.org>2023-05-14 06:18:28 +0200
commit81a62f4f598f22c32f676af00da464e6fa18b4a6 (patch)
tree1e7fa44a735e8f1562fa12958cd1def86e439b9c /Userland
parentb01fcccbbd43abea157143ebfa64976dc389278c (diff)
downloadserenity-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.cpp6
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 = &block;
+ generator.emit<Bytecode::Op::Jump>(Bytecode::Label { *next_block });
}
}