Skip to content

Commit d35b8aa

Browse files
committed
TypeDecoder: Change createTupleType() to take labels as ArrayRef<StringRef> instead of std::string
1 parent c7a2c56 commit d35b8aa

File tree

9 files changed

+80
-68
lines changed

9 files changed

+80
-68
lines changed

include/swift/AST/ASTDemangler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class ASTBuilder {
109109
Type createBoundGenericType(GenericTypeDecl *decl, ArrayRef<Type> args,
110110
Type parent);
111111

112-
Type createTupleType(ArrayRef<Type> eltTypes, StringRef labels);
112+
Type createTupleType(ArrayRef<Type> eltTypes, ArrayRef<StringRef> labels);
113113

114114
Type createPackType(ArrayRef<Type> eltTypes);
115115

include/swift/Demangling/TypeDecoder.h

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,8 @@ class TypeDecoder {
10191019

10201020
case NodeKind::Tuple: {
10211021
llvm::SmallVector<BuiltType, 8> elements;
1022-
std::string labels;
1022+
llvm::SmallVector<StringRef, 8> labels;
1023+
10231024
for (auto &element : *Node) {
10241025
if (element->getKind() != NodeKind::TupleElement)
10251026
return MAKE_NODE_TYPE_ERROR0(Node, "unexpected kind");
@@ -1031,18 +1032,12 @@ class TypeDecoder {
10311032
"no children");
10321033
}
10331034
if (element->getChild(typeChildIndex)->getKind() == NodeKind::TupleElementName) {
1034-
// Add spaces to terminate all the previous labels if this
1035-
// is the first we've seen.
1036-
if (labels.empty()) labels.append(elements.size(), ' ');
1037-
1038-
// Add the label and its terminator.
1039-
labels += element->getChild(typeChildIndex)->getText();
1040-
labels += ' ';
1035+
labels.push_back(element->getChild(typeChildIndex)->getText());
10411036
typeChildIndex++;
10421037

1043-
// Otherwise, add a space if a previous element had a label.
1044-
} else if (!labels.empty()) {
1045-
labels += ' ';
1038+
// Otherwise, add an empty label.
1039+
} else {
1040+
labels.push_back(StringRef());
10461041
}
10471042

10481043
// Decode the element type.
@@ -1054,7 +1049,7 @@ class TypeDecoder {
10541049

10551050
elements.push_back(elementType.getType());
10561051
}
1057-
return Builder.createTupleType(elements, std::move(labels));
1052+
return Builder.createTupleType(elements, labels);
10581053
}
10591054
case NodeKind::TupleElement:
10601055
if (Node->getNumChildren() < 1)

include/swift/Remote/MetadataReader.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -870,13 +870,26 @@ class MetadataReader {
870870
}
871871

872872
// Read the labels string.
873-
std::string labels;
873+
std::string labelStr;
874874
if (tupleMeta->Labels &&
875-
!Reader->readString(RemoteAddress(tupleMeta->Labels), labels))
875+
!Reader->readString(RemoteAddress(tupleMeta->Labels), labelStr))
876876
return BuiltType();
877877

878+
std::vector<llvm::StringRef> labels;
879+
std::string::size_type end, start = 0;
880+
while (true) {
881+
end = labelStr.find(' ', start);
882+
if (end == std::string::npos)
883+
break;
884+
labels.push_back(llvm::StringRef(labelStr.data() + start, end - start));
885+
start = end + 1;
886+
}
887+
// Pad the vector with empty labels.
888+
for (unsigned i = labels.size(); i < elementTypes.size(); ++i)
889+
labels.push_back(StringRef());
890+
878891
auto BuiltTuple =
879-
Builder.createTupleType(elementTypes, std::move(labels));
892+
Builder.createTupleType(elementTypes, labels);
880893
TypeCache[MetadataAddress] = BuiltTuple;
881894
return BuiltTuple;
882895
}

include/swift/RemoteInspection/TypeRef.h

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class TypeRefID {
8383
Bits.push_back(Integer >> 32);
8484
}
8585

