@@ -1184,6 +1184,53 @@ NodePointer Demangler::demangleFunctionSpecialization() {
1184
1184
}
1185
1185
if (!nextIf (' n' ))
1186
1186
Spec = addChild (Spec, demangleFuncSpecParam (Node::IndexType (~0 )));
1187
+
1188
+ if (!Spec)
1189
+ return nullptr ;
1190
+
1191
+ // Add the required parameters in reverse order.
1192
+ for (size_t Idx = 0 , Num = Spec->getNumChildren (); Idx < Num; ++Idx) {
1193
+ NodePointer Param = Spec->getChild (Num - Idx - 1 );
1194
+ if (Param->getKind () != Node::Kind::FunctionSignatureSpecializationParam)
1195
+ continue ;
1196
+
1197
+ if (Param->getNumChildren () == 0 )
1198
+ continue ;
1199
+ NodePointer KindNd = Param->getFirstChild ();
1200
+ assert (KindNd->getKind () ==
1201
+ Node::Kind::FunctionSignatureSpecializationParamKind);
1202
+ auto ParamKind = (FunctionSigSpecializationParamKind)KindNd->getIndex ();
1203
+ switch (ParamKind) {
1204
+ case FunctionSigSpecializationParamKind::ConstantPropFunction:
1205
+ case FunctionSigSpecializationParamKind::ConstantPropGlobal:
1206
+ case FunctionSigSpecializationParamKind::ConstantPropString:
1207
+ case FunctionSigSpecializationParamKind::ClosureProp: {
1208
+ std::vector<NodePointer> Types;
1209
+ while (NodePointer Ty = popNode (Node::Kind::Type)) {
1210
+ assert (ParamKind == FunctionSigSpecializationParamKind::ClosureProp);
1211
+ Types.push_back (Ty);
1212
+ }
1213
+ NodePointer Name = popNode (Node::Kind::Identifier);
1214
+ if (!Name)
1215
+ return nullptr ;
1216
+ StringRef Text = Name->getText ();
1217
+ if (ParamKind ==
1218
+ FunctionSigSpecializationParamKind::ConstantPropString &&
1219
+ Text.size () > 0 && Text[0 ] == ' _' ) {
1220
+ // A '_' escapes a leading digit or '_' of a string constant.
1221
+ Text = Text.drop_front (1 );
1222
+ }
1223
+ addChild (Param, NodeFactory::create (
1224
+ Node::Kind::FunctionSignatureSpecializationParamPayload, Text));
1225
+ while (NodePointer Ty = pop_back_val (Types)) {
1226
+ Param = addChild (Param, Ty);
1227
+ }
1228
+ break ;
1229
+ }
1230
+ default :
1231
+ break ;
1232
+ }
1233
+ }
1187
1234
return Spec;
1188
1235
}
1189
1236
@@ -1193,57 +1240,47 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
1193
1240
switch (nextChar ()) {
1194
1241
case ' n' :
1195
1242
return Param;
1196
- case ' c' : {
1197
- std::vector<NodePointer> Types;
1198
- while (NodePointer Ty = popNode (Node::Kind::Type)) {
1199
- Types.push_back (Ty);
1200
- }
1201
- Param = addFuncSpecParamIdentifier (Param,
1202
- swift::Demangle::FunctionSigSpecializationParamKind::ClosureProp);
1203
- while (NodePointer Ty = pop_back_val (Types)) {
1204
- Param = addChild (Param, Ty);
1205
- }
1206
- return Param;
1207
- }
1243
+ case ' c' :
1244
+ // Consumes an identifier and multiple type parameters.
1245
+ // The parameters will be added later.
1246
+ return addChild (Param, NodeFactory::create (
1247
+ Node::Kind::FunctionSignatureSpecializationParamKind,
1248
+ unsigned (FunctionSigSpecializationParamKind::ClosureProp)));
1208
1249
case ' p' : {
1209
1250
switch (nextChar ()) {
1210
1251
case ' f' :
1211
- return addFuncSpecParamIdentifier (Param,
1212
- FunctionSigSpecializationParamKind::ConstantPropFunction);
1252
+ // Consumes an identifier parameter, which will be added later.
1253
+ return addChild (Param, NodeFactory::create (
1254
+ Node::Kind::FunctionSignatureSpecializationParamKind,
1255
+ unsigned (FunctionSigSpecializationParamKind::ConstantPropFunction)));
1213
1256
case ' g' :
1214
- return addFuncSpecParamIdentifier (Param,
1215
- FunctionSigSpecializationParamKind::ConstantPropGlobal);
1257
+ // Consumes an identifier parameter, which will be added later.
1258
+ return addChild (Param, NodeFactory::create (
1259
+ Node::Kind::FunctionSignatureSpecializationParamKind,
1260
+ unsigned (FunctionSigSpecializationParamKind::ConstantPropGlobal)));
1216
1261
case ' i' :
1217
1262
return addFuncSpecParamNumber (Param,
1218
1263
FunctionSigSpecializationParamKind::ConstantPropInteger);
1219
1264
case ' d' :
1220
1265
return addFuncSpecParamNumber (Param,
1221
1266
FunctionSigSpecializationParamKind::ConstantPropFloat);
1222
1267
case ' s' : {
1268
+ // Consumes an identifier parameter (the string constant),
1269
+ // which will be added later.
1223
1270
StringRef Encoding;
1224
1271
switch (nextChar ()) {
1225
1272
case ' b' : Encoding = " u8" ; break ;
1226
1273
case ' w' : Encoding = " u16" ; break ;
1227
1274
case ' c' : Encoding = " objc" ; break ;
1228
1275
default : return nullptr ;
1229
1276
}
1230
- NodePointer Str = popNode (Node::Kind::Identifier);
1231
- if (!Str)
1232
- return nullptr ;
1233
- StringRef Text = Str->getText ();
1234
- if (Text.size () > 0 && Text[0 ] == ' _' )
1235
- Text = Text.drop_front (1 );
1236
-
1237
- Param->addChild (NodeFactory::create (
1277
+ addChild (Param, NodeFactory::create (
1238
1278
Node::Kind::FunctionSignatureSpecializationParamKind,
1239
1279
unsigned (swift::Demangle::FunctionSigSpecializationParamKind::
1240
1280
ConstantPropString)));
1241
- Param->addChild (NodeFactory::create (
1242
- Node::Kind::FunctionSignatureSpecializationParamPayload,
1243
- Encoding));
1244
1281
return addChild (Param, NodeFactory::create (
1245
1282
Node::Kind::FunctionSignatureSpecializationParamPayload,
1246
- Text ));
1283
+ Encoding ));
1247
1284
}
1248
1285
default :
1249
1286
return nullptr ;
@@ -1283,22 +1320,6 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
1283
1320
}
1284
1321
}
1285
1322
1286
- NodePointer Demangler::addFuncSpecParamIdentifier (NodePointer Param,
1287
- FunctionSigSpecializationParamKind Kind,
1288
- StringRef FirstParam) {
1289
- NodePointer Name = popNode (Node::Kind::Identifier);
1290
- if (!Name)
1291
- return nullptr ;
1292
- Param->addChild (NodeFactory::create (
1293
- Node::Kind::FunctionSignatureSpecializationParamKind, unsigned (Kind)));
1294
- if (!FirstParam.empty ()) {
1295
- Param->addChild (NodeFactory::create (
1296
- Node::Kind::FunctionSignatureSpecializationParamPayload, FirstParam));
1297
- }
1298
- return addChild (Param, NodeFactory::create (
1299
- Node::Kind::FunctionSignatureSpecializationParamPayload, Name->getText ()));
1300
- }
1301
-
1302
1323
NodePointer Demangler::addFuncSpecParamNumber (NodePointer Param,
1303
1324
FunctionSigSpecializationParamKind Kind) {
1304
1325
Param->addChild (NodeFactory::create (
0 commit comments