Skip to content

Commit e6f2e7b

Browse files
committed
Mangling: add a few utility functions in the new mangler and demangler which will be used by reflection mangling
1 parent 2a06415 commit e6f2e7b

File tree

6 files changed

+54
-19
lines changed

6 files changed

+54
-19
lines changed

include/swift/AST/ASTMangler.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class ASTMangler : public Mangler {
3939
const DeclContext *DeclCtx = nullptr;
4040

4141
/// Optimize out protocol names if a type only conforms to one protocol.
42-
bool OptimizeProtocolNames;
42+
bool OptimizeProtocolNames = true;
4343

4444
/// If enabled, Arche- and Alias types are mangled with context.
4545
bool DWARFMangling;
@@ -55,10 +55,8 @@ class ASTMangler : public Mangler {
5555
};
5656

5757
ASTMangler(bool DWARFMangling = false,
58-
bool usePunycode = true,
59-
bool OptimizeProtocolNames = true)
58+
bool usePunycode = true)
6059
: Mangler(usePunycode),
61-
OptimizeProtocolNames(OptimizeProtocolNames),
6260
DWARFMangling(DWARFMangling) {}
6361

6462
std::string mangleClosureEntity(const AbstractClosureExpr *closure,
@@ -115,7 +113,9 @@ class ASTMangler : public Mangler {
115113

116114
std::string mangleTypeForDebugger(Type decl, const DeclContext *DC);
117115

118-
std::string mangleTypeAsUSR(Type type);
116+
std::string mangleTypeAsUSR(Type type) {
117+
return mangleTypeWithoutPrefix(type);
118+
}
119119

120120
std::string mangleTypeAsContextUSR(const NominalTypeDecl *type);
121121

@@ -225,6 +225,11 @@ class ASTMangler : public Mangler {
225225

226226
void appendOpParamForLayoutConstraint(LayoutConstraint Layout);
227227

228+
std::string mangleTypeWithoutPrefix(Type type) {
229+
appendType(type);
230+
return finalize();
231+
}
232+
228233
static bool checkGenericParamsOrder(ArrayRef<GenericTypeParamType *> params);
229234
};
230235

include/swift/Basic/Demangler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ class Demangler {
114114

115115
NodePointer demangleTopLevel();
116116

117+
NodePointer demangleType();
118+
117119
private:
118120

119121
void addSubstitution(NodePointer Nd) {
@@ -166,6 +168,8 @@ class Demangler {
166168
return createWithChild(kind, popNode(Node::Kind::Type));
167169
}
168170

171+
void parseAndPushNodes();
172+
169173
NodePointer changeKind(NodePointer Node, Node::Kind NewKind);
170174

171175
NodePointer demangleOperator();

lib/AST/ASTMangler.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -272,11 +272,6 @@ std::string ASTMangler::mangleTypeForDebugger(Type Ty, const DeclContext *DC) {
272272
return finalize();
273273
}
274274

275-
std::string ASTMangler::mangleTypeAsUSR(Type type) {
276-
appendType(type);
277-
return finalize();
278-
}
279-
280275
std::string ASTMangler::mangleTypeAsContextUSR(const NominalTypeDecl *type) {
281276
appendContext(type);
282277
return finalize();

lib/Basic/Demangler.cpp

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,9 @@ NodePointer Demangler::demangleTopLevel() {
116116

117117
NodePointer topLevel = NodeFactory::create(Node::Kind::Global);
118118

119-
int Idx = 0;
120-
while (!Text.empty()) {
121-
NodePointer Node = demangleOperator();
122-
if (!Node)
123-
break;
124-
pushNode(Node);
125-
Idx++;
126-
}
119+
parseAndPushNodes();
127120

128-
// Let a trailing '_' be part of the not demangled suffix.
121+
// Let a trailing '_' be part of the not demangled suffix.
129122
popNode(Node::Kind::FirstElementMarker);
130123

131124
size_t EndPos = (NodeStack.empty() ? 0 : NodeStack.back().Pos);
@@ -167,6 +160,26 @@ NodePointer Demangler::demangleTopLevel() {
167160
return topLevel;
168161
}
169162

163+
NodePointer Demangler::demangleType() {
164+
parseAndPushNodes();
165+
166+
if (NodePointer Result = popNode())
167+
return Result;
168+
169+
return NodeFactory::create(Node::Kind::Suffix, Text);
170+
}
171+
172+
void Demangler::parseAndPushNodes() {
173+
int Idx = 0;
174+
while (!Text.empty()) {
175+
NodePointer Node = demangleOperator();
176+
if (!Node)
177+
break;
178+
pushNode(Node);
179+
Idx++;
180+
}
181+
}
182+
170183
NodePointer Demangler::changeKind(NodePointer Node, Node::Kind NewKind) {
171184
if (!Node)
172185
return nullptr;

lib/IRGen/IRGenMangler.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,14 @@ std::string IRGenMangler::manglePartialApplyForwarder(StringRef FuncName) {
4949
appendOperator("TA");
5050
return finalize();
5151
}
52+
53+
std::string IRGenMangler::mangleTypeForReflection(Type Ty,
54+
ModuleDecl *Module,
55+
bool isSingleFieldOfBox) {
56+
Mod = Module;
57+
OptimizeProtocolNames = false;
58+
appendType(Ty);
59+
if (isSingleFieldOfBox)
60+
appendOperator("Xb");
61+
return finalize();
62+
}

lib/IRGen/IRGenMangler.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ class IRGenMangler : public NewMangling::ASTMangler {
162162

163163
std::string manglePartialApplyForwarder(StringRef FuncName);
164164

165+
std::string mangleTypeForMetadata(Type type) {
166+
return mangleTypeWithoutPrefix(type);
167+
}
168+
169+
std::string mangleTypeForReflection(Type Ty, ModuleDecl *Module,
170+
bool isSingleFieldOfBox);
171+
165172
protected:
166173

167174
std::string mangleTypeSymbol(Type type, const char *Op) {

0 commit comments

Comments
 (0)