Skip to content

Commit 9f524c8

Browse files
Fix: Stack-buffer to eliminate per-identifier heap allocation.
1 parent b513fa0 commit 9f524c8

4 files changed

Lines changed: 18 additions & 9 deletions

File tree

compiler/src/modules/parser/expr.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
227227
self.advance();
228228
self.expr();
229229
let ver = self.increment_version(&name);
230-
let i = self.chunk.push_name(&Self::ssa_name(&name, ver));
230+
let mut buf = [0u8; 128];
231+
let i = self.chunk.push_name(Self::ssa_name(&name, ver, &mut buf));
231232
self.chunk.emit(OpCode::StoreName, i);
232233
self.chunk.emit(OpCode::LoadName, i);
233234
}

compiler/src/modules/parser/literals.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
120120

121121
if vars.len() == 1 {
122122
let ver = self.increment_version(&vars[0]);
123-
let idx = self.chunk.push_name(&Self::ssa_name(&vars[0], ver));
123+
let mut buf = [0u8; 128];
124+
let idx = self.chunk.push_name(Self::ssa_name(&vars[0], ver, &mut buf));
124125
self.chunk.emit(OpCode::StoreName, idx);
125126
} else {
126127
self.chunk.emit(OpCode::UnpackSequence, vars.len() as u16);
@@ -236,7 +237,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
236237
}
237238

238239
let v = self.current_version(&name);
239-
let i = self.chunk.push_name(&Self::ssa_name(&name, v));
240+
let mut buf = [0u8; 128];
241+
let i = self.chunk.push_name(Self::ssa_name(&name, v, &mut buf));
240242
self.chunk.emit(OpCode::LoadName, i);
241243
let a = self.parse_args();
242244
self.chunk.emit(OpCode::Call, a);
@@ -328,7 +330,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
328330
self.chunk.emit(OpCode::MakeClass, ci);
329331

330332
let ver = self.increment_version(&cname);
331-
let i = self.chunk.push_name(&Self::ssa_name(&cname, ver));
333+
let mut buf = [0u8; 128];
334+
let i = self.chunk.push_name(Self::ssa_name(&cname, ver, &mut buf));
332335
self.chunk.emit(OpCode::StoreName, i);
333336
}
334337

@@ -357,7 +360,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
357360
}
358361

359362
let ver = self.increment_version(&fname);
360-
let i = self.chunk.push_name(&Self::ssa_name(&fname, ver));
363+
let mut buf = [0u8; 128];
364+
let i = self.chunk.push_name(Self::ssa_name(&fname, ver, &mut buf));
361365
self.chunk.emit(OpCode::StoreName, i);
362366
}
363367

compiler/src/modules/parser/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,13 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
131131
for name in divergent {
132132
let va = *a.get(name).unwrap_or(&0);
133133
let vb = *b.get(name).unwrap_or(&0);
134-
let ia = self.chunk.push_name(&Self::ssa_name(name, va));
135-
let ib = self.chunk.push_name(&Self::ssa_name(name, vb));
134+
let mut ba = [0u8; 128];
135+
let mut bb = [0u8; 128];
136+
let mut bx = [0u8; 128];
137+
let ia = self.chunk.push_name(Self::ssa_name(name, va, &mut ba));
138+
let ib = self.chunk.push_name(Self::ssa_name(name, vb, &mut bb));
136139
let v = self.increment_version(name);
137-
let ix = self.chunk.push_name(&Self::ssa_name(name, v));
140+
let ix = self.chunk.push_name(Self::ssa_name(name, v, &mut bx));
138141
self.chunk.phi_sources.push((ia, ib));
139142
self.chunk.emit(OpCode::Phi, ix);
140143
}

compiler/src/modules/parser/stmt.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,9 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
136136
self.advance();
137137
let t = self.advance();
138138
let name = self.lexeme(&t).to_string();
139+
let mut buf = [0u8; 128];
139140
let idx = self.chunk.push_name(
140-
&Self::ssa_name(&name, self.current_version(&name))
141+
Self::ssa_name(&name, self.current_version(&name), &mut buf)
141142
);
142143
self.chunk.emit(OpCode::Del, idx);
143144
false

0 commit comments

Comments
 (0)