Skip to content

Commit db869e5

Browse files
committed
chore(interpreter): refactor field writting into two helpers
1 parent ed28e05 commit db869e5

2 files changed

Lines changed: 42 additions & 24 deletions

File tree

interpreter/src/vm/symbols.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -339,23 +339,25 @@ impl Record {
339339
mode: ExecMode,
340340
) -> Result<(), RegexError> {
341341
if n == 0 {
342-
self.fields = None;
343-
match val {
344-
Value::String(Cow::Owned(s)) => {
345-
self.raw = s;
346-
}
347-
Value::String(Cow::Borrowed(s)) => {
348-
self.raw.clear();
349-
self.raw.extend_from_slice(s);
350-
}
351-
val => {
352-
self.raw.clear();
353-
let _ = write!(self.raw, "{val}");
354-
}
355-
}
356-
return Ok(());
342+
self.write_record_raw(val);
343+
Ok(())
344+
} else {
345+
self.write_field_raw(val, n, symbols, mode)
357346
}
347+
}
358348

349+
fn write_record_raw(&mut self, val: Value<'_>) {
350+
self.fields = None;
351+
val.move_string_into(&mut self.raw);
352+
}
353+
354+
fn write_field_raw(
355+
&mut self,
356+
val: Value<'_>,
357+
n: usize,
358+
symbols: &mut SymbolTable<'_>,
359+
mode: ExecMode,
360+
) -> Result<(), RegexError> {
359361
let mut fields = take(self.split_fields_raw(symbols, mode)?);
360362
if n >= fields.len() {
361363
fields.resize(n + 1, Span::from(self.raw.len()..self.raw.len()));
@@ -366,12 +368,10 @@ impl Record {
366368

367369
let mut ofs = SmallVec::<[u8; 16]>::new();
368370
let _ = write!(ofs, "{}", symbols.ofs);
369-
let mut first = true;
370371
for (i, span) in fields.iter_mut().enumerate().skip(1) {
371-
if !first {
372+
if i > 1 {
372373
buf.extend_from_slice(&ofs);
373374
}
374-
first = false;
375375

376376
let start = buf.len();
377377
if i == n {

interpreter/src/vm/types.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,18 +149,36 @@ impl<'a> Value<'a> {
149149
})
150150
}
151151

152-
pub fn write_string(&self, f: &mut Vec<u8>) {
152+
pub fn write_string(&self, out: &mut Vec<u8>) {
153153
match self {
154-
Self::String(s) | Self::Regex(s) => f.extend_from_slice(s),
155-
Self::Float(n) => write!(f, "{n}").unwrap(),
156-
Self::Int(n) => write!(f, "{n}").unwrap(),
157-
&Self::Bool(false) => f.push(b'0'),
158-
&Self::Bool(true) => f.push(b'1'),
154+
Self::String(s) | Self::Regex(s) => out.extend_from_slice(s),
155+
Self::Float(n) => write!(out, "{n}").unwrap(),
156+
Self::Int(n) => write!(out, "{n}").unwrap(),
157+
&Self::Bool(false) => out.push(b'0'),
158+
&Self::Bool(true) => out.push(b'1'),
159159
Self::Array(_) => panic!("Attempted to use array in scalar context!"),
160160
_ => {}
161161
}
162162
}
163163

164+
/// Efficiently replaces the contents of `out` with the string form of the
165+
/// value. Always reuses either buffer.
166+
pub fn move_string_into(self, out: &mut Vec<u8>) {
167+
match self {
168+
Value::String(Cow::Owned(s)) => {
169+
*out = s;
170+
}
171+
Value::String(Cow::Borrowed(s)) => {
172+
out.clear();
173+
out.extend_from_slice(s);
174+
}
175+
_ => {
176+
out.clear();
177+
self.write_string(out);
178+
}
179+
}
180+
}
181+
164182
pub fn string_size_hint(&self) -> usize {
165183
match self {
166184
Self::String(s) | Self::Regex(s) => s.len(),

0 commit comments

Comments
 (0)