@@ -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