Skip to content

Commit d5cb754

Browse files
authored
Merge pull request #35648 from ahoppen/rawsyntax-in-syntaxarena
[libSyntax] Require RawSyntax to always live inside a SyntaxArena
2 parents 9964b97 + 803499e commit d5cb754

File tree

7 files changed

+110
-126
lines changed

7 files changed

+110
-126
lines changed

include/swift/Syntax/RawSyntax.h

Lines changed: 19 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -262,15 +262,11 @@ class RawSyntax final
262262
int NewRefCount = RefCount.fetch_sub(1, std::memory_order_acq_rel) - 1;
263263
assert(NewRefCount >= 0 && "Reference count was already zero.");
264264
if (NewRefCount == 0) {
265-
if (Arena) {
266-
// The node was allocated inside a SyntaxArena and thus doesn't own its
267-
// own memory region. Hence we cannot free it. It will be deleted once
268-
// the last RawSyntax node allocated with it will release its reference
269-
// to the arena.
270-
this->~RawSyntax();
271-
} else {
272-
delete this;
273-
}
265+
// The node was allocated inside a SyntaxArena and thus doesn't own its
266+
// own memory region. Hence we cannot free it. It will be deleted once
267+
// the last RawSyntax node allocated with it will release its reference
268+
// to the arena.
269+
this->~RawSyntax();
274270
}
275271
}
276272

@@ -280,18 +276,13 @@ class RawSyntax final
280276
/// Make a raw "layout" syntax node.
281277
static RC<RawSyntax> make(SyntaxKind Kind, ArrayRef<RC<RawSyntax>> Layout,
282278
size_t TextLength, SourcePresence Presence,
283-
const RC<SyntaxArena> &Arena,
279+
const RC<SyntaxArena> &Arena = SyntaxArena::make(),
284280
llvm::Optional<SyntaxNodeId> NodeId = llvm::None);
285281

