Skip to content

Commit 53c0eda

Browse files
perf(serde): avoid some allocations when deserializing
1 parent 97c261d commit 53c0eda

File tree

1 file changed

+5
-14
lines changed
  • keyvalues-serde/src/tokens

1 file changed

+5
-14
lines changed

keyvalues-serde/src/tokens/mod.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,22 @@ pub(crate) fn tokens_from_vdf(vdf: Vdf<'_>) -> Vec<Token<'_>> {
1515
let Vdf { key, value } = vdf;
1616

1717
let mut tokens = vec![Token::Key(key)];
18-
tokens.extend(tokens_from_value(value));
18+
push_tokens_from_value(&mut tokens, value);
1919
tokens
2020
}
2121

22-
// TODO: pass through a `&mut Vec<_>` instead of allocating new ones
23-
fn tokens_from_value(value: Value<'_>) -> Vec<Token<'_>> {
24-
let mut tokens = Vec::new();
25-
22+
fn push_tokens_from_value<'text>(tokens: &mut Vec<Token<'text>>, value: Value<'text>) {
2623
match value {
2724
Value::Str(s) => tokens.push(Token::Str(s)),
2825
Value::Obj(obj) => {
2926
tokens.push(Token::ObjBegin);
30-
tokens.extend(tokens_from_obj(obj));
27+
push_tokens_from_obj(tokens, obj);
3128
tokens.push(Token::ObjEnd);
3229
}
3330
}
34-
35-
tokens
3631
}
3732

38-
fn tokens_from_obj(obj: Obj<'_>) -> Vec<Token<'_>> {
39-
let mut tokens = Vec::new();
40-
33+
fn push_tokens_from_obj<'text>(tokens: &mut Vec<Token<'text>>, obj: Obj<'text>) {
4134
for (key, values) in obj.into_inner().into_iter() {
4235
tokens.push(Token::Key(key));
4336

@@ -48,15 +41,13 @@ fn tokens_from_obj(obj: Obj<'_>) -> Vec<Token<'_>> {
4841
}
4942

5043
for value in values {
51-
tokens.extend(tokens_from_value(value));
44+
push_tokens_from_value(tokens, value);
5245
}
5346

5447
if num_values != 1 {
5548
tokens.push(Token::SeqEnd);
5649
}
5750
}
58-
59-
tokens
6051
}
6152

6253
/// A single VDF token

0 commit comments

Comments
 (0)