22
22
#include " swift/AST/Ownership.h"
23
23
#include " swift/Strings.h"
24
24
#include " RemanglerBase.h"
25
+ #include " DemanglerAssert.h"
25
26
#include < cstdio>
26
27
#include < cstdlib>
27
28
28
29
using namespace swift ;
29
30
using namespace Demangle ;
30
31
31
- #define RETURN_IF_ERROR (x ) \
32
- do { \
33
- ManglingError err = (x); \
34
- if (!err.isSuccess ()) \
35
- return err; \
36
- } while (0 )
37
-
38
32
namespace {
39
33
class Remangler : public RemanglerBase {
40
34
static const unsigned MaxDepth = 1024 ;
@@ -122,7 +116,7 @@ namespace {
122
116
return mangle (*node->begin (), depth);
123
117
}
124
118
ManglingError mangleChildNode (Node *node, unsigned index, unsigned depth) {
125
- assert (index < node->getNumChildren ());
119
+ DEMANGLER_ASSERT (index < node->getNumChildren (), node );
126
120
return mangle (node->begin ()[index], depth);
127
121
}
128
122
@@ -547,7 +541,7 @@ Remangler::mangleDependentProtocolConformanceAssociated(Node *node,
547
541
548
542
ManglingError Remangler::mangleProtocolConformance (Node *node, unsigned depth) {
549
543
// type, protocol name, context
550
- assert (node->getNumChildren () == 3 );
544
+ DEMANGLER_ASSERT (node->getNumChildren () == 3 , node );
551
545
RETURN_IF_ERROR (mangleChildNode (node, 0 , depth + 1 ));
552
546
RETURN_IF_ERROR (mangleProtocolWithoutPrefix (node->begin ()[1 ], depth + 1 ));
553
547
return mangleChildNode (node, 2 , depth + 1 );
@@ -909,7 +903,7 @@ ManglingError
909
903
Remangler::mangleAssociatedTypeWitnessTableAccessor (Node *node,
910
904
unsigned depth) {
911
905
Buffer << " WT" ;
912
- assert (node->getNumChildren () == 3 );
906
+ DEMANGLER_ASSERT (node->getNumChildren () == 3 , node );
913
907
RETURN_IF_ERROR (mangleChildNode (node, 0 , depth + 1 )); // protocol conformance
914
908
RETURN_IF_ERROR (mangleChildNode (node, 1 , depth + 1 )); // type
915
909
return mangleProtocolWithoutPrefix (node->begin ()[2 ], depth + 1 ); // type
@@ -1010,7 +1004,7 @@ ManglingError Remangler::mangleVariable(Node *node, EntityContext &ctx,
1010
1004
1011
1005
ManglingError Remangler::mangleSubscript (Node *node, EntityContext &ctx,
1012
1006
unsigned depth) {
1013
- assert (node->getNumChildren () >= 2 );
1007
+ DEMANGLER_ASSERT (node->getNumChildren () >= 2 , node );
1014
1008
Buffer << ' i' ;
1015
1009
RETURN_IF_ERROR (mangleEntityContext (node->begin ()[0 ], ctx, depth + 1 ));
1016
1010
if (node->getLastChild ()->getKind () == Node::Kind::PrivateDeclName)
@@ -1056,7 +1050,7 @@ ManglingError Remangler::mangleAccessor(Node *storageNode,
1056
1050
1057
1051
case Demangle::Node::Kind::Subscript: {
1058
1052
auto NumChildren = storageNode->getNumChildren ();
1059
- assert (NumChildren <= 4 );
1053
+ DEMANGLER_ASSERT (NumChildren <= 4 , storageNode );
1060
1054
1061
1055
auto PrivateName = storageNode->getChild (NumChildren - 1 );
1062
1056
if (PrivateName->getKind () == Node::Kind::PrivateDeclName)
@@ -1238,7 +1232,7 @@ ManglingError Remangler::mangleSimpleEntity(Node *node, char basicKind,
1238
1232
StringRef entityKind,
1239
1233
EntityContext &ctx,
1240
1234
unsigned depth) {
1241
- assert (node->getNumChildren () == 1 );
1235
+ DEMANGLER_ASSERT (node->getNumChildren () == 1 , node );
1242
1236
Buffer << basicKind;
1243
1237
RETURN_IF_ERROR (mangleEntityContext (node->begin ()[0 ], ctx, depth + 1 ));
1244
1238
Buffer << entityKind;
@@ -1249,7 +1243,7 @@ ManglingError
1249
1243
Remangler::mangleNamedEntity (Node *node, char basicKind, StringRef entityKind,
1250
1244
EntityContext &ctx, unsigned depth,
1251
1245
StringRef artificialPrivateDiscriminator) {
1252
- assert (node->getNumChildren () == 2 );
1246
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 , node );
1253
1247
if (basicKind != ' \0 ' ) Buffer << basicKind;
1254
1248
RETURN_IF_ERROR (mangleEntityContext (node->begin ()[0 ], ctx, depth + 1 ));
1255
1249
Buffer << entityKind;
@@ -1275,7 +1269,8 @@ Remangler::mangleNamedEntity(Node *node, char basicKind, StringRef entityKind,
1275
1269
ManglingError Remangler::mangleTypedEntity (Node *node, char basicKind,
1276
1270
StringRef entityKind,
1277
1271
EntityContext &ctx, unsigned depth) {
1278
- assert (node->getNumChildren () == 2 || node->getNumChildren () == 3 );
1272
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 || node->getNumChildren () == 3 ,
1273
+ node);
1279
1274
Buffer << basicKind;
1280
1275
RETURN_IF_ERROR (mangleEntityContext (node->begin ()[0 ], ctx, depth + 1 ));
1281
1276
Buffer << entityKind;
@@ -1295,7 +1290,8 @@ ManglingError Remangler::mangleNamedAndTypedEntity(Node *node, char basicKind,
1295
1290
StringRef entityKind,
1296
1291
EntityContext &ctx,
1297
1292
unsigned depth) {
1298
- assert (node->getNumChildren () == 3 || node->getNumChildren () == 4 );
1293
+ DEMANGLER_ASSERT (node->getNumChildren () == 3 || node->getNumChildren () == 4 ,
1294
+ node);
1299
1295
Buffer << basicKind;
1300
1296
RETURN_IF_ERROR (mangleEntityContext (node->begin ()[0 ], ctx, depth + 1 ));
1301
1297
Buffer << entityKind;
@@ -1349,8 +1345,8 @@ ManglingError Remangler::mangleEntityContext(Node *node, EntityContext &ctx,
1349
1345
1350
1346
ManglingError Remangler::mangleEntityType (Node *node, EntityContext &ctx,
1351
1347
unsigned depth) {
1352
- assert (node->getKind () == Node::Kind::Type);
1353
- assert (node->getNumChildren () == 1 );
1348
+ DEMANGLER_ASSERT (node->getKind () == Node::Kind::Type, node );
1349
+ DEMANGLER_ASSERT (node->getNumChildren () == 1 , node );
1354
1350
node = node->begin ()[0 ];
1355
1351
1356
1352
// Expand certain kinds of type within the entity context.
@@ -1362,13 +1358,13 @@ ManglingError Remangler::mangleEntityType(Node *node, EntityContext &ctx,
1362
1358
node->getKind () == Node::Kind::NoEscapeFunctionType)
1363
1359
? ' F'
1364
1360
: ' f' );
1365
- assert (node->getNumChildren () >= 2 );
1361
+ DEMANGLER_ASSERT (node->getNumChildren () >= 2 , node );
1366
1362
unsigned inputIndex = node->getNumChildren () - 2 ;
1367
1363
for (unsigned i = 0 ; i <= inputIndex; ++i)
1368
1364
RETURN_IF_ERROR (mangle (node->begin ()[i], depth + 1 ));
1369
1365
auto returnType = node->begin ()[inputIndex+1 ];
1370
- assert (returnType->getKind () == Node::Kind::ReturnType);
1371
- assert (returnType->getNumChildren () == 1 );
1366
+ DEMANGLER_ASSERT (returnType->getKind () == Node::Kind::ReturnType, returnType );
1367
+ DEMANGLER_ASSERT (returnType->getNumChildren () == 1 , returnType );
1372
1368
return mangleEntityType (returnType->begin ()[0 ], ctx, depth + 1 );
1373
1369
}
1374
1370
default :
@@ -1604,23 +1600,23 @@ ManglingError Remangler::mangleClangType(Node *node, unsigned depth) {
1604
1600
}
1605
1601
1606
1602
ManglingError Remangler::mangleImplParameter (Node *node, unsigned depth) {
1607
- assert (node->getNumChildren () == 2 );
1603
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 , node );
1608
1604
return mangleChildNodes (node, depth + 1 ); // impl convention, type
1609
1605
}
1610
1606
1611
1607
ManglingError Remangler::mangleImplErrorResult (Node *node, unsigned depth) {
1612
- assert (node->getNumChildren () == 2 );
1608
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 , node );
1613
1609
Buffer << ' z' ;
1614
1610
return mangleChildNodes (node, depth + 1 ); // impl convention, type
1615
1611
}
1616
1612
1617
1613
ManglingError Remangler::mangleImplResult (Node *node, unsigned depth) {
1618
- assert (node->getNumChildren () == 2 );
1614
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 , node );
1619
1615
return mangleChildNodes (node, depth + 1 ); // impl convention, type
1620
1616
}
1621
1617
1622
1618
ManglingError Remangler::mangleImplYield (Node *node, unsigned depth) {
1623
- assert (node->getNumChildren () == 2 );
1619
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 , node );
1624
1620
Buffer << ' Y' ;
1625
1621
return mangleChildNodes (node, depth + 1 ); // impl convention, type
1626
1622
}
@@ -1650,7 +1646,7 @@ ManglingError Remangler::mangleImplInvocationSubstitutions(Node *node,
1650
1646
}
1651
1647
1652
1648
ManglingError Remangler::mangleImplConvention (Node *node, unsigned depth) {
1653
- assert (node->getKind () == Node::Kind::ImplConvention);
1649
+ DEMANGLER_ASSERT (node->getKind () == Node::Kind::ImplConvention, node );
1654
1650
StringRef text = node->getText ();
1655
1651
if (text == " @autoreleased" ) {
1656
1652
Buffer << ' a' ;
@@ -1679,7 +1675,8 @@ ManglingError Remangler::mangleImplConvention(Node *node, unsigned depth) {
1679
1675
ManglingError
1680
1676
Remangler::mangleImplParameterResultDifferentiability (Node *node,
1681
1677
unsigned depth) {
1682
- assert (node->getKind () == Node::Kind::ImplDifferentiabilityKind);
1678
+ DEMANGLER_ASSERT (node->getKind () == Node::Kind::ImplDifferentiabilityKind,
1679
+ node);
1683
1680
StringRef text = node->getText ();
1684
1681
// Empty string represents default differentiability.
1685
1682
if (text.empty ())
@@ -1711,7 +1708,7 @@ ManglingError Remangler::mangleMetatype(Node *node, unsigned depth) {
1711
1708
Buffer << ' M' ;
1712
1709
return mangleSingleChildNode (node, depth + 1 ); // type
1713
1710
} else {
1714
- assert (node->getNumChildren () == 2 );
1711
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 , node );
1715
1712
Buffer << " XM" ;
1716
1713
return mangleChildNodes (node, depth + 1 ); // metatype representation, type
1717
1714
}
@@ -1722,7 +1719,7 @@ ManglingError Remangler::mangleExistentialMetatype(Node *node, unsigned depth) {
1722
1719
Buffer << " PM" ;
1723
1720
return mangleSingleChildNode (node, depth + 1 ); // type
1724
1721
} else {
1725
- assert (node->getNumChildren () == 2 );
1722
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 , node );
1726
1723
Buffer << " XPM" ;
1727
1724
return mangleChildNodes (node, depth + 1 ); // metatype representation, type
1728
1725
}
@@ -1752,10 +1749,10 @@ ManglingError Remangler::mangleProtocolList(Node *node, unsigned depth) {
1752
1749
ManglingError
1753
1750
Remangler::mangleProtocolListWithoutPrefix (Node *node, unsigned depth,
1754
1751
Node *additionalProto) {
1755
- assert (node->getKind () == Node::Kind::ProtocolList);
1756
- assert (node->getNumChildren () == 1 );
1752
+ DEMANGLER_ASSERT (node->getKind () == Node::Kind::ProtocolList, node );
1753
+ DEMANGLER_ASSERT (node->getNumChildren () == 1 , node );
1757
1754
auto typeList = node->begin ()[0 ];
1758
- assert (typeList->getKind () == Node::Kind::TypeList);
1755
+ DEMANGLER_ASSERT (typeList->getKind () == Node::Kind::TypeList, typeList );
1759
1756
for (auto &child : *typeList) {
1760
1757
RETURN_IF_ERROR (mangleProtocolWithoutPrefix (child, depth + 1 ));
1761
1758
}
@@ -1932,7 +1929,7 @@ ManglingError Remangler::mangleConstrainedType(Node *node, unsigned depth) {
1932
1929
1933
1930
ManglingError Remangler::mangleAssociatedType (Node *node, unsigned depth) {
1934
1931
if (node->hasChildren ()) {
1935
- assert (node->getNumChildren () == 1 );
1932
+ DEMANGLER_ASSERT (node->getNumChildren () == 1 , node );
1936
1933
return mangleProtocolListWithoutPrefix (*node->begin (), depth + 1 );
1937
1934
} else {
1938
1935
Buffer << ' _' ;
@@ -1946,7 +1943,8 @@ ManglingError Remangler::mangleDeclContext(Node *node, unsigned depth) {
1946
1943
1947
1944
ManglingError Remangler::mangleExtension (Node *node, EntityContext &ctx,
1948
1945
unsigned depth) {
1949
- assert (node->getNumChildren () == 2 || node->getNumChildren () == 3 );
1946
+ DEMANGLER_ASSERT (node->getNumChildren () == 2 || node->getNumChildren () == 3 ,
1947
+ node);
1950
1948
if (node->getNumChildren () == 3 ) {
1951
1949
Buffer << ' e' ;
1952
1950
} else {
@@ -2006,10 +2004,10 @@ ManglingError Remangler::mangleDependentMemberType(Node *node, unsigned depth) {
2006
2004
base = base->getFirstChild ()->getFirstChild ();
2007
2005
} while (base->getKind () == Node::Kind::DependentMemberType);
2008
2006
2009
- assert (base->getKind () == Node::Kind::DependentGenericParamType
2010
- && " dependent members not based on a generic param are non-canonical "
2011
- " and shouldn't need remangling" );
2012
- assert (members.size () >= 1 );
2007
+ DEMANGLER_ASSERT (base->getKind () == Node::Kind::DependentGenericParamType
2008
+ && " dependent members not based on a generic param are "
2009
+ " non-canonical and shouldn't need remangling" , base );
2010
+ DEMANGLER_ASSERT (members.size () >= 1 , node );
2013
2011
if (members.size () == 1 ) {
2014
2012
Buffer << ' w' ;
2015
2013
RETURN_IF_ERROR (mangleDependentGenericParamIndex (base, depth + 1 ));
@@ -2098,11 +2096,11 @@ ManglingError Remangler::mangleProtocolWithoutPrefix(Node *node,
2098
2096
return ManglingError::Success;
2099
2097
2100
2098
if (node->getKind () == Node::Kind::Type) {
2101
- assert (node->getNumChildren () == 1 );
2099
+ DEMANGLER_ASSERT (node->getNumChildren () == 1 , node );
2102
2100
node = node->begin ()[0 ];
2103
2101
}
2104
2102
2105
- assert (node->getKind () == Node::Kind::Protocol);
2103
+ DEMANGLER_ASSERT (node->getKind () == Node::Kind::Protocol, node );
2106
2104
EntityContext ctx;
2107
2105
return mangleNominalType (node, ' \0 ' , ctx, depth + 1 );
2108
2106
}
@@ -2125,7 +2123,7 @@ ManglingError Remangler::mangleGenericArgs(Node *node, EntityContext &ctx,
2125
2123
case Node::Kind::BoundGenericEnum:
2126
2124
case Node::Kind::BoundGenericClass: {
2127
2125
NodePointer unboundType = node->getChild (0 );
2128
- assert (unboundType->getKind () == Node::Kind::Type);
2126
+ DEMANGLER_ASSERT (unboundType->getKind () == Node::Kind::Type, unboundType );
2129
2127
NodePointer nominalType = unboundType->getChild (0 );
2130
2128
NodePointer parentOrModule = nominalType->getChild (0 );
2131
2129
RETURN_IF_ERROR (mangleGenericArgs (parentOrModule, ctx, depth + 1 ));
@@ -2490,26 +2488,28 @@ ManglingError Remangler::mangleVTableThunk(Node *node, unsigned depth) {
2490
2488
2491
2489
ManglingError Remangler::mangleSILBoxTypeWithLayout (Node *node,
2492
2490
unsigned depth) {
2493
- assert (node->getKind () == Node::Kind::SILBoxTypeWithLayout);
2494
- assert (node->getNumChildren () == 1 || node->getNumChildren () == 3 );
2491
+ DEMANGLER_ASSERT (node->getKind () == Node::Kind::SILBoxTypeWithLayout, node);
2492
+ DEMANGLER_ASSERT (node->getNumChildren () == 1 || node->getNumChildren () == 3 ,
2493
+ node);
2495
2494
Buffer << " XB" ;
2496
2495
auto layout = node->getChild (0 );
2497
- assert (layout->getKind () == Node::Kind::SILBoxLayout);
2496
+ DEMANGLER_ASSERT (layout->getKind () == Node::Kind::SILBoxLayout, layout );
2498
2497
NodePointer genericArgs = nullptr ;
2499
2498
if (node->getNumChildren () == 3 ) {
2500
2499
NodePointer signature = node->getChild (1 );
2501
- assert (signature->getKind () == Node::Kind::DependentGenericSignature);
2500
+ DEMANGLER_ASSERT (signature->getKind () == Node::Kind::DependentGenericSignature,
2501
+ signature);
2502
2502
genericArgs = node->getChild (2 );
2503
- assert (genericArgs->getKind () == Node::Kind::TypeList);
2504
-
2503
+ DEMANGLER_ASSERT (genericArgs->getKind () == Node::Kind::TypeList, genericArgs );
2504
+
2505
2505
Buffer << ' G' ;
2506
2506
RETURN_IF_ERROR (mangleDependentGenericSignature (signature, depth + 1 ));
2507
2507
}
2508
2508
RETURN_IF_ERROR (mangleSILBoxLayout (layout, depth + 1 ));
2509
2509
if (genericArgs) {
2510
2510
for (unsigned i = 0 ; i < genericArgs->getNumChildren (); ++i) {
2511
2511
auto type = genericArgs->getChild (i);
2512
- assert (genericArgs->getKind () == Node::Kind::Type);
2512
+ DEMANGLER_ASSERT (genericArgs->getKind () == Node::Kind::Type, genericArgs );
2513
2513
RETURN_IF_ERROR (mangleType (type, depth + 1 ));
2514
2514
}
2515
2515
Buffer << ' _' ;
@@ -2519,10 +2519,11 @@ ManglingError Remangler::mangleSILBoxTypeWithLayout(Node *node,
2519
2519
}
2520
2520
2521
2521
ManglingError Remangler::mangleSILBoxLayout (Node *node, unsigned depth) {
2522
- assert (node->getKind () == Node::Kind::SILBoxLayout);
2522
+ DEMANGLER_ASSERT (node->getKind () == Node::Kind::SILBoxLayout, node );
2523
2523
for (unsigned i = 0 ; i < node->getNumChildren (); ++i) {
2524
- assert (node->getKind () == Node::Kind::SILBoxImmutableField
2525
- || node->getKind () == Node::Kind::SILBoxMutableField);
2524
+ DEMANGLER_ASSERT (node->getKind () == Node::Kind::SILBoxImmutableField
2525
+ || node->getKind () == Node::Kind::SILBoxMutableField,
2526
+ node);
2526
2527
RETURN_IF_ERROR (mangle (node->getChild (i), depth + 1 ));
2527
2528
}
2528
2529
Buffer << ' _' ;
@@ -2532,16 +2533,16 @@ ManglingError Remangler::mangleSILBoxLayout(Node *node, unsigned depth) {
2532
2533
2533
2534
ManglingError Remangler::mangleSILBoxMutableField (Node *node, unsigned depth) {
2534
2535
Buffer << ' m' ;
2535
- assert (node->getNumChildren () == 1
2536
- && node->getChild (0 )->getKind () == Node::Kind::Type);
2536
+ DEMANGLER_ASSERT (node->getNumChildren () == 1
2537
+ && node->getChild (0 )->getKind () == Node::Kind::Type, node );
2537
2538
return mangleType (node->getChild (0 ), depth + 1 );
2538
2539
}
2539
2540
2540
2541
ManglingError Remangler::mangleSILBoxImmutableField (Node *node,
2541
2542
unsigned depth) {
2542
2543
Buffer << ' i' ;
2543
- assert (node->getNumChildren () == 1
2544
- && node->getChild (0 )->getKind () == Node::Kind::Type);
2544
+ DEMANGLER_ASSERT (node->getNumChildren () == 1
2545
+ && node->getChild (0 )->getKind () == Node::Kind::Type, node );
2545
2546
return mangleType (node->getChild (0 ), depth + 1 );
2546
2547
}
2547
2548
@@ -2730,7 +2731,7 @@ Demangle::mangleNodeOld(NodePointer node, NodeFactory &Factory) {
2730
2731
ManglingErrorOr<const char *>
2731
2732
Demangle::mangleNodeAsObjcCString (NodePointer node,
2732
2733
NodeFactory &Factory) {
2733
- assert ( node);
2734
+ DEMANGLER_ASSERT (node, node);
2734
2735
2735
2736
Remangler remangler (Factory);
2736
2737
remangler.append (" _Tt" );
0 commit comments