286-
static RC<RawSyntax> make(SyntaxKind Kind, ArrayRef<RC<RawSyntax>> Layout,
287-
size_t TextLength, SourcePresence Presence,
288-
llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
289-
return make(Kind, Layout, TextLength, Presence, /*Arena=*/nullptr, NodeId);
290-
}
291-
292282
static RC<RawSyntax>
293283
makeAndCalcLength(SyntaxKind Kind, ArrayRef<RC<RawSyntax>> Layout,
294-
SourcePresence Presence, const RC<SyntaxArena> &Arena,
284+
SourcePresence Presence,
285+
const RC<SyntaxArena> &Arena = SyntaxArena::make(),
295286
llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
296287
size_t TextLength = 0;
297288
for (auto Child : Layout) {
@@ -302,37 +293,20 @@ class RawSyntax final
302293
return make(Kind, Layout, TextLength, Presence, Arena, NodeId);
303294
}
304295

305-
static RC<RawSyntax>
306-
makeAndCalcLength(SyntaxKind Kind, ArrayRef<RC<RawSyntax>> Layout,
307-
SourcePresence Presence,
308-
llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
309-
return makeAndCalcLength(Kind, Layout, Presence, /*Arena=*/nullptr, NodeId);
310-
}
311-
312296
/// Make a raw "token" syntax node.
313297
static RC<RawSyntax> make(tok TokKind, OwnedString Text, size_t TextLength,
314298
ArrayRef<TriviaPiece> LeadingTrivia,
315299
ArrayRef<TriviaPiece> TrailingTrivia,
316300
SourcePresence Presence,
317-
const RC<SyntaxArena> &Arena,
301+
const RC<SyntaxArena> &Arena = SyntaxArena::make(),
318302
llvm::Optional<SyntaxNodeId> NodeId = llvm::None);
319303

320-
static RC<RawSyntax> make(tok TokKind, OwnedString Text, size_t TextLength,
321-
ArrayRef<TriviaPiece> LeadingTrivia,
322-
ArrayRef<TriviaPiece> TrailingTrivia,
323-
SourcePresence Presence,
324-
llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
325-
return make(TokKind, Text, TextLength, LeadingTrivia, TrailingTrivia,
326-
Presence, /*Arena=*/nullptr, NodeId);
327-
}
328-
329304
/// Make a raw "token" syntax node that was allocated in \p Arena.
330-
static RC<RawSyntax>
331-
makeAndCalcLength(tok TokKind, OwnedString Text,
332-
ArrayRef<TriviaPiece> LeadingTrivia,
333-
ArrayRef<TriviaPiece> TrailingTrivia,
334-
SourcePresence Presence, const RC<SyntaxArena> &Arena,
335-
llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
305+
static RC<RawSyntax> makeAndCalcLength(
306+
tok TokKind, OwnedString Text, ArrayRef<TriviaPiece> LeadingTrivia,
307+
ArrayRef<TriviaPiece> TrailingTrivia, SourcePresence Presence,
308+
const RC<SyntaxArena> &Arena = SyntaxArena::make(),
309+
llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
336310
size_t TextLength = 0;
337311
if (Presence != SourcePresence::Missing) {
338312
for (auto Trivia : LeadingTrivia) {
@@ -347,23 +321,16 @@ class RawSyntax final
347321
Presence, Arena, NodeId);
348322
}
349323

350-
static RC<RawSyntax> makeAndCalcLength(
351-
tok TokKind, OwnedString Text, ArrayRef<TriviaPiece> LeadingTrivia,
352-
ArrayRef<TriviaPiece> TrailingTrivia, SourcePresence Presence,
353-
llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
354-
return makeAndCalcLength(TokKind, Text, LeadingTrivia, TrailingTrivia,
355-
Presence, /*Arena=*/nullptr, NodeId);
356-
}
357-
358324
/// Make a missing raw "layout" syntax node.
359-
static RC<RawSyntax> missing(SyntaxKind Kind,
360-
RC<SyntaxArena> Arena = nullptr) {
325+
static RC<RawSyntax>
326+
missing(SyntaxKind Kind, const RC<SyntaxArena> &Arena = SyntaxArena::make()) {
361327
return make(Kind, {}, /*TextLength=*/0, SourcePresence::Missing, Arena);
362328
}
363329

364330
/// Make a missing raw "token" syntax node.
365-
static RC<RawSyntax> missing(tok TokKind, OwnedString Text,
366-
RC<SyntaxArena> Arena = nullptr) {
331+
static RC<RawSyntax>
332+
missing(tok TokKind, OwnedString Text,
333+
const RC<SyntaxArena> &Arena = SyntaxArena::make()) {
367334
return make(TokKind, Text, /*TextLength=*/0, {}, {},
368335
SourcePresence::Missing, Arena);
369336
}

include/swift/Syntax/Serialization/SyntaxDeserialization.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ template <> struct MappingTraits<swift::RC<swift::RawSyntax>> {
164164
unsigned nodeId = std::atoi(nodeIdString.data());
165165
value = swift::RawSyntax::makeAndCalcLength(
166166
tokenKind, swift::OwnedString::makeRefCounted(text), leadingTrivia,
167-
trailingTrivia, presence, /*Arena=*/nullptr, nodeId);
167+
trailingTrivia, presence, swift::SyntaxArena::make(), nodeId);
168168
} else {
169169
swift::SyntaxKind kind;
170170
in.mapRequired("kind", kind);
@@ -178,8 +178,8 @@ template <> struct MappingTraits<swift::RC<swift::RawSyntax>> {
178178
StringRef nodeIdString;
179179
in.mapRequired("id", nodeIdString);
180180
unsigned nodeId = std::atoi(nodeIdString.data());
181-
value = swift::RawSyntax::makeAndCalcLength(kind, layout, presence,
182-
/*Arena=*/nullptr, nodeId);
181+
value = swift::RawSyntax::makeAndCalcLength(
182+
kind, layout, presence, swift::SyntaxArena::make(), nodeId);
183183
}
184184
}
185185
};

include/swift/Syntax/SyntaxArena.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#ifndef SWIFT_SYNTAX_SYNTAXARENA_H
1818
#define SWIFT_SYNTAX_SYNTAXARENA_H
1919

20+
#include "swift/Syntax/References.h"
2021
#include "llvm/ADT/IntrusiveRefCntPtr.h"
2122
#include "llvm/Support/Allocator.h"
2223

@@ -33,6 +34,8 @@ class SyntaxArena : public llvm::ThreadSafeRefCountedBase<SyntaxArena> {
3334
public:
3435
SyntaxArena() {}
3536

37+
static RC<SyntaxArena> make() { return RC<SyntaxArena>(new SyntaxArena()); }
38+
3639
llvm::BumpPtrAllocator &getAllocator() { return Allocator; }
3740
void *Allocate(size_t size, size_t alignment) {
3841
return Allocator.Allocate(size, alignment);

include/swift/Syntax/SyntaxBuilders.h.gyb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ class SyntaxArena;
3333
% if node.is_buildable():
3434
% child_count = len(node.children)
3535
class ${node.name}Builder {
36-
RC<SyntaxArena> Arena = nullptr;
36+
RC<SyntaxArena> Arena;
3737
RC<RawSyntax> Layout[${child_count}] = {
3838
% for child in node.children:
3939
nullptr,
4040
% end
4141
};
4242

4343
public:
44-
${node.name}Builder() = default;
45-
${node.name}Builder(const RC<SyntaxArena> &Arena) : Arena(Arena) {}
44+
${node.name}Builder(const RC<SyntaxArena> &Arena = SyntaxArena::make())
45+
: Arena(Arena) {}
4646

4747
% for child in node.children:
4848
${node.name}Builder &use${child.name}(${child.type_name} ${child.name});

include/swift/Syntax/SyntaxFactory.h.gyb

Lines changed: 52 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,25 @@ class SyntaxArena;
4646
struct SyntaxFactory {
4747
/// Make any kind of token.
4848
static TokenSyntax makeToken(tok Kind,
49-
OwnedString Text, const Trivia &LeadingTrivia,
50-
const Trivia &TrailingTrivia,
51-
SourcePresence Presence,
52-
RC<SyntaxArena> Arena = nullptr);
49+
OwnedString Text, const Trivia &LeadingTrivia,
50+
const Trivia &TrailingTrivia, SourcePresence Presence,
51+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
52+
);
5353

5454
/// Collect a list of tokens into a piece of "unknown" syntax.
5555
static UnknownSyntax makeUnknownSyntax(llvm::ArrayRef<TokenSyntax> Tokens,
56-
RC<SyntaxArena> Arena = nullptr);
56+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
57+
);
5758

5859
static Optional<Syntax> createSyntax(SyntaxKind Kind,
59-
llvm::ArrayRef<Syntax> Elements,
60-
RC<SyntaxArena> Arena = nullptr);
60+
llvm::ArrayRef<Syntax> Elements,
61+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
62+
);
6163

6264
static RC<RawSyntax> createRaw(SyntaxKind Kind,
63-
llvm::ArrayRef<RC<RawSyntax>> Elements,
64-
RC<SyntaxArena> Arena = nullptr);
65+
llvm::ArrayRef<RC<RawSyntax>> Elements,
66+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
67+
);
6568

6669
/// Count the number of children for a given syntax node kind,
6770
/// returning a pair of mininum and maximum count of children. The gap
@@ -83,90 +86,101 @@ struct SyntaxFactory {
8386
% end
8487
% child_params = ', '.join(child_params)
8588
static ${node.name} make${node.syntax_kind}(${child_params},
86-
RC<SyntaxArena> Arena = nullptr);
89+
const RC<SyntaxArena> &Arena = SyntaxArena::make());
8790
% elif node.is_syntax_collection():
8891
static ${node.name} make${node.syntax_kind}(
8992
const std::vector<${node.collection_element_type}> &elts,
90-
RC<SyntaxArena> Arena = nullptr);
93+
const RC<SyntaxArena> &Arena = SyntaxArena::make());
9194
% end
9295

93-
static ${node.name} makeBlank${node.syntax_kind}(RC<SyntaxArena> Arena = nullptr);
96+
static ${node.name} makeBlank${node.syntax_kind}(
97+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
98+
);
9499
% end
95100

96101
% for token in SYNTAX_TOKENS:
97102
% if token.is_keyword:
98103
static TokenSyntax make${token.name}Keyword(const Trivia &LeadingTrivia,
99-
const Trivia &TrailingTrivia,
100-
RC<SyntaxArena> Arena = nullptr);
104+
const Trivia &TrailingTrivia,
105+
const RC<SyntaxArena> &Arena = SyntaxArena::make());
101106
% elif token.text:
102107
static TokenSyntax make${token.name}Token(const Trivia &LeadingTrivia,
103-
const Trivia &TrailingTrivia,
104-
RC<SyntaxArena> Arena = nullptr);
108+
const Trivia &TrailingTrivia,
109+
const RC<SyntaxArena> &Arena = SyntaxArena::make());
105110
% else:
106111
static TokenSyntax make${token.name}(OwnedString Text,
107-
const Trivia &LeadingTrivia,
108-
const Trivia &TrailingTrivia,
109-
RC<SyntaxArena> Arena = nullptr);
112+
const Trivia &LeadingTrivia, const Trivia &TrailingTrivia,
113+
const RC<SyntaxArena> &Arena = SyntaxArena::make());
110114
% end
111115
% end
112116

