Skip to content

Commit 1708696

Browse files
committed
Runtime: Add swift_getTypePackByMangledName() entry point
For now this has SWIFT_RUNTIME_LIBRARY_VISIBILITY, but in the future we might want to make it public so that IRGen can use it to build packs out of concrete types.
1 parent cdd1c6d commit 1708696

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

include/swift/ABI/Metadata.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4917,6 +4917,8 @@ class TargetPackPointer {
49174917
using PointerType = typename Runtime::template Pointer<const Pointee<Runtime>>;
49184918

49194919
public:
4920+
explicit TargetPackPointer() : Ptr(0) {}
4921+
49204922
explicit TargetPackPointer(typename Runtime::StoredSize rawPtr) : Ptr(rawPtr) {}
49214923

49224924
explicit TargetPackPointer(const void *rawPtr)
@@ -4926,6 +4928,10 @@ class TargetPackPointer {
49264928
: Ptr(reinterpret_cast<typename Runtime::StoredSize>(ptr) |
49274929
(lifetime == PackLifetime::OnHeap ? 1 : 0)) {}
49284930

4931+
explicit operator bool() const {
4932+
return Ptr != 0;
4933+
}
4934+
49294935
// Strips off the LSB.
49304936
const PointerType *getElements() const {
49314937
return reinterpret_cast<const PointerType *>(Ptr & ~1);

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,6 +2301,34 @@ swift_stdlib_getTypeByMangledNameUntrusted(const char *typeNameStart,
23012301
{}, {}).getType().getMetadata();
23022302
}
23032303

2304+
TypeLookupErrorOr<MetadataPackPointer>
2305+
swift::getTypePackByMangledName(StringRef typeName,
2306+
const void *const *origArgumentVector,
2307+
SubstGenericParameterFn substGenericParam,
2308+
SubstDependentWitnessTableFn substWitnessTable) {
2309+
DemanglerForRuntimeTypeResolution<StackAllocatedDemangler<2048>> demangler;
2310+
2311+
NodePointer node = demangler.demangleTypeRef(typeName);
2312+
if (!node)
2313+
return TypeLookupError("Demangling failed");
2314+
2315+
DecodedMetadataBuilder builder(demangler, substGenericParam,
2316+
substWitnessTable);
2317+
auto type = Demangle::decodeMangledType(builder, node);
2318+
if (type.isError()) {
2319+
return *type.getError();
2320+
}
2321+
if (!type.getType()) {
2322+
return TypeLookupError("NULL type but no error provided");
2323+
}
2324+
2325+
if (!type.getType().isMetadataPack()) {
2326+
return TypeLookupError("This entry point is only for packs");
2327+
}
2328+
2329+
return type.getType().getMetadataPack();
2330+
}
2331+
23042332
// ==== Function metadata functions ----------------------------------------------
23052333

23062334
static llvm::Optional<llvm::StringRef>

stdlib/public/runtime/Private.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,20 @@ class TypeInfo {
477477
const void * const *arguments,
478478
SubstGenericParameterFn substGenericParam,
479479
SubstDependentWitnessTableFn substWitnessTable);
480+
481+
/// Retrieve the type metadata pack described by the given type name.
482+
///
483+
/// \p substGenericParam Function that provides generic argument metadata
484+
/// given a particular generic parameter specified by depth/index.
485+
/// \p substWitnessTable Function that provides witness tables given a
486+
/// particular dependent conformance index.
487+
SWIFT_RUNTIME_LIBRARY_VISIBILITY
488+
TypeLookupErrorOr<MetadataPackPointer> getTypePackByMangledName(
489+
StringRef typeName,
490+
const void * const *arguments,
491+
SubstGenericParameterFn substGenericParam,
492+
SubstDependentWitnessTableFn substWitnessTable);
493+
480494
#pragma clang diagnostic pop
481495

482496
/// Gather generic parameter counts from a context descriptor.

0 commit comments

Comments
 (0)