LibJS: Cleanup unwind state when transferring control out of a finalizer

This does two things:
* Clear exceptions when transferring control out of a finalizer
  Otherwise they would resurface at the end of the next finalizer
  (see test the new test case), or at the end of a function
* Pop one scheduled jump when transferring control out of a finalizer
  This removes one old FIXME
This commit is contained in:
Hendiadyoin1 2024-04-11 11:58:18 +02:00 committed by Andreas Kling
commit ada5027163
Notes: sideshowbarker 2024-07-17 06:38:11 +09:00
8 changed files with 65 additions and 6 deletions

View file

@ -2443,7 +2443,11 @@ Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> TryStatement::gener
auto& finalizer_block = generator.make_block();
generator.switch_to_basic_block(finalizer_block);
generator.emit<Bytecode::Op::LeaveUnwindContext>();
generator.start_boundary(Bytecode::Generator::BlockBoundaryType::LeaveFinally);
(void)TRY(m_finalizer->generate_bytecode(generator));
generator.end_boundary(Bytecode::Generator::BlockBoundaryType::LeaveFinally);
if (!generator.is_current_block_terminated()) {
next_block = &generator.make_block();
auto next_target = Bytecode::Label { *next_block };