mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
129 lines
4.3 KiB
C++
129 lines
4.3 KiB
C++
//===--- SwiftRemoteMirror.cpp - C wrapper for Reflection API -------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See http://swift.org/LICENSE.txt for license information
|
|
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/Reflection/ReflectionContext.h"
|
|
#include "swift/Reflection/TypeLowering.h"
|
|
#include "swift/Remote/CMemoryReader.h"
|
|
#include "swift/SwiftRemoteMirror/SwiftRemoteMirror.h"
|
|
|
|
using namespace swift;
|
|
using namespace swift::reflection;
|
|
using namespace swift::remote;
|
|
|
|
using NativeReflectionContext
|
|
= ReflectionContext<External<RuntimeTarget<sizeof(uintptr_t)>>>;
|
|
|
|
SwiftReflectionContextRef
|
|
swift_reflection_createReflectionContext(PointerSizeFunction getPointerSize,
|
|
SizeSizeFunction getSizeSize,
|
|
ReadBytesFunction readBytes,
|
|
GetStringLengthFunction getStringLength,
|
|
GetSymbolAddressFunction getSymbolAddress) {
|
|
MemoryReaderImpl ReaderImpl {
|
|
getPointerSize,
|
|
getSizeSize,
|
|
readBytes,
|
|
getStringLength,
|
|
getSymbolAddress
|
|
};
|
|
|
|
auto Reader = std::make_shared<CMemoryReader>(ReaderImpl);
|
|
auto Context
|
|
= new ReflectionContext<External<RuntimeTarget<sizeof(uintptr_t)>>>(Reader);
|
|
return reinterpret_cast<SwiftReflectionContextRef>(Context);
|
|
}
|
|
|
|
void swift_reflection_destroyReflectionContext(SwiftReflectionContextRef ContextRef) {
|
|
auto Context = reinterpret_cast<ReflectionContext<InProcess> *>(ContextRef);
|
|
delete Context;
|
|
}
|
|
|
|
void
|
|
swift_reflection_addReflectionInfo(SwiftReflectionContextRef ContextRef,
|
|
const char *ImageName,
|
|
swift_reflection_section_t fieldmd,
|
|
swift_reflection_section_t assocty,
|
|
swift_reflection_section_t builtin,
|
|
swift_reflection_section_t typeref,
|
|
swift_reflection_section_t reflstr) {
|
|
ReflectionInfo Info {
|
|
ImageName,
|
|
FieldSection(fieldmd.Begin, fieldmd.End),
|
|
AssociatedTypeSection(assocty.Begin, assocty.End),
|
|
BuiltinTypeSection(builtin.Begin, builtin.End),
|
|
GenericSection(typeref.Begin, typeref.End),
|
|
GenericSection(reflstr.Begin, reflstr.End)
|
|
};
|
|
auto Context = reinterpret_cast<NativeReflectionContext *>(ContextRef);
|
|
Context->addReflectionInfo(Info);
|
|
}
|
|
|
|
swift_typeref_t
|
|
swift_reflection_typeRefForMetadata(SwiftReflectionContextRef ContextRef,
|
|
uintptr_t metadata) {
|
|
auto Context = reinterpret_cast<NativeReflectionContext *>(ContextRef);
|
|
auto TR = Context->readTypeFromMetadata(metadata);
|
|
return reinterpret_cast<swift_typeref_t>(TR);
|
|
}
|
|
|
|
swift_typeref_t
|
|
swift_reflection_genericArgumentOfTypeRef(swift_typeref_t OpaqueTypeRef,
|
|
unsigned Index) {
|
|
auto TR = reinterpret_cast<const TypeRef *>(OpaqueTypeRef);
|
|
|
|
if (auto BG = dyn_cast<BoundGenericTypeRef>(TR)) {
|
|
auto &Params = BG->getGenericParams();
|
|
if (Index < Params.size()) {
|
|
return reinterpret_cast<swift_typeref_t>(Params[Index]);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
swift_typeinfo_t
|
|
swift_reflection_infoForTypeRef(SwiftReflectionContextRef ContextRef,
|
|
swift_typeref_t OpaqueTypeRef) {
|
|
auto Context = reinterpret_cast<NativeReflectionContext *>(ContextRef);
|
|
auto TR = reinterpret_cast<const TypeRef *>(OpaqueTypeRef);
|
|
auto TI = Context->getTypeInfo(TR);
|
|
|
|
// TODO
|
|
(void) TI;
|
|
|
|
return {
|
|
SWIFT_UNKNOWN,
|
|
NULL,
|
|
0,
|
|
0,
|
|
0
|
|
};
|
|
}
|
|
|
|
swift_childinfo_t
|
|
swift_reflection_infoForChild(SwiftReflectionContextRef ContextRef,
|
|
swift_typeref_t OpaqueTypeRef,
|
|
unsigned Index) {
|
|
auto Context = reinterpret_cast<NativeReflectionContext *>(ContextRef);
|
|
auto TR = reinterpret_cast<const TypeRef *>(OpaqueTypeRef);
|
|
auto TI = Context->getTypeInfo(TR);
|
|
|
|
// TODO
|
|
(void) TI;
|
|
|
|
return {
|
|
0,
|
|
NULL,
|
|
0,
|
|
};
|
|
}
|
|
|