Skip to content

Commit 3f83d98

Browse files
authored
Merge pull request #603 from rintaro/rawsyntax-initperf
Performance tweak for RawXXXSyntax initializers
2 parents f753b75 + 82bf378 commit 3f83d98

File tree

3 files changed

+620
-305
lines changed

3 files changed

+620
-305
lines changed

Sources/SwiftSyntax/RawSyntaxNodeProtocol.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public struct RawTokenSyntax: RawSyntaxNodeProtocol {
112112
kind: RawTokenKind,
113113
wholeText: SyntaxText,
114114
textRange: Range<SyntaxText.Index>,
115-
arena: SyntaxArena
115+
arena: __shared SyntaxArena
116116
) {
117117
assert(arena.contains(text: wholeText),
118118
"token text must be managed by the arena")
@@ -128,7 +128,7 @@ public struct RawTokenSyntax: RawSyntaxNodeProtocol {
128128
text: SyntaxText,
129129
leadingTriviaPieces: [RawTriviaPiece],
130130
trailingTriviaPieces: [RawTriviaPiece],
131-
arena: SyntaxArena
131+
arena: __shared SyntaxArena
132132
) {
133133
assert(arena.contains(text: text), "token text must be managed by the arena")
134134
let totalTriviaCount = leadingTriviaPieces.count + trailingTriviaPieces.count
@@ -153,7 +153,7 @@ public struct RawTokenSyntax: RawSyntaxNodeProtocol {
153153
}
154154

155155
/// Creates a missing `TokenSyntax` with the specified kind.
156-
public init(missing kind: RawTokenKind, arena: SyntaxArena) {
156+
public init(missing kind: RawTokenKind, arena: __shared SyntaxArena) {
157157
self.init(
158158
kind: kind, text: "", leadingTriviaPieces: [], trailingTriviaPieces: [],
159159
arena: arena)

Sources/SwiftSyntax/RawSyntaxNodes.swift.gyb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,15 @@ public struct Raw${node.name}: Raw${node.name if node.is_base() else node.base_t
5959
% end
6060
%
6161
% if node.is_syntax_collection():
62-
public init<C: Collection>(elements: C, arena: SyntaxArena) where C.Element == Raw${node.collection_element_type} {
63-
let raw = RawSyntax.makeLayout(kind: .${node.swift_syntax_kind}, from: elements.map { $0.raw }, arena: arena)
62+
public init(elements: [Raw${node.collection_element_type}], arena: __shared SyntaxArena) {
63+
let raw = RawSyntax.makeLayout(
64+
kind: .${node.swift_syntax_kind}, uninitializedCount: elements.count, arena: arena) { layout in
65+
guard var ptr = layout.baseAddress else { return }
66+
for elem in elements {
67+
ptr.initialize(to: elem.raw)
68+
ptr += 1
69+
}
70+
}
6471
self.init(raw: raw)
6572
}
6673

@@ -78,7 +85,7 @@ public struct Raw${node.name}: Raw${node.name if node.is_base() else node.base_t
7885
% param_default = " = nil" if child.is_unexpected_nodes() else ""
7986
${param_label}${child.swift_name}: ${param_type}${param_default},
8087
% end
81-
arena: SyntaxArena
88+
arena: __shared SyntaxArena
8289
) {
8390
% if node.children:
8491
let raw = RawSyntax.makeLayout(

0 commit comments

Comments
 (0)