Index: base/mac/call_with_eh_frame.cc |
diff --git a/base/mac/call_with_eh_frame.cc b/base/mac/call_with_eh_frame.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8ea6f75b4bfd896d026cca477ceb2eb0013aa391 |
--- /dev/null |
+++ b/base/mac/call_with_eh_frame.cc |
@@ -0,0 +1,37 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/mac/call_with_eh_frame.h" |
+ |
+#include <unwind.h> |
+ |
+#include "build/build_config.h" |
+ |
+namespace base { |
+namespace mac { |
+ |
+_Unwind_Reason_Code CxxPersonalityRoutine( |
+ int version, |
+ _Unwind_Action actions, |
+ uint64_t exceptionClass, |
+ struct _Unwind_Exception* exceptionObject, |
+ struct _Unwind_Context* context) { |
+ // Tell libunwind that this is the end of the stack. When it encounters the |
+ // CallWithEHFrame, it will stop searching for an exception handler. The |
+ // result is that no exception handler has been found higher on the stack, |
+ // and any that are lower on the stack (e.g. in CFRunLoopRunSpecific), will |
+ // now be skipped. Since this is reporting the end of the stack, and no |
+ // exception handler will have been found, std::terminate() will be called. |
+ return _URC_END_OF_STACK; |
+} |
+ |
+#if defined(OS_IOS) |
+// No iOS assembly implementation exists, so just call the block directly. |
+void CallWithEHFrame(void (^block)(void)) { |
+ block(); |
+} |
+#endif |
+ |
+} // namespace mac |
+} // namespace base |