//===--- Reflection.h - Swift Language Reflection 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 // //===----------------------------------------------------------------------===// // // An implementation of value reflection based on type metadata. // //===----------------------------------------------------------------------===// #include "swift/Runtime/ExistentialContainer.h" #include "swift/Runtime/Metadata.h" #include namespace swift { struct MirrorWitnessTable; /// The layout of protocol. struct Mirror { OpaqueExistentialContainer Header; const MirrorWitnessTable *MirrorWitness; }; // Swift assumes Mirror is returned in memory. // Use MirrorReturn to guarantee that even on architectures // where Mirror would be returned in registers. struct MirrorReturn { Mirror mirror; MirrorReturn(Mirror m) : mirror(m) { } operator Mirror() { return mirror; } ~MirrorReturn() { } }; // We intentionally use a non-POD return type with these entry points to give // them an indirect return ABI for compatibility with Swift. #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wreturn-type-c-linkage" /// func reflect(x: T) -> Mirror /// /// Produce a mirror for any value. The runtime produces a mirror that /// structurally reflects values of any type. SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT MirrorReturn swift_reflectAny(OpaqueValue *value, const Metadata *T); #pragma clang diagnostic pop }