113117
#pragma mark - Convenience APIs
114118

115-
static TupleTypeSyntax makeVoidTupleType(RC<SyntaxArena> Arena = nullptr);
119+
static TupleTypeSyntax makeVoidTupleType(
120+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
121+
);
116122

117123
/// Creates an labelled TupleTypeElementSyntax with the provided label,
118124
/// colon, type and optional trailing comma.
119125
static TupleTypeElementSyntax makeTupleTypeElement(
120126
llvm::Optional<TokenSyntax> Label,
121127
llvm::Optional<TokenSyntax> Colon, TypeSyntax Type,
122128
llvm::Optional<TokenSyntax> TrailingComma = llvm::None,
123-
RC<SyntaxArena> Arena = nullptr);
129+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
130+
);
124131

125132
/// Creates an unlabelled TupleTypeElementSyntax with the provided type and
126133
/// optional trailing comma.
127134
static TupleTypeElementSyntax
128135
makeTupleTypeElement(TypeSyntax Type,
129-
llvm::Optional<TokenSyntax> TrailingComma = llvm::None,
130-
RC<SyntaxArena> Arena = nullptr);
136+
llvm::Optional<TokenSyntax> TrailingComma = llvm::None,
137+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
138+
);
131139

132140
/// Creates a TypeIdentifierSyntax with the provided name and leading/trailing
133141
/// trivia.
134142
static TypeSyntax makeTypeIdentifier(OwnedString TypeName,
135-
const Trivia &LeadingTrivia = {},
136-
const Trivia &TrailingTrivia = {},
137-
RC<SyntaxArena> Arena = nullptr);
143+
const Trivia &LeadingTrivia = {}, const Trivia &TrailingTrivia = {},
144+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
145+
);
138146

