Skip to content

Commit 0d2abe4

Browse files
committed
Use SmallVec for the inner vectors in MatcherPos::matches.
This avoids some allocations.
1 parent c60ed5d commit 0d2abe4

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/libsyntax/ext/tt/macro_parser.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ struct MatcherTtFrame<'a> {
143143
idx: usize,
144144
}
145145

146+
type NamedMatchVec = SmallVec<[NamedMatch; 4]>;
147+
146148
/// Represents a single "position" (aka "matcher position", aka "item"), as described in the module
147149
/// documentation.
148150
#[derive(Clone)]
@@ -168,7 +170,7 @@ struct MatcherPos<'a> {
168170
/// all bound matches from the submatcher into the shared top-level `matches` vector. If `sep`
169171
/// and `up` are `Some`, then `matches` is _not_ the shared top-level list. Instead, if one
170172
/// wants the shared `matches`, one should use `up.matches`.
171-
matches: Box<[Rc<Vec<NamedMatch>>]>,
173+
matches: Box<[Rc<NamedMatchVec>]>,
172174
/// The position in `matches` corresponding to the first metavar in this matcher's sequence of
173175
/// token trees. In other words, the first metavar in the first token of `top_elts` corresponds
174176
/// to `matches[match_lo]`.
@@ -279,11 +281,11 @@ pub fn count_names(ms: &[TokenTree]) -> usize {
279281
}
280282

281283
/// `len` `Vec`s (initially shared and empty) that will store matches of metavars.
282-
fn create_matches(len: usize) -> Box<[Rc<Vec<NamedMatch>>]> {
284+
fn create_matches(len: usize) -> Box<[Rc<NamedMatchVec>]> {
283285
if len == 0 {
284286
vec![]
285287
} else {
286-
let empty_matches = Rc::new(Vec::new());
288+
let empty_matches = Rc::new(SmallVec::new());
287289
vec![empty_matches.clone(); len]
288290
}.into_boxed_slice()
289291
}
@@ -337,7 +339,7 @@ fn initial_matcher_pos(ms: &[TokenTree], open: Span) -> MatcherPos {
337339
/// token tree it was derived from.
338340
#[derive(Debug, Clone)]
339341
pub enum NamedMatch {
340-
MatchedSeq(Rc<Vec<NamedMatch>>, DelimSpan),
342+
MatchedSeq(Rc<NamedMatchVec>, DelimSpan),
341343
MatchedNonterminal(Rc<Nonterminal>),
342344
}
343345

@@ -545,7 +547,7 @@ fn inner_parse_loop<'a>(
545547
new_item.match_cur += seq.num_captures;
546548
new_item.idx += 1;
547549
for idx in item.match_cur..item.match_cur + seq.num_captures {
548-
new_item.push_match(idx, MatchedSeq(Rc::new(vec![]), sp));
550+
new_item.push_match(idx, MatchedSeq(Rc::new(smallvec![]), sp));
549551
}
550552
cur_items.push(new_item);
551553
}

0 commit comments

Comments
 (0)