@@ -1188,7 +1188,7 @@ struct MetadataOrPack {
11881188// / Use with \c _getTypeByMangledName to decode potentially-generic types.
11891189class SubstGenericParametersFromWrittenArgs {
11901190 // / The complete set of generic arguments.
1191- const llvm::SmallVectorImpl<const Metadata * > &allGenericArgs;
1191+ const llvm::SmallVectorImpl<MetadataOrPack > &allGenericArgs;
11921192
11931193 // / The counts of generic parameters at each level.
11941194 const llvm::SmallVectorImpl<unsigned > &genericParamCounts;
@@ -1205,7 +1205,7 @@ class SubstGenericParametersFromWrittenArgs {
12051205 // / \param genericParamCounts The count of generic parameters at each
12061206 // / generic level, typically gathered by _gatherGenericParameterCounts.
12071207 explicit SubstGenericParametersFromWrittenArgs (
1208- const llvm::SmallVectorImpl<const Metadata * > &allGenericArgs,
1208+ const llvm::SmallVectorImpl<MetadataOrPack > &allGenericArgs,
12091209 const llvm::SmallVectorImpl<unsigned > &genericParamCounts)
12101210 : allGenericArgs(allGenericArgs),
12111211 genericParamCounts(genericParamCounts) {}
@@ -1219,12 +1219,12 @@ class SubstGenericParametersFromWrittenArgs {
12191219
12201220static void _gatherWrittenGenericArgs (
12211221 const Metadata *metadata, const TypeContextDescriptor *description,
1222- llvm::SmallVectorImpl<const Metadata * > &allGenericArgs,
1222+ llvm::SmallVectorImpl<MetadataOrPack > &allGenericArgs,
12231223 Demangler &BorrowFrom);
12241224
12251225static llvm::Optional<TypeLookupError>
12261226_gatherGenericParameters (const ContextDescriptor *context,
1227- llvm::ArrayRef<const Metadata * > genericArgs,
1227+ llvm::ArrayRef<MetadataOrPack > genericArgs,
12281228 const Metadata *parent,
12291229 llvm::SmallVectorImpl<unsigned > &genericParamCounts,
12301230 llvm::SmallVectorImpl<const void *> &allGenericArgsVec,
@@ -1249,11 +1249,11 @@ _gatherGenericParameters(const ContextDescriptor *context,
12491249 str += " <" ;
12501250
12511251 bool first = true ;
1252- for (const Metadata * metadata : genericArgs) {
1252+ for (MetadataOrPack metadata : genericArgs) {
12531253 if (!first)
12541254 str += " , " ;
12551255 first = false ;
1256- str += nameForMetadata (metadata );
1256+ str += metadata. nameForMetadata ();
12571257 }
12581258
12591259 str += " > " ;
@@ -1297,7 +1297,7 @@ _gatherGenericParameters(const ContextDescriptor *context,
12971297 // requirements and fill in the generic arguments vector.
12981298 if (!genericParamCounts.empty ()) {
12991299 // Compute the set of generic arguments "as written".
1300- llvm::SmallVector<const Metadata * , 8 > allGenericArgs;
1300+ llvm::SmallVector<MetadataOrPack , 8 > allGenericArgs;
13011301
13021302 // If we have a parent, gather it's generic arguments "as written".
13031303 if (parent) {
@@ -1336,16 +1336,47 @@ _gatherGenericParameters(const ContextDescriptor *context,
13361336 // Add metadata for each canonical generic parameter.
13371337 for (unsigned i = 0 ; i != n; ++i) {
13381338 const auto ¶m = genericParams[i];
1339- if (param.getKind () != GenericParamKind::Type) {
1339+ auto arg = allGenericArgs[i];
1340+
1341+ switch (param.getKind ()) {
1342+ case GenericParamKind::Type: {
1343+ if (!arg.isMetadata ()) {
1344+ auto commonString = makeCommonErrorStringGetter ();
1345+ return TypeLookupError ([=] {
1346+ return commonString () + " param " + std::to_string (i) +
1347+ " expected metadata but got a metadata pack" ;
1348+ });
1349+ }
1350+
1351+ if (param.hasKeyArgument ()) {
1352+ allGenericArgsVec.push_back (arg.getMetadata ());
1353+ }
1354+
1355+ break ;
1356+ }
1357+ case GenericParamKind::TypePack: {
1358+ if (!arg.isMetadataPack ()) {
1359+ auto commonString = makeCommonErrorStringGetter ();
1360+ return TypeLookupError ([=] {
1361+ return commonString () + " param " + std::to_string (i) +
1362+ " expected a metadata pack but got metadata" ;
1363+ });
1364+ }
1365+
1366+ if (param.hasKeyArgument ()) {
1367+ allGenericArgsVec.push_back (arg.getMetadataPack ().getPointer ());
1368+ }
1369+
1370+ break ;
1371+ }
1372+ default :
13401373 auto commonString = makeCommonErrorStringGetter ();
13411374 return TypeLookupError ([=] {
13421375 return commonString () + " param " + std::to_string (i) +
13431376 " has unexpected kind " +
13441377 std::to_string (static_cast <uint8_t >(param.getKind ()));
13451378 });
13461379 }
1347- if (param.hasKeyArgument ())
1348- allGenericArgsVec.push_back (allGenericArgs[i]);
13491380 }
13501381
13511382 // Fill in the length for each shape class.
@@ -1597,12 +1628,9 @@ class DecodedMetadataBuilder {
15971628 return BuiltType ();
15981629 auto outerContext = descriptor->Parent .get ();
15991630
1600- llvm::SmallVector<const Metadata *, 8 > allGenericArgs;
1601- for (auto argSet : genericArgs) {
1602- // FIXME: variadic generics
1603- for (auto arg : argSet)
1604- allGenericArgs.push_back (arg.getMetadata ());
1605- }
1631+ llvm::SmallVector<MetadataOrPack, 8 > allGenericArgs;
1632+ for (auto argSet : genericArgs)
1633+ allGenericArgs.append (argSet.begin (), argSet.end ());
16061634
16071635 // Gather the generic parameters we need to parameterize the opaque decl.
16081636 llvm::SmallVector<unsigned , 8 > genericParamCounts;
@@ -1719,12 +1747,7 @@ class DecodedMetadataBuilder {
17191747 llvm::SmallVector<unsigned , 8 > genericParamCounts;
17201748 llvm::SmallVector<const void *, 8 > allGenericArgsVec;
17211749
1722- // FIXME: variadic generics
1723- llvm::SmallVector<const Metadata *, 4 > genericArgsMetadata;
1724- for (auto arg : genericArgs)
1725- genericArgsMetadata.push_back (arg.getMetadata ());
1726-
1727- if (auto error = _gatherGenericParameters (typeDecl, genericArgsMetadata,
1750+ if (auto error = _gatherGenericParameters (typeDecl, genericArgs,
17281751 parent.getMetadataOrNull (),
17291752 genericParamCounts,
17301753 allGenericArgsVec, demangler))
@@ -1968,14 +1991,22 @@ class DecodedMetadataBuilder {
19681991
19691992 TypeLookupErrorOr<BuiltType>
19701993 createPackType (llvm::ArrayRef<BuiltType> elements) const {
1971- // FIXME: Runtime support for variadic generics.
1972- return BuiltType ();
1994+ for (auto element : elements) {
1995+ if (!element.isMetadata ()) {
1996+ return TYPE_LOOKUP_ERROR_FMT (" Can't have nested metadata packs" );
1997+ }
1998+ }
1999+
2000+ MetadataPackPointer pack (swift_allocateMetadataPack (
2001+ reinterpret_cast <const Metadata * const *>(elements.data ()),
2002+ elements.size ()));
2003+
2004+ return BuiltType (pack);
19732005 }
19742006
19752007 TypeLookupErrorOr<BuiltType>
19762008 createSILPackType (llvm::ArrayRef<BuiltType> elements, bool isElementAddress) const {
1977- // FIXME: Runtime support for variadic generics.
1978- return BuiltType ();
2009+ return TYPE_LOOKUP_ERROR_FMT (" Lowered SILPackType cannot be demangled" );
19792010 }
19802011
19812012 TypeLookupErrorOr<BuiltType>
@@ -1986,8 +2017,7 @@ class DecodedMetadataBuilder {
19862017
19872018 TypeLookupErrorOr<BuiltType> createDependentMemberType (StringRef name,
19882019 BuiltType base) const {
1989- // Should not have unresolved dependent member types here.
1990- return BuiltType ();
2020+ return TYPE_LOOKUP_ERROR_FMT (" Unbound dependent member type cannot be demangled" );
19912021 }
19922022
19932023 TypeLookupErrorOr<BuiltType>
@@ -2890,8 +2920,10 @@ const Metadata *SubstGenericParametersFromWrittenArgs::getMetadata(
28902920 unsigned depth, unsigned index) const {
28912921 if (auto flatIndex =
28922922 _depthIndexToFlatIndex (depth, index, genericParamCounts)) {
2893- if (*flatIndex < allGenericArgs.size ())
2894- return allGenericArgs[*flatIndex];
2923+ if (*flatIndex < allGenericArgs.size ()) {
2924+ // FIXME: variadic generics
2925+ return allGenericArgs[*flatIndex].getMetadata ();
2926+ }
28952927 }
28962928
28972929 return nullptr ;
@@ -2924,7 +2956,7 @@ demangleToGenericParamRef(StringRef typeName) {
29242956
29252957static void _gatherWrittenGenericArgs (
29262958 const Metadata *metadata, const TypeContextDescriptor *description,
2927- llvm::SmallVectorImpl<const Metadata * > &allGenericArgs,
2959+ llvm::SmallVectorImpl<MetadataOrPack > &allGenericArgs,
29282960 Demangler &BorrowFrom) {
29292961 if (!description)
29302962 return ;
@@ -2941,10 +2973,25 @@ static void _gatherWrittenGenericArgs(
29412973 // another type.
29422974 if (param.hasKeyArgument ()) {
29432975 auto genericArg = *genericArgs++;
2944- allGenericArgs.push_back (genericArg);
2976+ allGenericArgs.push_back (MetadataOrPack (genericArg));
2977+ } else {
2978+ // Leave a gap for us to fill in by looking at same type info.
2979+ allGenericArgs.push_back (MetadataOrPack ());
2980+ missingWrittenArguments = true ;
2981+ }
2982+
2983+ break ;
2984+
2985+ case GenericParamKind::TypePack:
2986+ // The type should have a key argument unless it's been same-typed to
2987+ // another type.
2988+ if (param.hasKeyArgument ()) {
2989+ auto genericArg = reinterpret_cast <const Metadata * const *>(*genericArgs++);
2990+ MetadataPackPointer pack (genericArg);
2991+ allGenericArgs.push_back (MetadataOrPack (pack));
29452992 } else {
29462993 // Leave a gap for us to fill in by looking at same type info.
2947- allGenericArgs.push_back (nullptr );
2994+ allGenericArgs.push_back (MetadataOrPack () );
29482995 missingWrittenArguments = true ;
29492996 }
29502997
@@ -2954,7 +3001,7 @@ static void _gatherWrittenGenericArgs(
29543001 // We don't know about this kind of parameter. Create placeholders where
29553002 // needed.
29563003 if (param.hasKeyArgument ()) {
2957- allGenericArgs.push_back (nullptr );
3004+ allGenericArgs.push_back (MetadataOrPack () );
29583005 ++genericArgs;
29593006 }
29603007
@@ -3001,15 +3048,15 @@ static void _gatherWrittenGenericArgs(
30013048 SubstGenericParametersFromWrittenArgs substitutions (allGenericArgs,
30023049 genericParamCounts);
30033050 allGenericArgs[*lhsFlatIndex] =
3004- swift_getTypeByMangledName (MetadataState::Abstract,
3051+ MetadataOrPack ( swift_getTypeByMangledName (MetadataState::Abstract,
30053052 req.getMangledTypeName (),
30063053 (const void * const *)allGenericArgs.data (),
30073054 [&substitutions](unsigned depth, unsigned index) {
30083055 return substitutions.getMetadata (depth, index);
30093056 },
30103057 [&substitutions](const Metadata *type, unsigned index) {
30113058 return substitutions.getWitnessTable (type, index);
3012- }).getType ().getMetadata ();
3059+ }).getType ().getMetadata ()) ;
30133060 continue ;
30143061 }
30153062
0 commit comments