Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index fd0ea5df17402521d225a050295be83f78644542..cfb6860d978b1566005f430d7854bd224dc8e9bb 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -1149,8 +1149,8 @@ Object* Isolate::UnwindAndFindHandler() { |
Address handler_sp = nullptr; |
Address handler_fp = nullptr; |
- // Special handling of termination exceptions, uncatchable by JavaScript code, |
- // we unwind the handlers until the top ENTRY handler is found. |
+ // Special handling of termination exceptions, uncatchable by JavaScript and |
+ // Wasm code, we unwind the handlers until the top ENTRY handler is found. |
bool catchable_by_js = is_catchable_by_javascript(exception); |
// Compute handler and stack unwinding information by performing a full walk |
@@ -1172,6 +1172,28 @@ Object* Isolate::UnwindAndFindHandler() { |
break; |
} |
+ if (FLAG_wasm_eh_prototype) { |
+ if (frame->is_wasm() && is_catchable_by_wasm(exception)) { |
+ int stack_slots = 0; // Will contain stack slot count of frame. |
+ WasmFrame* wasm_frame = static_cast<WasmFrame*>(frame); |
+ offset = wasm_frame->LookupExceptionHandlerInTable(&stack_slots); |
+ if (offset >= 0) { |
+ // Compute the stack pointer from the frame pointer. This ensures that |
+ // argument slots on the stack are dropped as returning would. |
+ Address return_sp = frame->fp() + |
+ StandardFrameConstants::kFixedFrameSizeAboveFp - |
+ stack_slots * kPointerSize; |
+ |
+ // Gather information from the frame. |
+ code = frame->LookupCode(); |
+ |
+ handler_sp = return_sp; |
+ handler_fp = frame->fp(); |
+ break; |
+ } |
+ } |
+ } |
+ |
// For optimized frames we perform a lookup in the handler table. |
if (frame->is_optimized() && catchable_by_js) { |
OptimizedFrame* js_frame = static_cast<OptimizedFrame*>(frame); |