summaryrefslogtreecommitdiff
path: root/deps/v8/src/trap-handler/handler-outside-win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/trap-handler/handler-outside-win.cc')
-rw-r--r--deps/v8/src/trap-handler/handler-outside-win.cc39
1 files changed, 32 insertions, 7 deletions
diff --git a/deps/v8/src/trap-handler/handler-outside-win.cc b/deps/v8/src/trap-handler/handler-outside-win.cc
index 3bfcb05a1f..09673c8ccc 100644
--- a/deps/v8/src/trap-handler/handler-outside-win.cc
+++ b/deps/v8/src/trap-handler/handler-outside-win.cc
@@ -4,9 +4,9 @@
// PLEASE READ BEFORE CHANGING THIS FILE!
//
-// This file implements the support code for the out of bounds signal handler.
-// Nothing in here actually runs in the signal handler, but the code here
-// manipulates data structures used by the signal handler so we still need to be
+// This file implements the support code for the out of bounds trap handler.
+// Nothing in here actually runs in the trap handler, but the code here
+// manipulates data structures used by the trap handler so we still need to be
// careful. In order to minimize this risk, here are some rules to follow.
//
// 1. Avoid introducing new external dependencies. The files in src/trap-handler
@@ -17,18 +17,43 @@
//
// For more information, see https://goo.gl/yMeyUY.
//
-// For the code that runs in the signal handler itself, see handler-inside.cc.
+// For the code that runs in the trap handler itself, see handler-inside.cc.
+
+#include <windows.h>
+
+#include "src/trap-handler/handler-inside-win.h"
+#include "src/trap-handler/trap-handler.h"
namespace v8 {
namespace internal {
namespace trap_handler {
#if V8_TRAP_HANDLER_SUPPORTED
+
+namespace {
+
+// A handle to our registered exception handler, so that we can remove it
+// again later.
+void* g_registered_handler = nullptr;
+
+} // namespace
+
bool RegisterDefaultTrapHandler() {
- // Not yet implemented
- return false;
+ constexpr ULONG first = TRUE;
+ CHECK_NULL(g_registered_handler);
+ g_registered_handler = AddVectoredExceptionHandler(first, HandleWasmTrap);
+
+ return nullptr != g_registered_handler;
}
-#endif
+
+void RemoveTrapHandler() {
+ if (!g_registered_handler) return;
+
+ RemoveVectoredExceptionHandler(g_registered_handler);
+ g_registered_handler = nullptr;
+}
+
+#endif // V8_TRAP_HANDLER_SUPPORTED
} // namespace trap_handler
} // namespace internal