mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 23:14:59 +00:00
LibJS: Leave unwind context if it has no finalizer when using handler
For example, a try/catch block with no finally. The try block and catch block do not need to unwind to a finally block, so the unwind context is no longer needed when we jump to the catch block. If we threw an exception in a catch block of a try/catch, there will be no handler or finalizer and the unit would continue on as if nothing happened. This would subsequently crash with the `m_saved_exception.is_null()` assertion failure when we next call a non-native function.
This commit is contained in:
parent
0356239f3e
commit
ada8880f58
1 changed files with 8 additions and 0 deletions
|
@ -92,6 +92,11 @@ Interpreter::ValueAndFrame Interpreter::run_and_return_frame(Executable const& e
|
|||
if (unwind_context.handler) {
|
||||
block = unwind_context.handler;
|
||||
unwind_context.handler = nullptr;
|
||||
|
||||
// If there's no finalizer, there's nowhere for the handler block to unwind to, so the unwind context is no longer needed.
|
||||
if (!unwind_context.finalizer)
|
||||
m_unwind_contexts.take_last();
|
||||
|
||||
accumulator() = exception_value;
|
||||
m_saved_exception = {};
|
||||
will_jump = true;
|
||||
|
@ -103,6 +108,9 @@ Interpreter::ValueAndFrame Interpreter::run_and_return_frame(Executable const& e
|
|||
will_jump = true;
|
||||
break;
|
||||
}
|
||||
// An unwind context with no handler or finalizer? We have nowhere to jump, and continuing on will make us crash on the next `Call` to a non-native function if there's an exception! So let's crash here instead.
|
||||
// If you run into this, you probably forgot to remove the current unwind_context somewhere.
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
if (m_pending_jump.has_value()) {
|
||||
block = m_pending_jump.release_value();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue