|  | // 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 |