Skip to content

Commit 3fa3e6c

Browse files
committed
[libSyntax] Make copyToArenaIfNecessary a method on SyntaxArena
1 parent 95acf4d commit 3fa3e6c

File tree

3 files changed

+26
-27
lines changed

3 files changed

+26
-27
lines changed

include/swift/Syntax/RawSyntax.h

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -120,27 +120,6 @@ using llvm::StringRef;
120120
#define syntax_assert_token_is(Tok, Kind, Text)
121121
#endif
122122

123-
namespace {
124-
/// If the \p Str is not allocated in \p Arena, copy it to \p Arena and adjust
125-
/// \p Str to point to the string's copy in \p Arena.
126-
void copyToArenaIfNecessary(
127-
StringRef &Str, const swift::RC<swift::syntax::SyntaxArena> &Arena) {
128-
if (Str.empty()) {
129-
// Empty strings can live wherever they want. Nothing to do.
130-
return;
131-
}
132-
if (Arena->containsPointer(Str.data())) {
133-
// String already in arena. Nothing to do.
134-
return;
135-
}
136-
// Copy string to arena
137-
char *Data = (char *)Arena->Allocate(Str.size(), alignof(char *));
138-
std::uninitialized_copy(Str.begin(), Str.end(), Data);
139-
Str = StringRef(Data, Str.size());
140-
}
141-
} // namespace
142-
// end anonymous namespace
143-
144123
namespace swift {
145124
namespace syntax {
146125

@@ -289,9 +268,6 @@ class RawSyntax final
289268
: Arena(Arena.get()),
290269
Bits({{unsigned(TextLength), unsigned(Presence), true}}) {
291270
assert(Arena && "RawSyntax nodes must always be allocated in an arena");
292-
copyToArenaIfNecessary(LeadingTrivia, Arena);
293-
copyToArenaIfNecessary(Text, Arena);
294-
copyToArenaIfNecessary(TrailingTrivia, Arena);
295271

296272
if (Presence == SourcePresence::Missing) {
297273
assert(TextLength == 0);
@@ -313,6 +289,13 @@ class RawSyntax final
313289
Bits.Token.TokenLength = Text.size();
314290
Bits.Token.TrailingTriviaLength = TrailingTrivia.size();
315291
Bits.Token.TokenKind = unsigned(TokKind);
292+
293+
Arena->copyStringToArenaIfNecessary(Bits.Token.LeadingTrivia,
294+
Bits.Token.LeadingTriviaLength);
295+
Arena->copyStringToArenaIfNecessary(Bits.Token.TokenText,
296+
Bits.Token.TokenLength);
297+
Arena->copyStringToArenaIfNecessary(Bits.Token.TrailingTrivia,
298+
Bits.Token.TrailingTriviaLength);
316299
}
317300

318301
/// Compute the node's text length by summing up the length of its childern

include/swift/Syntax/SyntaxArena.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,23 @@ class SyntaxArena : public llvm::ThreadSafeRefCountedBase<SyntaxArena> {
108108
}
109109
return getAllocator().identifyObject(Ptr) != llvm::None;
110110
}
111+
112+
/// If the \p Data is not allocated in this arena, copy it to this and adjust
113+
/// \p Data to point to the string's copy in this arena.
114+
void copyStringToArenaIfNecessary(const char *&Data, size_t Length) {
115+
if (Length == 0) {
116+
// Empty strings can live wherever they want. Nothing to do.
117+
return;
118+
}
119+
if (containsPointer(Data)) {
120+
// String already in arena. Nothing to do.
121+
return;
122+
}
123+
// Copy string to arena
124+
char *ArenaData = (char *)getAllocator().Allocate<char>(Length);
125+
std::memcpy(ArenaData, Data, Length);
126+
Data = ArenaData;
127+
}
111128
};
112129

113130
} // namespace syntax

lib/SyntaxParse/SyntaxTreeCreator.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,9 @@ SyntaxTreeCreator::SyntaxTreeCreator(SourceManager &SM, unsigned bufferID,
3535
SyntaxCache(syntaxCache),
3636
TokenCache(new RawSyntaxTokenCache()) {
3737
StringRef BufferContent = SM.getEntireTextForBuffer(BufferID);
38-
char *Data = (char *)Arena->Allocate(BufferContent.size(), alignof(char *));
39-
std::uninitialized_copy(BufferContent.begin(), BufferContent.end(), Data);
38+
const char *Data = BufferContent.data();
39+
Arena->copyStringToArenaIfNecessary(Data, BufferContent.size());
4040
ArenaSourceBuffer = StringRef(Data, BufferContent.size());
41-
assert(ArenaSourceBuffer == BufferContent);
4241
Arena->setHotUseMemoryRegion(ArenaSourceBuffer.begin(),
4342
ArenaSourceBuffer.end());
4443
}

0 commit comments

Comments
 (0)