Skip to content

Commit b513fa0

Browse files
Chore: Optimize memory for ssa name alocation.
1 parent 5dfa73e commit b513fa0

1 file changed

Lines changed: 19 additions & 8 deletions

File tree

  • compiler/src/modules/parser

compiler/src/modules/parser/mod.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,22 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
4242
self.ssa_versions.get(name).copied().unwrap_or(0)
4343
}
4444

45-
pub(super) fn ssa_name(name: &str, ver: u32) -> String {
46-
let mut s = String::with_capacity(name.len() + 4);
47-
s.push_str(name);
48-
s.push('_'); // separator between base name and version number: "x" -> "x_3"
45+
pub(super) fn ssa_name<'a>(name: &str, ver: u32, buf: &'a mut [u8; 128]) -> &'a str {
46+
struct W<'a> { b: &'a mut [u8; 128], n: usize }
47+
impl core::fmt::Write for W<'_> {
48+
fn write_str(&mut self, s: &str) -> core::fmt::Result {
49+
let end = self.n + s.len();
50+
if end <= self.b.len() {
51+
self.b[self.n..end].copy_from_slice(s.as_bytes());
52+
self.n = end;
53+
}
54+
Ok(())
55+
}
56+
}
57+
let mut w = W { b: buf, n: 0 };
4958
use core::fmt::Write;
50-
let _ = write!(s, "{}", ver);
51-
s
59+
let _ = write!(w, "{}_{}", name, ver);
60+
core::str::from_utf8(&w.b[..w.n]).unwrap() // lifetime tied to buf, zero heap allocation
5261
}
5362

5463
pub(super) fn increment_version(&mut self, name: &str) -> u32 {
@@ -60,7 +69,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
6069

6170
pub(super) fn emit_load_ssa(&mut self, name: String) {
6271
let v = self.current_version(&name);
63-
let i = self.chunk.push_name(&Self::ssa_name(&name, v));
72+
let mut buf = [0u8; 128];
73+
let i = self.chunk.push_name(Self::ssa_name(&name, v, &mut buf));
6474
self.chunk.emit(OpCode::LoadName, i);
6575
}
6676

@@ -71,7 +81,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
7181

7282
pub(super) fn store_name(&mut self, name: String) {
7383
let ver = self.increment_version(&name);
74-
let i = self.chunk.push_name(&Self::ssa_name(&name, ver));
84+
let mut buf = [0u8; 128];
85+
let i = self.chunk.push_name(Self::ssa_name(&name, ver, &mut buf));
7586
self.chunk.emit(OpCode::StoreName, i);
7687
}
7788
}

0 commit comments

Comments
 (0)