Skip to content

Commit f12be70

Browse files
committed
Runtime: Demangling DependentMemberType whose base type is a pack type
1 parent a21b0d9 commit f12be70

File tree

1 file changed

+38
-25
lines changed

1 file changed

+38
-25
lines changed

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,37 +1958,50 @@ class DecodedMetadataBuilder {
19581958
return BuiltType();
19591959
#endif
19601960

1961-
// FIXME: variadic-generics
1962-
19631961
auto swiftProtocol = protocol.getSwiftProtocol();
1964-
auto witnessTable = swift_conformsToProtocol(base.getMetadata(), swiftProtocol);
1965-
if (!witnessTable)
1966-
return BuiltType();
19671962

19681963
// Look for the named associated type within the protocol.
19691964
auto assocType = findAssociatedTypeByName(swiftProtocol, name);
19701965
if (!assocType) return BuiltType();
19711966

1972-
// Call the associated type access function.
1973-
#if SWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES
1974-
auto tbl = reinterpret_cast<RelativeWitnessTable *>(
1975-
const_cast<WitnessTable *>(witnessTable));
1976-
return BuiltType(
1977-
swift_getAssociatedTypeWitnessRelative(
1978-
MetadataState::Abstract,
1979-
tbl,
1980-
base.getMetadata(),
1981-
swiftProtocol->getRequirementBaseDescriptor(),
1982-
*assocType));
1983-
#else
1984-
return BuiltType(
1985-
swift_getAssociatedTypeWitness(
1986-
MetadataState::Abstract,
1987-
const_cast<WitnessTable *>(witnessTable),
1988-
base.getMetadata(),
1989-
swiftProtocol->getRequirementBaseDescriptor(),
1990-
*assocType));
1991-
#endif
1967+
auto projectDependentMemberType = [&](const Metadata *baseMetadata) -> const Metadata * {
1968+
auto witnessTable = swift_conformsToProtocol(baseMetadata, swiftProtocol);
1969+
if (!witnessTable)
1970+
return nullptr;
1971+
1972+
// Call the associated type access function.
1973+
#if SWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES
1974+
auto tbl = reinterpret_cast<RelativeWitnessTable *>(
1975+
const_cast<WitnessTable *>(witnessTable));
1976+
return swift_getAssociatedTypeWitnessRelative(
1977+
MetadataState::Abstract,
1978+
tbl,
1979+
baseMetadata,
1980+
swiftProtocol->getRequirementBaseDescriptor(),
1981+
*assocType).Value;
1982+
#else
1983+
return swift_getAssociatedTypeWitness(
1984+
MetadataState::Abstract,
1985+
const_cast<WitnessTable *>(witnessTable),
1986+
baseMetadata,
1987+
swiftProtocol->getRequirementBaseDescriptor(),
1988+
*assocType).Value;
1989+
#endif
1990+
};
1991+
1992+
if (base.isMetadata()) {
1993+
return BuiltType(projectDependentMemberType(base.getMetadata()));
1994+
} else {
1995+
MetadataPackPointer basePack = base.getMetadataPack();
1996+
1997+
llvm::SmallVector<const Metadata *, 4> packElts;
1998+
for (size_t i = 0, e = basePack.getNumElements(); i < e; ++i) {
1999+
auto *projectedElt = projectDependentMemberType(basePack.getElements()[i]);
2000+
packElts.push_back(projectedElt);
2001+
}
2002+
2003+
return BuiltType(swift_allocateMetadataPack(packElts.data(), packElts.size()));
2004+
}
19922005
}
19932006

19942007
#define REF_STORAGE(Name, ...) \

0 commit comments

Comments
 (0)