@@ -160,20 +160,13 @@ fn assemble<'a>(nodes: &'a [Node<'a>]) -> extern "C" fn() -> u64 {
160160 }
161161
162162 fn get_value < ' a > ( v : Option < & Node < ' a > > , out : & mut Vec < u8 > ) -> Value {
163- match v {
164- Some ( Node :: Ident ( i) ) => Value :: Register ( ident_to_register ( * i) ) ,
165- Some ( Node :: Number ( n) ) => Value :: Imm ( * n) ,
166- Some ( node) => {
167- // expressions should pushed onto stack
168- assemble_exp ( & node, out) ;
169- Value :: Stack
170- } ,
171- None => panic ! ( "Expected a value" )
172- }
163+ assemble_exp ( v. expect ( "Expected a value" ) , out)
173164 }
174165
175166 fn assemble_exp < ' a > ( node : & ' a Node < ' a > , out : & mut Vec < u8 > ) -> Value {
176167 match node {
168+ Node :: Ident ( i) => Value :: Register ( ident_to_register ( * i) ) ,
169+ Node :: Number ( n) => Value :: Imm ( * n) ,
177170 Node :: Call ( name, args) => {
178171 match * name {
179172 b"set" => {
@@ -227,13 +220,15 @@ fn assemble<'a>(nodes: &'a [Node<'a>]) -> extern "C" fn() -> u64 {
227220 whatever => todo ! ( "Not sure what {} is" , core:: str :: from_utf8( whatever) . unwrap( ) )
228221 }
229222 } ,
230-
231- whatever => todo ! ( "Whatever this is {whatever:#?}" )
232223 }
233224 }
234225
235226 while ind < nodes. len ( ) {
236- assemble_exp ( & nodes[ ind] , & mut out) ;
227+ match assemble_exp ( & nodes[ ind] , & mut out) {
228+ Value :: Stack => out. extend ( dasm:: tier:: raw:: amd64:: pop_r64 ( 0 ) ) ,
229+ _ => ( )
230+ }
231+
237232 ind += 1 ;
238233 }
239234
@@ -258,10 +253,12 @@ fn main() {
258253 )
259254 )
260255 )
256+
257+ (add (add rax rax) 6)
261258 " ) ;
262259
263260 let nodes = parse ( & tokens) ;
264261
265262 let out = assemble ( & nodes) ;
266- assert_eq ! ( out( ) , 1 + 5 + 72 ) ;
263+ assert_eq ! ( out( ) , ( 1 + 5 + 72 ) * 2 + 6 ) ;
267264}
0 commit comments