@@ -246,11 +246,17 @@ _findContextDescriptor(Demangle::NodePointer node,
246
246
Demangle::Demangler &Dem);
247
247
248
248
// / Find the context descriptor for the type extended by the given extension.
249
+ // /
250
+ // / If \p maybeExtension isn't actually an extension context, returns nullptr.
249
251
static const ContextDescriptor *
250
- _findExtendedTypeContextDescriptor (const ExtensionContextDescriptor *extension ,
252
+ _findExtendedTypeContextDescriptor (const ContextDescriptor *maybeExtension ,
251
253
Demangler &demangler,
252
254
Demangle::NodePointer *demangledNode
253
255
= nullptr ) {
256
+ auto extension = dyn_cast<ExtensionContextDescriptor>(maybeExtension);
257
+ if (!extension)
258
+ return nullptr ;
259
+
254
260
Demangle::NodePointer localNode;
255
261
Demangle::NodePointer &node = demangledNode ? *demangledNode : localNode;
256
262
@@ -844,28 +850,26 @@ bool swift::_gatherGenericParameterCounts(
844
850
DemanglerForRuntimeTypeResolution<> demangler;
845
851
demangler.providePreallocatedMemory (BorrowFrom);
846
852
847
- if (auto extension = dyn_cast<ExtensionContextDescriptor>(descriptor)) {
848
- // If we have an nominal type extension descriptor, extract the extended type
853
+ if (auto extension = _findExtendedTypeContextDescriptor (descriptor,
854
+ demangler)) {
855
+ // If we have a nominal type extension descriptor, extract the extended type
849
856
// and use that. If the extension is not nominal, then we can use the
850
857
// extension's own signature.
851
- if (auto extendedType =
852
- _findExtendedTypeContextDescriptor (extension, demangler)) {
853
- descriptor = extendedType;
854
- }
858
+ descriptor = extension;
855
859
}
856
860
857
861
// Once we hit a non-generic descriptor, we're done.
858
862
if (!descriptor->isGeneric ()) return false ;
859
863
860
864
// Recurse to record the parent context's generic parameters.
861
- if ( auto parent = descriptor->Parent .get ())
862
- (void )_gatherGenericParameterCounts (parent, genericParamCounts, demangler);
865
+ auto parent = descriptor->Parent .get ();
866
+ (void )_gatherGenericParameterCounts (parent, genericParamCounts, demangler);
863
867
864
868
// Record a new level of generic parameters if the count exceeds the
865
869
// previous count.
866
- auto myCount =
867
- descriptor->getGenericContext ()-> getGenericContextHeader (). NumParams ;
868
- if (genericParamCounts. empty () || myCount > genericParamCounts. back () ) {
870
+ unsigned parentCount = parent-> getNumGenericParams ();
871
+ unsigned myCount = descriptor->getNumGenericParams () ;
872
+ if (myCount > parentCount ) {
869
873
genericParamCounts.push_back (myCount);
870
874
return true ;
871
875
}
@@ -1658,32 +1662,50 @@ static void installGetClassHook() {
1658
1662
#endif
1659
1663
1660
1664
unsigned SubstGenericParametersFromMetadata::
1661
- buildDescriptorPath (const ContextDescriptor *context) const {
1665
+ buildDescriptorPath (const ContextDescriptor *context,
1666
+ Demangler &borrowFrom) const {
1667
+ assert (sourceIsMetadata);
1668
+
1662
1669
// Terminating condition: we don't have a context.
1663
1670
if (!context)
1664
1671
return 0 ;
1665
1672
1673
+ DemanglerForRuntimeTypeResolution<> demangler;
1674
+ demangler.providePreallocatedMemory (borrowFrom);
1675
+
1676
+ if (auto extension = _findExtendedTypeContextDescriptor (context, demangler)) {
1677
+ // If we have a nominal type extension descriptor, extract the extended type
1678
+ // and use that. If the extension is not nominal, then we can use the
1679
+ // extension's own signature.
1680
+ context = extension;
1681
+ }
1682
+
1666
1683
// Add the parent's contribution to the descriptor path.
1667
- unsigned numKeyGenericParamsInParent =
1668
- buildDescriptorPath (context-> Parent . get () );
1684
+ const ContextDescriptor *parent = context-> Parent . get ();
1685
+ unsigned numKeyGenericParamsInParent = buildDescriptorPath (parent, demangler );
1669
1686
1670
1687
// If this context is non-generic, we're done.
1671
1688
if (!context->isGeneric ())
1672
1689
return numKeyGenericParamsInParent;
1673
1690
1674
1691
// Count the number of key generic params at this level.
1692
+ auto allGenericParams = baseContext->getGenericContext ()->getGenericParams ();
1693
+ unsigned parentCount = parent->getNumGenericParams ();
1694
+ unsigned localCount = context->getNumGenericParams ();
1695
+ auto localGenericParams = allGenericParams.slice (parentCount,
1696
+ localCount - parentCount);
1697
+
1675
1698
unsigned numKeyGenericParamsHere = 0 ;
1676
1699
bool hasNonKeyGenericParams = false ;
1677
- auto localGenericParams = getLocalGenericParams (context);
1678
1700
for (const auto &genericParam : localGenericParams) {
1679
1701
if (genericParam.hasKeyArgument ())
1680
1702
++numKeyGenericParamsHere;
1681
1703
else
1682
1704
hasNonKeyGenericParams = true ;
1683
1705
}
1684
1706
1685
- // Form the path element if there are any generic parameters to be found .
1686
- if (numKeyGenericParamsHere != 0 )
1707
+ // Form the path element if there are any new generic parameters.
1708
+ if (localCount > parentCount )
1687
1709
descriptorPath.push_back (PathElement{localGenericParams,
1688
1710
context->getNumGenericParams (),
1689
1711
numKeyGenericParamsInParent,
@@ -1738,7 +1760,8 @@ void SubstGenericParametersFromMetadata::setup() const {
1738
1760
return ;
1739
1761
1740
1762
if (sourceIsMetadata && baseContext) {
1741
- numKeyGenericParameters = buildDescriptorPath (baseContext);
1763
+ DemanglerForRuntimeTypeResolution<StackAllocatedDemangler<2048 >> demangler;
1764
+ numKeyGenericParameters = buildDescriptorPath (baseContext, demangler);
1742
1765
return ;
1743
1766
}
1744
1767
0 commit comments