@@ -50,16 +50,17 @@ using namespace reflection;
50
50
#include < dlfcn.h>
51
51
#endif
52
52
53
- // / Produce a Demangler value suitable for resolving runtime type metadata
54
- // / strings.
55
- static Demangler getDemanglerForRuntimeTypeResolution () {
56
- Demangler dem;
57
- // Resolve symbolic references to type contexts into the absolute address of
58
- // the type context descriptor, so that if we see a symbolic reference in the
59
- // mangled name we can immediately find the associated metadata.
60
- dem.setSymbolicReferenceResolver (ResolveAsSymbolicReference (dem));
61
- return dem;
62
- }
53
+ // / A Demangler suitable for resolving runtime type metadata strings.
54
+ template <class Base = Demangler>
55
+ class DemanglerForRuntimeTypeResolution : public Base {
56
+ public:
57
+ DemanglerForRuntimeTypeResolution () {
58
+ // Resolve symbolic references to type contexts into the absolute address of
59
+ // the type context descriptor, so that if we see a symbolic reference in
60
+ // the mangled name we can immediately find the associated metadata.
61
+ Base::setSymbolicReferenceResolver (ResolveAsSymbolicReference (*this ));
62
+ }
63
+ };
63
64
64
65
NodePointer
65
66
ResolveAsSymbolicReference::operator ()(SymbolicReferenceKind kind,
@@ -416,7 +417,7 @@ swift::_contextDescriptorMatchesMangling(const ContextDescriptor *context,
416
417
417
418
// Check that the context being extended matches as well.
418
419
auto extendedContextNode = node->getChild (1 );
419
- auto demangler = getDemanglerForRuntimeTypeResolution () ;
420
+ DemanglerForRuntimeTypeResolution<> demangler;
420
421
421
422
auto extendedDescriptorFromNode =
422
423
_findNominalTypeDescriptor (extendedContextNode, demangler);
@@ -593,7 +594,7 @@ _findNominalTypeDescriptor(Demangle::NodePointer node,
593
594
(const ContextDescriptor *)symbolicNode->getIndex ());
594
595
595
596
auto mangledName =
596
- Demangle::mangleNode (node, ExpandResolvedSymbolicReferences (Dem));
597
+ Demangle::mangleNode (node, ExpandResolvedSymbolicReferences (Dem), &Dem );
597
598
598
599
// Look for an existing entry.
599
600
// Find the bucket for the metadata entry.
@@ -723,7 +724,7 @@ _findProtocolDescriptor(NodePointer node,
723
724
(const ContextDescriptor *)symbolicNode->getIndex ());
724
725
725
726
mangledName =
726
- Demangle::mangleNode (node, ExpandResolvedSymbolicReferences (Dem));
727
+ Demangle::mangleNode (node, ExpandResolvedSymbolicReferences (Dem), &Dem );
727
728
728
729
// Look for an existing entry.
729
730
// Find the bucket for the metadata entry.
@@ -820,10 +821,13 @@ Optional<unsigned> swift::_depthIndexToFlatIndex(
820
821
// / \returns true if the innermost descriptor is generic.
821
822
bool swift::_gatherGenericParameterCounts (
822
823
const ContextDescriptor *descriptor,
823
- std::vector<unsigned > &genericParamCounts) {
824
+ std::vector<unsigned > &genericParamCounts,
825
+ Demangler &BorrowFrom) {
824
826
// If we have an extension descriptor, extract the extended type and use
825
827
// that.
826
- auto demangler = getDemanglerForRuntimeTypeResolution ();
828
+ DemanglerForRuntimeTypeResolution<> demangler;
829
+ demangler.providePreallocatedMemory (BorrowFrom);
830
+
827
831
if (auto extension = dyn_cast<ExtensionContextDescriptor>(descriptor)) {
828
832
if (auto extendedType =
829
833
_findExtendedTypeContextDescriptor (extension, demangler))
@@ -835,7 +839,7 @@ bool swift::_gatherGenericParameterCounts(
835
839
836
840
// Recurse to record the parent context's generic parameters.
837
841
if (auto parent = descriptor->Parent .get ())
838
- (void )_gatherGenericParameterCounts (parent, genericParamCounts);
842
+ (void )_gatherGenericParameterCounts (parent, genericParamCounts, demangler );
839
843
840
844
// Record a new level of generic parameters if the count exceeds the
841
845
// previous count.
@@ -961,7 +965,7 @@ class DecodedMetadataBuilder {
961
965
#if SWIFT_OBJC_INTEROP
962
966
// Look for a Swift-defined @objc protocol with the Swift 3 mangling that
963
967
// is used for Objective-C entities.
964
- std::string objcMangledName = " _Tt" + mangleNodeOld (node) + " _" ;
968
+ std::string objcMangledName = " _Tt" + mangleNodeOld (node, &demangler ) + " _" ;
965
969
if (auto protocol = objc_getProtocol (objcMangledName.c_str ()))
966
970
return ProtocolDescriptorRef::forObjC (protocol);
967
971
#endif
@@ -1024,7 +1028,7 @@ class DecodedMetadataBuilder {
1024
1028
// Figure out the various levels of generic parameters we have in
1025
1029
// this type.
1026
1030
std::vector<unsigned > genericParamCounts;
1027
- (void )_gatherGenericParameterCounts (typeDecl, genericParamCounts);
1031
+ (void )_gatherGenericParameterCounts (typeDecl, genericParamCounts, demangler );
1028
1032
unsigned numTotalGenericParams =
1029
1033
genericParamCounts.empty () ? 0 : genericParamCounts.back ();
1030
1034
@@ -1048,7 +1052,7 @@ class DecodedMetadataBuilder {
1048
1052
// If we have a parent, gather it's generic arguments "as written".
1049
1053
if (parent) {
1050
1054
gatherWrittenGenericArgs (parent, parent->getTypeContextDescriptor (),
1051
- allGenericArgs);
1055
+ allGenericArgs, demangler );
1052
1056
}
1053
1057
1054
1058
// Add the generic arguments we were given.
@@ -1294,7 +1298,8 @@ static TypeInfo swift_getTypeByMangledNameImpl(
1294
1298
StringRef typeName,
1295
1299
SubstGenericParameterFn substGenericParam,
1296
1300
SubstDependentWitnessTableFn substWitnessTable) {
1297
- auto demangler = getDemanglerForRuntimeTypeResolution ();
1301
+ DemanglerForRuntimeTypeResolution<StackAllocatedDemangler<2048 >> demangler;
1302
+
1298
1303
NodePointer node;
1299
1304
1300
1305
// Check whether this is the convenience syntax "ModuleName.ClassName".
@@ -1620,7 +1625,8 @@ demangleToGenericParamRef(StringRef typeName) {
1620
1625
void swift::gatherWrittenGenericArgs (
1621
1626
const Metadata *metadata,
1622
1627
const TypeContextDescriptor *description,
1623
- std::vector<const Metadata *> &allGenericArgs) {
1628
+ std::vector<const Metadata *> &allGenericArgs,
1629
+ Demangler &BorrowFrom) {
1624
1630
auto generics = description->getGenericContext ();
1625
1631
if (!generics)
1626
1632
return ;
@@ -1674,7 +1680,8 @@ void swift::gatherWrittenGenericArgs(
1674
1680
1675
1681
// Retrieve the mapping information needed for depth/index -> flat index.
1676
1682
std::vector<unsigned > genericParamCounts;
1677
- (void )_gatherGenericParameterCounts (description, genericParamCounts);
1683
+ (void )_gatherGenericParameterCounts (description, genericParamCounts,
1684
+ BorrowFrom);
1678
1685
1679
1686
// Walk through the generic requirements to evaluate same-type
1680
1687
// constraints that are needed to fill in missing generic arguments.
0 commit comments