Skip to content

Commit c786ca4

Browse files
authored
Merge pull request #21214 from jckarter/key-path-generic-environment-or-context-5.0
[5.0] KeyPath: Allow existing context descriptors to be used as generic environment.
2 parents 890e1c1 + df523d4 commit c786ca4

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

lib/IRGen/GenKeyPath.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,17 +1305,10 @@ void IRGenModule::emitSILProperty(SILProperty *prop) {
13051305
{},
13061306
hasSubscriptIndices);
13071307

1308-
auto size = fields.getNextOffsetFromGlobal();
1309-
13101308
auto var = cast<llvm::GlobalVariable>(
13111309
getAddrOfPropertyDescriptor(prop->getDecl(),
13121310
fields.finishAndCreateFuture()));
13131311
var->setConstant(true);
13141312
var->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1315-
// A simple stored component descriptor can fit in four bytes. Anything else
1316-
// needs pointer alignment.
1317-
if (size <= Size(4))
1318-
var->setAlignment(4);
1319-
else
1320-
var->setAlignment(getPointerAlignment().getValue());
1313+
var->setAlignment(4);
13211314
}

stdlib/public/core/KeyPath.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2401,6 +2401,29 @@ internal func _getSymbolicMangledNameLength(_ base: UnsafeRawPointer) -> Int {
24012401
return end - base
24022402
}
24032403

2404+
// Resolve a mangled name in a generic environment, described by either a
2405+
// flat GenericEnvironment * (if the bottom tag bit is 0) or possibly-nested
2406+
// ContextDescriptor * (if the bottom tag bit is 1)
2407+
internal func _getTypeByMangledNameInEnvironmentOrContext(
2408+
_ name: UnsafePointer<UInt8>,
2409+
_ nameLength: UInt,
2410+
genericEnvironmentOrContext: UnsafeRawPointer?,
2411+
genericArguments: UnsafeRawPointer?)
2412+
-> Any.Type? {
2413+
2414+
let taggedPointer = UInt(bitPattern: genericEnvironmentOrContext)
2415+
if taggedPointer & 1 == 0 {
2416+
return _getTypeByMangledNameInEnvironment(name, nameLength,
2417+
genericEnvironment: genericEnvironmentOrContext,
2418+
genericArguments: genericArguments)
2419+
} else {
2420+
let context = UnsafeRawPointer(bitPattern: taggedPointer & ~1)
2421+
return _getTypeByMangledNameInContext(name, nameLength,
2422+
genericContext: context,
2423+
genericArguments: genericArguments)
2424+
}
2425+
}
2426+
24042427
// Resolve the given generic argument reference to a generic argument.
24052428
internal func _resolveKeyPathGenericArgReference(
24062429
_ reference: UnsafeRawPointer,
@@ -2436,8 +2459,8 @@ internal func _resolveKeyPathGenericArgReference(
24362459
capacity: nameLength + 1)
24372460
// FIXME: Could extract this information from the mangled name.
24382461
guard let result =
2439-
_getTypeByMangledName(namePtr, UInt(nameLength),
2440-
genericEnvironment: genericEnvironment,
2462+
_getTypeByMangledNameInEnvironmentOrContext(namePtr, UInt(nameLength),
2463+
genericEnvironmentOrContext: genericEnvironment,
24412464
genericArguments: arguments)
24422465
else {
24432466
let nameStr = String._fromUTF8Repairing(

stdlib/public/core/Misc.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,17 @@ internal func _getTypeByMangledNameUntrusted(
9696
-> Any.Type?
9797

9898
@_silgen_name("swift_getTypeByMangledNameInEnvironment")
99-
internal func _getTypeByMangledName(
99+
public func _getTypeByMangledNameInEnvironment(
100100
_ name: UnsafePointer<UInt8>,
101101
_ nameLength: UInt,
102102
genericEnvironment: UnsafeRawPointer?,
103103
genericArguments: UnsafeRawPointer?)
104104
-> Any.Type?
105+
106+
@_silgen_name("swift_getTypeByMangledNameInContext")
107+
public func _getTypeByMangledNameInContext(
108+
_ name: UnsafePointer<UInt8>,
109+
_ nameLength: UInt,
110+
genericContext: UnsafeRawPointer?,
111+
genericArguments: UnsafeRawPointer?)
112+
-> Any.Type?

0 commit comments

Comments
 (0)