@@ -1188,7 +1188,7 @@ struct MetadataOrPack {
1188
1188
// / Use with \c _getTypeByMangledName to decode potentially-generic types.
1189
1189
class SubstGenericParametersFromWrittenArgs {
1190
1190
// / The complete set of generic arguments.
1191
- const llvm::SmallVectorImpl<const Metadata * > &allGenericArgs;
1191
+ const llvm::SmallVectorImpl<MetadataOrPack > &allGenericArgs;
1192
1192
1193
1193
// / The counts of generic parameters at each level.
1194
1194
const llvm::SmallVectorImpl<unsigned > &genericParamCounts;
@@ -1205,7 +1205,7 @@ class SubstGenericParametersFromWrittenArgs {
1205
1205
// / \param genericParamCounts The count of generic parameters at each
1206
1206
// / generic level, typically gathered by _gatherGenericParameterCounts.
1207
1207
explicit SubstGenericParametersFromWrittenArgs (
1208
- const llvm::SmallVectorImpl<const Metadata * > &allGenericArgs,
1208
+ const llvm::SmallVectorImpl<MetadataOrPack > &allGenericArgs,
1209
1209
const llvm::SmallVectorImpl<unsigned > &genericParamCounts)
1210
1210
: allGenericArgs(allGenericArgs),
1211
1211
genericParamCounts(genericParamCounts) {}
@@ -1219,12 +1219,12 @@ class SubstGenericParametersFromWrittenArgs {
1219
1219
1220
1220
static void _gatherWrittenGenericArgs (
1221
1221
const Metadata *metadata, const TypeContextDescriptor *description,
1222
- llvm::SmallVectorImpl<const Metadata * > &allGenericArgs,
1222
+ llvm::SmallVectorImpl<MetadataOrPack > &allGenericArgs,
1223
1223
Demangler &BorrowFrom);
1224
1224
1225
1225
static llvm::Optional<TypeLookupError>
1226
1226
_gatherGenericParameters (const ContextDescriptor *context,
1227
- llvm::ArrayRef<const Metadata * > genericArgs,
1227
+ llvm::ArrayRef<MetadataOrPack > genericArgs,
1228
1228
const Metadata *parent,
1229
1229
llvm::SmallVectorImpl<unsigned > &genericParamCounts,
1230
1230
llvm::SmallVectorImpl<const void *> &allGenericArgsVec,
@@ -1249,11 +1249,11 @@ _gatherGenericParameters(const ContextDescriptor *context,
1249
1249
str += " <" ;
1250
1250
1251
1251
bool first = true ;
1252
- for (const Metadata * metadata : genericArgs) {
1252
+ for (MetadataOrPack metadata : genericArgs) {
1253
1253
if (!first)
1254
1254
str += " , " ;
1255
1255
first = false ;
1256
- str += nameForMetadata (metadata );
1256
+ str += metadata. nameForMetadata ();
1257
1257
}
1258
1258
1259
1259
str += " > " ;
@@ -1297,7 +1297,7 @@ _gatherGenericParameters(const ContextDescriptor *context,
1297
1297
// requirements and fill in the generic arguments vector.
1298
1298
if (!genericParamCounts.empty ()) {
1299
1299
// Compute the set of generic arguments "as written".
1300
- llvm::SmallVector<const Metadata * , 8 > allGenericArgs;
1300
+ llvm::SmallVector<MetadataOrPack , 8 > allGenericArgs;
1301
1301
1302
1302
// If we have a parent, gather it's generic arguments "as written".
1303
1303
if (parent) {
@@ -1336,16 +1336,47 @@ _gatherGenericParameters(const ContextDescriptor *context,
1336
1336
// Add metadata for each canonical generic parameter.
1337
1337
for (unsigned i = 0 ; i != n; ++i) {
1338
1338
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 :
1340
1373
auto commonString = makeCommonErrorStringGetter ();
1341
1374
return TypeLookupError ([=] {
1342
1375
return commonString () + " param " + std::to_string (i) +
1343
1376
" has unexpected kind " +
1344
1377
std::to_string (static_cast <uint8_t >(param.getKind ()));
1345
1378
});
1346
1379
}
1347
- if (param.hasKeyArgument ())
1348
- allGenericArgsVec.push_back (allGenericArgs[i]);
1349
1380
}
1350
1381
1351
1382
// Fill in the length for each shape class.
@@ -1597,12 +1628,9 @@ class DecodedMetadataBuilder {
1597
1628
return BuiltType ();
1598
1629
auto outerContext = descriptor->Parent .get ();
1599
1630
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 ());
1606
1634
1607
1635
// Gather the generic parameters we need to parameterize the opaque decl.
1608
1636
llvm::SmallVector<unsigned , 8 > genericParamCounts;
@@ -1719,12 +1747,7 @@ class DecodedMetadataBuilder {
1719
1747
llvm::SmallVector<unsigned , 8 > genericParamCounts;
1720
1748
llvm::SmallVector<const void *, 8 > allGenericArgsVec;
1721
1749
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,
1728
1751
parent.getMetadataOrNull (),
1729
1752
genericParamCounts,
1730
1753
allGenericArgsVec, demangler))
@@ -1968,14 +1991,22 @@ class DecodedMetadataBuilder {
1968
1991
1969
1992
TypeLookupErrorOr<BuiltType>
1970
1993
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);
1973
2005
}
1974
2006
1975
2007
TypeLookupErrorOr<BuiltType>
1976
2008
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" );
1979
2010
}
1980
2011
1981
2012
TypeLookupErrorOr<BuiltType>
@@ -1986,8 +2017,7 @@ class DecodedMetadataBuilder {
1986
2017
1987
2018
TypeLookupErrorOr<BuiltType> createDependentMemberType (StringRef name,
1988
2019
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" );
1991
2021
}
1992
2022
1993
2023
TypeLookupErrorOr<BuiltType>
@@ -2890,8 +2920,10 @@ const Metadata *SubstGenericParametersFromWrittenArgs::getMetadata(
2890
2920
unsigned depth, unsigned index) const {
2891
2921
if (auto flatIndex =
2892
2922
_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
+ }
2895
2927
}
2896
2928
2897
2929
return nullptr ;
@@ -2924,7 +2956,7 @@ demangleToGenericParamRef(StringRef typeName) {
2924
2956
2925
2957
static void _gatherWrittenGenericArgs (
2926
2958
const Metadata *metadata, const TypeContextDescriptor *description,
2927
- llvm::SmallVectorImpl<const Metadata * > &allGenericArgs,
2959
+ llvm::SmallVectorImpl<MetadataOrPack > &allGenericArgs,
2928
2960
Demangler &BorrowFrom) {
2929
2961
if (!description)
2930
2962
return ;
@@ -2941,10 +2973,25 @@ static void _gatherWrittenGenericArgs(
2941
2973
// another type.
2942
2974
if (param.hasKeyArgument ()) {
2943
2975
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));
2945
2992
} else {
2946
2993
// Leave a gap for us to fill in by looking at same type info.
2947
- allGenericArgs.push_back (nullptr );
2994
+ allGenericArgs.push_back (MetadataOrPack () );
2948
2995
missingWrittenArguments = true ;
2949
2996
}
2950
2997
@@ -2954,7 +3001,7 @@ static void _gatherWrittenGenericArgs(
2954
3001
// We don't know about this kind of parameter. Create placeholders where
2955
3002
// needed.
2956
3003
if (param.hasKeyArgument ()) {
2957
- allGenericArgs.push_back (nullptr );
3004
+ allGenericArgs.push_back (MetadataOrPack () );
2958
3005
++genericArgs;
2959
3006
}
2960
3007
@@ -3001,15 +3048,15 @@ static void _gatherWrittenGenericArgs(
3001
3048
SubstGenericParametersFromWrittenArgs substitutions (allGenericArgs,
3002
3049
genericParamCounts);
3003
3050
allGenericArgs[*lhsFlatIndex] =
3004
- swift_getTypeByMangledName (MetadataState::Abstract,
3051
+ MetadataOrPack ( swift_getTypeByMangledName (MetadataState::Abstract,
3005
3052
req.getMangledTypeName (),
3006
3053
(const void * const *)allGenericArgs.data (),
3007
3054
[&substitutions](unsigned depth, unsigned index) {
3008
3055
return substitutions.getMetadata (depth, index);
3009
3056
},
3010
3057
[&substitutions](const Metadata *type, unsigned index) {
3011
3058
return substitutions.getWitnessTable (type, index);
3012
- }).getType ().getMetadata ();
3059
+ }).getType ().getMetadata ()) ;
3013
3060
continue ;
3014
3061
}
3015
3062
0 commit comments