@@ -3378,43 +3378,40 @@ NodePointer Demangler::demangleFunctionSpecialization() {
3378
3378
if (Param->getKind () != Node::Kind::FunctionSignatureSpecializationParam)
3379
3379
continue ;
3380
3380
3381
- if (Param->getNumChildren () == 0 )
3382
- continue ;
3383
- NodePointer KindNd = Param->getFirstChild ();
3384
- assert (KindNd->getKind () ==
3385
- Node::Kind::FunctionSignatureSpecializationParamKind);
3386
- auto ParamKind = (FunctionSigSpecializationParamKind)KindNd->getIndex ();
3387
- switch (ParamKind) {
3388
- case FunctionSigSpecializationParamKind::ConstantPropFunction:
3389
- case FunctionSigSpecializationParamKind::ConstantPropGlobal:
3390
- case FunctionSigSpecializationParamKind::ConstantPropString:
3391
- case FunctionSigSpecializationParamKind::ConstantPropKeyPath:
3392
- case FunctionSigSpecializationParamKind::ClosureProp: {
3393
- size_t FixedChildren = Param->getNumChildren ();
3394
- while (NodePointer Ty = popNode (Node::Kind::Type)) {
3395
- if (ParamKind != FunctionSigSpecializationParamKind::ClosureProp &&
3396
- ParamKind != FunctionSigSpecializationParamKind::ConstantPropKeyPath)
3397
- return nullptr ;
3398
- Param = addChild (Param, Ty);
3399
- }
3400
- NodePointer Name = popNode (Node::Kind::Identifier);
3401
- if (!Name)
3402
- return nullptr ;
3403
- StringRef Text = Name->getText ();
3404
- if (ParamKind ==
3405
- FunctionSigSpecializationParamKind::ConstantPropString &&
3406
- !Text.empty () && Text[0 ] == ' _' ) {
3407
- // A '_' escapes a leading digit or '_' of a string constant.
3408
- Text = Text.drop_front (1 );
3381
+ size_t fixedChildren = Param->getNumChildren ();
3382
+ NodePointer paramToAdd = Param;
3383
+ for (size_t childIdx = 0 ; childIdx < fixedChildren; ++childIdx) {
3384
+ NodePointer KindNd = Param->getChild (fixedChildren - childIdx - 1 );
3385
+ if (KindNd->getKind () != Node::Kind::FunctionSignatureSpecializationParamKind)
3386
+ continue ;
3387
+
3388
+ auto ParamKind = (FunctionSigSpecializationParamKind)KindNd->getIndex ();
3389
+ switch (ParamKind) {
3390
+ case FunctionSigSpecializationParamKind::ClosureProp: {
3391
+ while (NodePointer Ty = popNode (Node::Kind::Type)) {
3392
+ paramToAdd = addChild (paramToAdd, Ty);
3393
+ }
3394
+ break ;
3409
3395
}
3410
- addChild (Param, createNodeWithAllocatedText (
3411
- Node::Kind::FunctionSignatureSpecializationParamPayload, Text));
3412
- Param->reverseChildren (FixedChildren);
3413
- break ;
3396
+ case FunctionSigSpecializationParamKind::ConstantPropKeyPath:
3397
+ paramToAdd = addChild (paramToAdd, popNode (Node::Kind::Type));
3398
+ paramToAdd = addChild (paramToAdd, popNode (Node::Kind::Type));
3399
+ break ;
3400
+ case FunctionSigSpecializationParamKind::ConstantPropStruct:
3401
+ paramToAdd = addChild (paramToAdd, popNode (Node::Kind::Type));
3402
+ continue ;
3403
+ case FunctionSigSpecializationParamKind::ConstantPropFunction:
3404
+ case FunctionSigSpecializationParamKind::ConstantPropGlobal:
3405
+ case FunctionSigSpecializationParamKind::ConstantPropString:
3406
+ break ;
3407
+ default :
3408
+ continue ;
3414
3409
}
3415
- default :
3416
- break ;
3410
+ paramToAdd = addChild (paramToAdd, popNode (Node::Kind::Identifier));
3417
3411
}
3412
+ if (!paramToAdd)
3413
+ return nullptr ;
3414
+ Param->reverseChildren (fixedChildren);
3418
3415
}
3419
3416
return Spec;
3420
3417
}
@@ -3433,58 +3430,79 @@ NodePointer Demangler::demangleFuncSpecParam(Node::Kind Kind) {
3433
3430
Node::Kind::FunctionSignatureSpecializationParamKind,
3434
3431
uint64_t (FunctionSigSpecializationParamKind::ClosureProp)));
3435
3432
case ' p' : {
3436
- switch (nextChar ()) {
3437
- case ' f' :
3438
- // Consumes an identifier parameter, which will be added later.
3439
- return addChild (
3440
- Param,
3441
- createNode (Node::Kind::FunctionSignatureSpecializationParamKind,
3442
- Node::IndexType (FunctionSigSpecializationParamKind::
3443
- ConstantPropFunction)));
3444
- case ' g' :
3445
- // Consumes an identifier parameter, which will be added later.
3446
- return addChild (
3447
- Param,
3448
- createNode (
3449
- Node::Kind::FunctionSignatureSpecializationParamKind,
3450
- Node::IndexType (
3451
- FunctionSigSpecializationParamKind::ConstantPropGlobal)));
3452
- case ' i' :
3453
- return addFuncSpecParamNumber (Param,
3454
- FunctionSigSpecializationParamKind::ConstantPropInteger);
3455
- case ' d' :
3456
- return addFuncSpecParamNumber (Param,
3457
- FunctionSigSpecializationParamKind::ConstantPropFloat);
3458
- case ' s' : {
3459
- // Consumes an identifier parameter (the string constant),
3460
- // which will be added later.
3461
- const char *Encoding = nullptr ;
3462
- switch (nextChar ()) {
3463
- case ' b' : Encoding = " u8" ; break ;
3464
- case ' w' : Encoding = " u16" ; break ;
3465
- case ' c' : Encoding = " objc" ; break ;
3466
- default : return nullptr ;
3433
+ for (;;) {
3434
+ switch (nextChar ()) {
3435
+ case ' S' :
3436
+ // Consumes an identifier parameter, which will be added later.
3437
+ addChild (
3438
+ Param,
3439
+ createNode (Node::Kind::FunctionSignatureSpecializationParamKind,
3440
+ Node::IndexType (FunctionSigSpecializationParamKind::
3441
+ ConstantPropStruct)));
3442
+ break ;
3443
+ case ' f' :
3444
+ // Consumes an identifier parameter, which will be added later.
3445
+ addChild (
3446
+ Param,
3447
+ createNode (Node::Kind::FunctionSignatureSpecializationParamKind,
3448
+ Node::IndexType (FunctionSigSpecializationParamKind::
3449
+ ConstantPropFunction)));
3450
+ break ;
3451
+ case ' g' :
3452
+ // Consumes an identifier parameter, which will be added later.
3453
+ addChild (
3454
+ Param,
3455
+ createNode (
3456
+ Node::Kind::FunctionSignatureSpecializationParamKind,
3457
+ Node::IndexType (
3458
+ FunctionSigSpecializationParamKind::ConstantPropGlobal)));
3459
+ break ;
3460
+ case ' i' :
3461
+ if (!addFuncSpecParamNumber (Param,
3462
+ FunctionSigSpecializationParamKind::ConstantPropInteger)) {
3463
+ return nullptr ;
3464
+ }
3465
+ break ;
3466
+ case ' d' :
3467
+ if (!addFuncSpecParamNumber (Param,
3468
+ FunctionSigSpecializationParamKind::ConstantPropFloat)) {
3469
+ return nullptr ;
3470
+ }
3471
+ break ;
3472
+ case ' s' : {
3473
+ // Consumes an identifier parameter (the string constant),
3474
+ // which will be added later.
3475
+ const char *Encoding = nullptr ;
3476
+ switch (nextChar ()) {
3477
+ case ' b' : Encoding = " u8" ; break ;
3478
+ case ' w' : Encoding = " u16" ; break ;
3479
+ case ' c' : Encoding = " objc" ; break ;
3480
+ default : return nullptr ;
3481
+ }
3482
+ addChild (Param,
3483
+ createNode (
3484
+ Node::Kind::FunctionSignatureSpecializationParamKind,
3485
+ Node::IndexType (
3486
+ swift::Demangle::FunctionSigSpecializationParamKind::
3487
+ ConstantPropString)));
3488
+ addChild (Param, createNode (
3489
+ Node::Kind::FunctionSignatureSpecializationParamPayload,
3490
+ Encoding));
3491
+ break ;
3467
3492
}
3468
- addChild (Param,
3469
- createNode (
3470
- Node::Kind::FunctionSignatureSpecializationParamKind,
3471
- Node::IndexType (
3472
- swift::Demangle::FunctionSigSpecializationParamKind::
3473
- ConstantPropString)));
3474
- return addChild (Param, createNode (
3475
- Node::Kind::FunctionSignatureSpecializationParamPayload,
3476
- Encoding));
3477
- }
3478
- case ' k' : {
3479
- // Consumes two types and a SHA1 identifier.
3480
- return addChild (
3481
- Param,
3482
- createNode (Node::Kind::FunctionSignatureSpecializationParamKind,
3483
- Node::IndexType (FunctionSigSpecializationParamKind::
3484
- ConstantPropKeyPath)));
3493
+ case ' k' : {
3494
+ // Consumes two types and a SHA1 identifier.
3495
+ addChild (
3496
+ Param,
3497
+ createNode (Node::Kind::FunctionSignatureSpecializationParamKind,
3498
+ Node::IndexType (FunctionSigSpecializationParamKind::
3499
+ ConstantPropKeyPath)));
3500
+ break ;
3501
+ }
3502
+ default :
3503
+ pushBack ();
3504
+ return Param;
3485
3505
}
3486
- default :
3487
- return nullptr ;
3488
3506
}
3489
3507
}
3490
3508
case ' e' : {
0 commit comments