Files
swift-mirror/include/swift/Runtime/Exception.h
T
Mike Ash 058b1ed822 [Concurrency] Block exception propagation through swift_job_run.
When an exception is thrown through swift_job_run, it leaves the Concurrency runtime in an inconsistent state, which can lead to misbehavior or crashes later on. It's very difficult to work out what the cause is when this happens. Since the program state is doomed once this happens, prevent exceptions from propagating through swift_job_run at all, and terminate immediately when throwing.

rdar://171909991
2026-05-08 10:16:29 -04:00

53 lines
1.8 KiB
C++

//===--- Exception.h - Exception support ------------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// Swift doesn't support exception handlers, but might call code that uses
// exceptions, and when they leak out into Swift code, we want to trap them.
//
// To that end, we have our own exception personality routine, which we use
// to trap exceptions and terminate.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_RUNTIME_EXCEPTION_H
#define SWIFT_RUNTIME_EXCEPTION_H
#include "swift/Runtime/Config.h"
#if defined(__ELF__) || defined(__APPLE__)
#include <unwind.h>
namespace swift {
SWIFT_RUNTIME_STDLIB_API _Unwind_Reason_Code
_swift_exceptionPersonality(int version,
_Unwind_Action actions,
uint64_t exceptionClass,
struct _Unwind_Exception *exceptionObject,
struct _Unwind_Context *context);
#if __has_attribute(__personality__)
#define SWIFT_RUNTIME_EXCEPTION_PERSONALITY \
__attribute__((__personality__(_swift_exceptionPersonality)))
#endif
} // end namespace swift
#endif
// Make SWIFT_RUNTIME_EXCEPTION_PERSONALITY a no-op when it's not available
#ifndef SWIFT_RUNTIME_EXCEPTION_PERSONALITY
#define SWIFT_RUNTIME_EXCEPTION_PERSONALITY
#endif
#endif // SWIFT_RUNTIME_EXCEPTION_H