@@ -1184,6 +1184,53 @@ NodePointer Demangler::demangleFunctionSpecialization() {
11841184 }
11851185 if (!nextIf (' n' ))
11861186 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+ }
11871234 return Spec;
11881235}
11891236
@@ -1193,57 +1240,47 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
11931240 switch (nextChar ()) {
11941241 case ' n' :
11951242 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)));
12081249 case ' p' : {
12091250 switch (nextChar ()) {
12101251 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)));
12131256 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)));
12161261 case ' i' :
12171262 return addFuncSpecParamNumber (Param,
12181263 FunctionSigSpecializationParamKind::ConstantPropInteger);
12191264 case ' d' :
12201265 return addFuncSpecParamNumber (Param,
12211266 FunctionSigSpecializationParamKind::ConstantPropFloat);
12221267 case ' s' : {
1268+ // Consumes an identifier parameter (the string constant),
1269+ // which will be added later.
12231270 StringRef Encoding;
12241271 switch (nextChar ()) {
12251272 case ' b' : Encoding = " u8" ; break ;
12261273 case ' w' : Encoding = " u16" ; break ;
12271274 case ' c' : Encoding = " objc" ; break ;
12281275 default : return nullptr ;
12291276 }
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 (
12381278 Node::Kind::FunctionSignatureSpecializationParamKind,
12391279 unsigned (swift::Demangle::FunctionSigSpecializationParamKind::
12401280 ConstantPropString)));
1241- Param->addChild (NodeFactory::create (
1242- Node::Kind::FunctionSignatureSpecializationParamPayload,
1243- Encoding));
12441281 return addChild (Param, NodeFactory::create (
12451282 Node::Kind::FunctionSignatureSpecializationParamPayload,
1246- Text ));
1283+ Encoding ));
12471284 }
12481285 default :
12491286 return nullptr ;
@@ -1283,22 +1320,6 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
12831320 }
12841321}
12851322
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-
13021323NodePointer Demangler::addFuncSpecParamNumber (NodePointer Param,
13031324 FunctionSigSpecializationParamKind Kind) {
13041325 Param->addChild (NodeFactory::create (
0 commit comments