@@ -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 ) ]
339341pub 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