Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(635)

Unified Diff: src/isolate.cc

Issue 2378773013: [WASM] Implements catch for the wasm low level exception mechanism. (Closed)
Patch Set: updates effect dependencies. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698