History

avoid another vec allocation by inlining code via closure.

Sebastian Thiel committed 4 years ago

Commit d88952a1 parent 5a55dbf1 file · +18 −14Browse files

Unified · Split

git-pathspec/src/parse.rs+18−14
@@ -94,9 +94,10 @@ fn parse_long_keywords(input: &[u8], p: &mut Pattern, cursor: &mut usize) -> Res · 93 unmodified lines
9494 return Ok(());
9595 }
9696
97− for keyword in split_on_non_escaped_char(input, b',') {
97+ split_on_non_escaped_char(input, b',', |keyword| {
98+ let attr_prefix = b"attr:";
9899 match keyword {
99− b"attr" => continue,
100+ b"attr" => {}
100101 b"top" => p.signature |= MagicSignature::TOP,
101102 b"icase" => p.signature |= MagicSignature::ICASE,
102103 b"exclude" => p.signature |= MagicSignature::EXCLUDE,
@@ -108,9 +109,9 @@ fn parse_long_keywords(input: &[u8], p: &mut Pattern, cursor: &mut usize) -> Res · 5 unmodified lines
108109 MatchMode::Literal => return Err(Error::IncompatibleSearchModes),
109110 _ => p.search_mode = MatchMode::PathAwareGlob,
110111 },
111− _ if keyword.starts_with(b"attr:") => {
112+ _ if keyword.starts_with(attr_prefix) => {
112113 if p.attributes.is_empty() {
113− p.attributes = parse_attributes(&keyword[5..])?;
114+ p.attributes = parse_attributes(&keyword[attr_prefix.len()..])?;
114115 } else {
115116 return Err(Error::MultipleAttributeSpecifications);
116117 }
@@ -120,25 +121,28 @@ fn parse_long_keywords(input: &[u8], p: &mut Pattern, cursor: &mut usize) -> Res · 3 unmodified lines
120121 keyword: BString::from(keyword),
121122 });
122123 }
123− }
124− }
125−
126− Ok(())
124+ };
125+ Ok(())
126+ })
127127 }
128128
129−fn split_on_non_escaped_char(input: &[u8], split_char: u8) -> Vec<&[u8]> {
130− let mut keywords = Vec::new();
129+fn split_on_non_escaped_char(
130+ input: &[u8],
131+ split_char: u8,
132+ mut f: impl FnMut(&[u8]) -> Result<(), Error>,
133+) -> Result<(), Error> {
131134 let mut i = 0;
132135 let mut last = 0;
133136 for window in input.windows(2) {
134137 i += 1;
135138 if window[0] != b'\\' && window[1] == split_char {
136− keywords.push(&input[last..i]);
139+ let keyword = &input[last..i];
140+ f(keyword)?;
137141 last = i + 1;
138142 }
139143 }
140− keywords.push(&input[last..]);
141− keywords
144+ let last_keyword = &input[last..];
145+ f(last_keyword)
142146 }
143147
144148 fn parse_attributes(input: &[u8]) -> Result<Vec<git_attributes::Assignment>, Error> {
@@ -175,7 +179,7 @@ fn unescape_attribute_values(input: &BStr) -> Result<Cow<'_, BStr>, Error> { · 30 unmodified lines
175179 match out {
176180 Cow::Borrowed(_) => {
177181 let end = out.len() + attr.len() + 1;
178− out = Cow::Borrowed(&input[0..end.min(input.len())])
182+ out = Cow::Borrowed(&input[0..end.min(input.len())]);
179183 }
180184 Cow::Owned(_) => {
181185 let out = out.to_mut();