86-
void addString(const std::string &String) {
86+
void addString(llvm::StringRef String) {
8787
if (String.empty()) {
8888
Bits.push_back(0);
8989
} else {
@@ -364,47 +364,34 @@ class BoundGenericTypeRef final : public TypeRef, public NominalTypeTrait {
364364
class TupleTypeRef final : public TypeRef {
365365
protected:
366366
std::vector<const TypeRef *> Elements;
367-
std::string Labels;
367+
std::vector<StringRef> Labels;
368368

369369
static TypeRefID Profile(const std::vector<const TypeRef *> &Elements,
370-
const std::string &Labels) {
370+
const std::vector<StringRef> &Labels) {
371371
TypeRefID ID;
372372
for (auto Element : Elements)
373373
ID.addPointer(Element);
374-
ID.addString(Labels);
374+
for (auto Label : Labels)
375+
ID.addString(Label);
375376
return ID;
376377
}
377378

378379
public:
379-
TupleTypeRef(std::vector<const TypeRef *> Elements, std::string &&Labels)
380+
TupleTypeRef(std::vector<const TypeRef *> Elements,
381+
std::vector<StringRef> Labels)
380382
: TypeRef(TypeRefKind::Tuple), Elements(std::move(Elements)),
381-
Labels(Labels) {}
383+
Labels(std::move(Labels)) {}
382384

383385
template <typename Allocator>
384386
static const TupleTypeRef *create(Allocator &A,
385387
std::vector<const TypeRef *> Elements,
386-
std::string &&Labels) {
388+
const std::vector<StringRef> Labels) {
387389
FIND_OR_CREATE_TYPEREF(A, TupleTypeRef, Elements, Labels);
388390
}
389391

390392
const std::vector<const TypeRef *> &getElements() const { return Elements; };
391-
const std::string &getLabelString() const { return Labels; };
392-
std::vector<llvm::StringRef> getLabels() const {
393-
std::vector<llvm::StringRef> Vec;
394-
std::string::size_type End, Start = 0;
395-
while (true) {
396-
End = Labels.find(' ', Start);
397-
if (End == std::string::npos)
398-
break;
399-
Vec.push_back(llvm::StringRef(Labels.data() + Start, End - Start));
400-
Start = End + 1;
401-
}
402-
// A canonicalized TypeRef has an empty label string.
403-
// Pad the vector with empty labels.
404-
for (unsigned N = Vec.size(); N < Elements.size(); ++N)
405-
Vec.push_back({});
406-
return Vec;
407-
};
393+
394+
const std::vector<llvm::StringRef> &getLabels() const { return Labels; }
408395

409396
static bool classof(const TypeRef *TR) {
410397
return TR->getKind() == TypeRefKind::Tuple;

include/swift/RemoteInspection/TypeRefBuilder.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -743,8 +743,8 @@ class TypeRefBuilder {
743743
}
744744

745745
const TupleTypeRef *createTupleType(llvm::ArrayRef<const TypeRef *> elements,
746-
std::string &&labels) {
747-
return TupleTypeRef::create(*this, elements, std::move(labels));
746+
llvm::ArrayRef<StringRef> labels) {
747+
return TupleTypeRef::create(*this, elements, labels);
748748
}
749749

750750
const TypeRef *createPackType(llvm::ArrayRef<const TypeRef *> elements) {
@@ -825,7 +825,7 @@ class TypeRefBuilder {
825825
break;
826826
}
827827

828-
auto result = createTupleType({}, "");
828+
auto result = createTupleType({}, llvm::ArrayRef<llvm::StringRef>());
829829
return FunctionTypeRef::create(
830830
*this, {}, result, funcFlags, diffKind, nullptr);
831831
}

lib/AST/ASTDemangler.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -327,18 +327,14 @@ Type ASTBuilder::createBoundGenericType(GenericTypeDecl *decl,
327327
return aliasDecl->getDeclaredInterfaceType().subst(subMap);
328328
}
329329

330-
Type ASTBuilder::createTupleType(ArrayRef<Type> eltTypes, StringRef labels) {
330+
Type ASTBuilder::createTupleType(ArrayRef<Type> eltTypes, ArrayRef<StringRef> labels) {
331331
SmallVector<TupleTypeElt, 4> elements;
332332
elements.reserve(eltTypes.size());
333-
for (auto eltType : eltTypes) {
333+
for (unsigned i : indices(eltTypes)) {
334334
Identifier label;
335-
if (!labels.empty()) {
336-
auto split = labels.split(' ');
337-
if (!split.first.empty())
338-
label = Ctx.getIdentifier(split.first);
339-
labels = split.second;
340-
}
341-
elements.emplace_back(eltType, label);
335+
if (!labels[i].empty())
336+
label = Ctx.getIdentifier(labels[i]);
337+
elements.emplace_back(eltTypes[i], label);
342338
}
343339

344340
return TupleType::get(elements, Ctx);

stdlib/public/RemoteInspection/TypeRef.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class PrintTypeRef : public TypeRefVisitor<PrintTypeRef, void> {
111111

112112
void visitTupleTypeRef(const TupleTypeRef *T) {
113113
printHeader("tuple");
114-
T->getLabels();
114+
115115
auto Labels = T->getLabels();
116116
for (auto NameElement : llvm::zip_first(Labels, T->getElements())) {
117117
auto Label = std::get<0>(NameElement);
@@ -1133,8 +1133,8 @@ class ThickenMetatype
11331133
std::vector<const TypeRef *> Elements;
11341134
for (auto Element : T->getElements())
11351135
Elements.push_back(visit(Element));
1136-
std::string Labels = T->getLabelString();
1137-
return TupleTypeRef::create(Builder, Elements, std::move(Labels));
1136+
auto Labels = T->getLabels();
1137+
return TupleTypeRef::create(Builder, Elements, Labels);
11381138
}
11391139

11401140
const TypeRef *visitFunctionTypeRef(const FunctionTypeRef *F) {
@@ -1268,8 +1268,8 @@ class TypeRefSubstitution
12681268
std::vector<const TypeRef *> Elements;
12691269
for (auto Element : T->getElements())
12701270
Elements.push_back(visit(Element));
1271-
std::string Labels = T->getLabelString();
1272-
return TupleTypeRef::create(Builder, Elements, std::move(Labels));
1271+
auto Labels = T->getLabels();
1272+
return TupleTypeRef::create(Builder, Elements, Labels);
12731273
}
12741274

12751275
const TypeRef *visitFunctionTypeRef(const FunctionTypeRef *F) {

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "Private.h"
2020
#include "swift/ABI/TypeIdentity.h"
2121
#include "swift/Basic/Lazy.h"
22+
#include "swift/Basic/Range.h"
2223
#include "swift/Demangling/Demangler.h"
2324
#include "swift/Demangling/TypeDecoder.h"
2425
#include "swift/RemoteInspection/Records.h"
@@ -1933,22 +1934,40 @@ class DecodedMetadataBuilder {
19331934

19341935
TypeLookupErrorOr<BuiltType>
19351936
createTupleType(llvm::ArrayRef<BuiltType> elements,
1936-
std::string labels) const {
1937+
llvm::ArrayRef<StringRef> labels) const {
19371938
for (auto element : elements) {
19381939
if (!element.isMetadata()) {
19391940
return TYPE_LOOKUP_ERROR_FMT("Tried to build a tuple type where "
19401941
"an element type is a pack");
19411942
}
19421943
}
19431944

1945+
std::string labelStr;
1946+
for (unsigned i : indices(labels)) {
1947+
auto label = labels[i];
1948+
if (label.empty()) {
1949+
if (!labelStr.empty())
1950+
labelStr += ' ';
1951+
continue;
1952+
}
1953+
1954+
// Add spaces to terminate all the previous labels if this
1955+
// is the first we've seen.
1956+
if (labelStr.empty()) labelStr.append(i, ' ');
1957+
1958+
// Add the label and its terminator.
1959+
labelStr += label;
1960+
labelStr += ' ';
1961+
}
1962+
19441963
auto flags = TupleTypeFlags().withNumElements(elements.size());
1945-
if (!labels.empty())
1964+
if (!labelStr.empty())
19461965
flags = flags.withNonConstantLabels(true);
19471966
return BuiltType(
19481967
swift_getTupleTypeMetadata(
19491968
MetadataState::Abstract, flags,
19501969
reinterpret_cast<const Metadata * const *>(elements.data()),
1951-
labels.empty() ? nullptr : labels.c_str(),
1970+
labelStr.empty() ? nullptr : labelStr.c_str(),
19521971
/*proposedWitnesses=*/nullptr));
19531972
}
19541973

unittests/Reflection/TypeRef.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,17 +99,17 @@ TEST(TypeRefTest, UniqueTupleTypeRef) {
9999
auto N2 = Builder.createNominalType(XYZ_decl, nullptr);
100100

101101
std::vector<const TypeRef *> Void;
102-
auto Void1 = Builder.createTupleType(Void, "");
103-
auto Void2 = Builder.createTupleType(Void, "");
102+
auto Void1 = Builder.createTupleType(Void, ArrayRef<StringRef>());
103+
auto Void2 = Builder.createTupleType(Void, ArrayRef<StringRef>());
104104

105105
EXPECT_EQ(Void1, Void2);
106106

107107
std::vector<const TypeRef *> Elements1 { N1, N2 };
108108
std::vector<const TypeRef *> Elements2 { N1, N2, N2 };
109109

110-
auto T1 = Builder.createTupleType(Elements1, "");
111-
auto T2 = Builder.createTupleType(Elements1, "");
112-
auto T3 = Builder.createTupleType(Elements2, "");
110+
auto T1 = Builder.createTupleType(Elements1, ArrayRef<StringRef>());
111+
auto T2 = Builder.createTupleType(Elements1, ArrayRef<StringRef>());
112+
auto T3 = Builder.createTupleType(Elements2, ArrayRef<StringRef>());
113113

114114
EXPECT_EQ(T1, T2);
115115
EXPECT_NE(T2, T3);
@@ -121,7 +121,7 @@ TEST(TypeRefTest, UniqueFunctionTypeRef) {
121121
TypeRefBuilder Builder(TypeRefBuilder::ForTesting);
122122

123123
std::vector<const TypeRef *> Void;
124-
auto VoidResult = Builder.createTupleType(Void, "");
124+
auto VoidResult = Builder.createTupleType(Void, ArrayRef<StringRef>());
125125
Param Param1 = Builder.createNominalType(ABC_decl, nullptr);
126126
Param Param2 = Builder.createNominalType(XYZ_decl, nullptr);
127127

@@ -130,7 +130,8 @@ TEST(TypeRefTest, UniqueFunctionTypeRef) {
130130
std::vector<Param> Parameters2{Param1, Param1};
131131

132132
auto Result =
133-
Builder.createTupleType({Param1.getType(), Param2.getType()}, "");
133+
Builder.createTupleType({Param1.getType(), Param2.getType()},
134+
ArrayRef<StringRef>());
134135

135136
auto F1 = Builder.createFunctionType(
136137
Parameters1, Result, FunctionTypeFlags(),
@@ -517,7 +518,8 @@ TEST(TypeRefTest, DeriveSubstitutions) {
517518
auto Nominal = Builder.createBoundGenericType(NominalName, NominalArgs,
518519
/*parent*/ nullptr);
519520

520-
auto Result = Builder.createTupleType({GTP00, GTP01}, "");
521+
auto Result = Builder.createTupleType({GTP00, GTP01},
522+
ArrayRef<StringRef>());
521523
auto Func = Builder.createFunctionType(
522524
{Nominal}, Result, FunctionTypeFlags(),
523525
FunctionMetadataDifferentiabilityKind::NonDifferentiable, nullptr);

0 commit comments

Comments
 (0)