mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The dumper method dumps: 1. The container's metadata pointer. 2. A pointer to the container's value. 3. Whether or not said value is stored inline in the container. This provides a general overview that can be used even when working with SIL code in the debugger by grabbing a pointer to swift Anys and then calling the c++ any method upon them. The verifier is intended to be used in conjunction with ASAN for maximum effect to catch use-after-frees of existential boxes. While implementing this I refactored some code from ExistentialTypeMetadata into methods on OpaqueExistentialContainer. ExistentialTypeMetadata just calls these methods now instead of implementing the code inline.
58 lines
1.8 KiB
C++
58 lines
1.8 KiB
C++
//===--- 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
|
|
|
|
}
|