Skip to content

Commit fa89c52

Browse files
committed
SIL: Introduce TypeConverter::getForwardingSubstitutionsForLowering()
1 parent fa2cd6c commit fa89c52

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

include/swift/SIL/TypeLowering.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,13 @@ class TypeConverter {
10761076
/// Get the generic environment for a constant.
10771077
GenericEnvironment *getConstantGenericEnvironment(SILDeclRef constant);
10781078

1079+
/// Get the generic environment for SILGen to use. The substitution map
1080+
/// sends the generic parameters of the function's interface type into
1081+
/// archetypes, which will either be primary archetypes from this
1082+
/// environment, or local archetypes captured by this function.
1083+
std::pair<GenericEnvironment *, SubstitutionMap>
1084+
getForwardingSubstitutionsForLowering(SILDeclRef constant);
1085+
10791086
/// Returns the SIL type of a constant reference.
10801087
SILType getConstantType(TypeExpansionContext context, SILDeclRef constant) {
10811088
return getConstantInfo(context, constant).getSILType();

lib/SIL/IR/TypeLowering.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4086,6 +4086,28 @@ TypeConverter::getConstantGenericEnvironment(SILDeclRef c) {
40864086
.genericSig.getGenericEnvironment();
40874087
}
40884088

4089+
std::pair<GenericEnvironment *, SubstitutionMap>
4090+
TypeConverter::getForwardingSubstitutionsForLowering(SILDeclRef constant) {
4091+
auto sig = getGenericSignatureWithCapturedEnvironments(constant);
4092+
4093+
GenericEnvironment *genericEnv = nullptr;
4094+
SubstitutionMap forwardingSubs;
4095+
4096+
if (sig.baseGenericSig) {
4097+
genericEnv = sig.baseGenericSig.getGenericEnvironment();
4098+
forwardingSubs = genericEnv->getForwardingSubstitutionMap();
4099+
}
4100+
4101+
if (!sig.capturedEnvs.empty()) {
4102+
assert(sig.genericSig && !sig.genericSig->isEqual(sig.baseGenericSig));
4103+
4104+
forwardingSubs = buildSubstitutionMapWithCapturedEnvironments(
4105+
forwardingSubs, sig.genericSig, sig.capturedEnvs);
4106+
}
4107+
4108+
return std::make_pair(genericEnv, forwardingSubs);
4109+
}
4110+
40894111
SILType TypeConverter::getSubstitutedStorageType(TypeExpansionContext context,
40904112
AbstractStorageDecl *value,
40914113
Type lvalueType) {

0 commit comments

Comments
 (0)