mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
embedded: don't re-abstract witness method calls for existentials
Don't convert indirect to direct arguments. This is needed to support general existentials in embedded swift.
This commit is contained in:
committed by
Arnold Schwaighofer
parent
920def9319
commit
60a28cd570
@@ -148,7 +148,7 @@ func specializeWitnessTable(for conformance: Conformance, _ context: ModulePassC
|
||||
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
|
||||
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
|
||||
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
|
||||
convertIndirectToDirect: true, isMandatory: true)
|
||||
convertIndirectToDirect: false, isMandatory: true)
|
||||
else {
|
||||
return origEntry
|
||||
}
|
||||
@@ -215,7 +215,7 @@ private func specializeDefaultMethods(for conformance: Conformance,
|
||||
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
|
||||
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
|
||||
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
|
||||
convertIndirectToDirect: true, isMandatory: true)
|
||||
convertIndirectToDirect: false, isMandatory: true)
|
||||
else {
|
||||
return origEntry
|
||||
}
|
||||
|
||||
@@ -216,7 +216,9 @@ public:
|
||||
|
||||
ReabstractionInfo(CanSILFunctionType substitutedType,
|
||||
SILDeclRef methodDecl,
|
||||
bool convertIndirectToDirect,
|
||||
SILModule &M) :
|
||||
ConvertIndirectToDirect(convertIndirectToDirect),
|
||||
SubstitutedType(substitutedType),
|
||||
methodDecl(methodDecl),
|
||||
M(&M), isWholeModule(M.isWholeModule()) {}
|
||||
|
||||
@@ -2413,7 +2413,8 @@ bool swift::specializeClassMethodInst(ClassMethodInst *cm) {
|
||||
SILType substitutedType =
|
||||
funcTy.substGenericArgs(m, subs, TypeExpansionContext::minimal());
|
||||
|
||||
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), cm->getMember(), m);
|
||||
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), cm->getMember(),
|
||||
/*convertIndirectToDirect=*/ true, m);
|
||||
reInfo.createSubstitutedAndSpecializedTypes();
|
||||
CanSILFunctionType finalFuncTy = reInfo.getSpecializedType();
|
||||
SILType finalSILTy = SILType::getPrimitiveObjectType(finalFuncTy);
|
||||
@@ -2465,7 +2466,8 @@ bool swift::specializeWitnessMethodInst(WitnessMethodInst *wm) {
|
||||
SILType substitutedType =
|
||||
funcTy.substGenericArgs(m, subs, TypeExpansionContext::minimal());
|
||||
|
||||
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), wm->getMember(), m);
|
||||
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), wm->getMember(),
|
||||
/*convertIndirectToDirect=*/ false, m);
|
||||
reInfo.createSubstitutedAndSpecializedTypes();
|
||||
CanSILFunctionType finalFuncTy = reInfo.getSpecializedType();
|
||||
SILType finalSILTy = SILType::getPrimitiveObjectType(finalFuncTy);
|
||||
|
||||
Reference in New Issue
Block a user