blob: 1d62e0851c62bc35c8820ad5722e07aea3cd33ae [file] [log] [blame]
//===--- 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 <cstdlib>
namespace swift {
struct MirrorWitnessTable;
/// The layout of protocol<Mirror>.
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<T>(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
}