139147
/// Creates a GenericParameterSyntax with no inheritance clause and an
140148
/// optional trailing comma.
141149
static GenericParameterSyntax
142150
makeGenericParameter(TokenSyntax Name,
143-
llvm::Optional<TokenSyntax> TrailingComma,
144-
RC<SyntaxArena> Arena = nullptr);
151+
llvm::Optional<TokenSyntax> TrailingComma,
152+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
153+
);
145154

146155
/// Creates a TypeIdentifierSyntax for the `Any` type.
147156
static TypeSyntax makeAnyTypeIdentifier(const Trivia &LeadingTrivia = {},
148-
const Trivia &TrailingTrivia = {},
149-
RC<SyntaxArena> Arena = nullptr);
157+
const Trivia &TrailingTrivia = {},
158+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
159+
);
150160

151161
/// Creates a TypeIdentifierSyntax for the `Self` type.
152162
static TypeSyntax makeSelfTypeIdentifier(const Trivia &LeadingTrivia = {},
153-
const Trivia &TrailingTrivia = {},
154-
RC<SyntaxArena> Arena = nullptr);
163+
const Trivia &TrailingTrivia = {},
164+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
165+
);
155166

156167
/// Creates a TokenSyntax for the `Type` identifier.
157168
static TokenSyntax makeTypeToken(const Trivia &LeadingTrivia = {},
158-
const Trivia &TrailingTrivia = {},
159-
RC<SyntaxArena> Arena = nullptr);
169+
const Trivia &TrailingTrivia = {},
170+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
171+
);
160172

161173
/// Creates a TokenSyntax for the `Protocol` identifier.
162174
static TokenSyntax makeProtocolToken(const Trivia &LeadingTrivia = {},
163-
const Trivia &TrailingTrivia = {},
164-
RC<SyntaxArena> Arena = nullptr);
175+
const Trivia &TrailingTrivia = {},
176+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
177+
);
165178

166179
/// Creates an `==` operator token.
167180
static TokenSyntax makeEqualityOperator(const Trivia &LeadingTrivia = {},
168-
const Trivia &TrailingTrivia = {},
169-
RC<SyntaxArena> Arena = nullptr);
181+
const Trivia &TrailingTrivia = {},
182+
const RC<SyntaxArena> &Arena = SyntaxArena::make()
183+
);
170184

171185
/// Whether a raw node kind `MemberKind` can serve as a member in a syntax
172186
/// collection of the given syntax collection kind.

0 commit comments

Comments
 (0)