Skip to content

Commit 1f5f6db

Browse files
authored
Merge pull request #21186 from jckarter/public-getTypeByMangledName
Runtime: Make getTypeByMangledNameIn(Context|Environment) a public entry point.
2 parents 101e9ec + 021053d commit 1f5f6db

File tree

3 files changed

+33
-11
lines changed

3 files changed

+33
-11
lines changed

stdlib/public/core/Misc.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func _typeByName(_ name: String) -> Any.Type? {
9191
}
9292
}
9393

94-
@_silgen_name("swift_stdlib_getTypeByMangledName")
94+
@_silgen_name("swift_getTypeByMangledNameInEnvironment")
9595
internal func _getTypeByMangledName(
9696
_ name: UnsafePointer<UInt8>,
9797
_ nameLength: UInt,

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,9 +1269,9 @@ TypeInfo swift_getTypeByMangledNameImpl(
12691269
substWitnessTable);
12701270
}
12711271

1272-
SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL
1272+
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
12731273
const Metadata * _Nullable
1274-
swift_stdlib_getTypeByMangledName(
1274+
swift_getTypeByMangledNameInEnvironment(
12751275
const char *typeNameStart,
12761276
size_t typeNameLength,
12771277
const TargetGenericEnvironment<InProcess> *environment,
@@ -1285,6 +1285,22 @@ swift_stdlib_getTypeByMangledName(
12851285
return swift_checkMetadataState(MetadataState::Complete, metadata).Value;
12861286
}
12871287

1288+
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
1289+
const Metadata * _Nullable
1290+
swift_getTypeByMangledNameInContext(
1291+
const char *typeNameStart,
1292+
size_t typeNameLength,
1293+
const TargetContextDescriptor<InProcess> *context,
1294+
const void * const *genericArgs) {
1295+
llvm::StringRef typeName(typeNameStart, typeNameLength);
1296+
SubstGenericParametersFromMetadata substitutions(context, genericArgs);
1297+
auto metadata = swift_getTypeByMangledName(typeName, substitutions,
1298+
substitutions);
1299+
if (!metadata) return nullptr;
1300+
1301+
return swift_checkMetadataState(MetadataState::Complete, metadata).Value;
1302+
}
1303+
12881304
#if SWIFT_OBJC_INTEROP
12891305

12901306
// Return the ObjC class for the given type name.
@@ -1301,9 +1317,9 @@ static objc_hook_getClass OldGetClassHook;
13011317
static BOOL
13021318
getObjCClassByMangledName(const char * _Nonnull typeName,
13031319
Class _Nullable * _Nonnull outClass) {
1304-
auto metadata = swift_stdlib_getTypeByMangledName(typeName, strlen(typeName),
1305-
/* no substitutions */
1306-
nullptr, nullptr);
1320+
auto metadata = swift_getTypeByMangledNameInEnvironment(typeName, strlen(typeName),
1321+
/* no substitutions */
1322+
nullptr, nullptr);
13071323
if (metadata) {
13081324
auto objcClass =
13091325
reinterpret_cast<Class>(
@@ -1421,9 +1437,8 @@ void SubstGenericParametersFromMetadata::setup() const {
14211437
if (!descriptorPath.empty())
14221438
return;
14231439

1424-
if (sourceIsMetadata && base) {
1425-
auto descriptor = base->getTypeContextDescriptor();
1426-
numKeyGenericParameters = buildDescriptorPath(descriptor);
1440+
if (sourceIsMetadata && baseContext) {
1441+
numKeyGenericParameters = buildDescriptorPath(baseContext);
14271442
return;
14281443
}
14291444

stdlib/public/runtime/Private.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ class TypeInfo {
245245
const bool sourceIsMetadata;
246246

247247
union {
248-
const Metadata *base;
248+
const TargetContextDescriptor<InProcess> *baseContext;
249249
const TargetGenericEnvironment<InProcess> *environment;
250250
};
251251

@@ -293,9 +293,16 @@ class TypeInfo {
293293
public:
294294
/// Produce substitutions entirely from the given metadata.
295295
explicit SubstGenericParametersFromMetadata(const Metadata *base)
296-
: sourceIsMetadata(true), base(base),
296+
: sourceIsMetadata(true), baseContext(base->getTypeContextDescriptor()),
297297
genericArgs(base ? (const void * const *)base->getGenericArgs()
298298
: nullptr) { }
299+
300+
/// Produce substitutions from the given instantiation arguments for the
301+
/// given context.
302+
explicit SubstGenericParametersFromMetadata(const ContextDescriptor *base,
303+
const void * const *args)
304+
: sourceIsMetadata(true), baseContext(base), genericArgs(args)
305+
{}
299306

300307
/// Produce substitutions from the given instantiation arguments for the
301308
/// given generic environment.

0 commit comments

Comments
 (0)