@@ -10,7 +10,7 @@ use utils::ToUsize;
1010#[ derive( Default ) ]
1111struct Compiler {
1212 bytecode : BTreeMap < Label , Vec < IntermediateInstruction > > ,
13- match_blocks : Vec < Vec < Vec < IntermediateInstruction > > > , // each match = many bytecode blocks, each bytecode block = many instructions
13+ match_blocks : Vec < MatchBlock > ,
1414 if_counter : usize ,
1515 call_counter : usize ,
1616 func_name : String ,
@@ -152,10 +152,17 @@ fn compile_function(
152152 compiler. args_count = function. arguments . len ( ) ;
153153
154154 let mut declared_vars: BTreeSet < Var > = function. arguments . iter ( ) . cloned ( ) . collect ( ) ;
155- compile_lines ( & function. instructions , compiler, None , & mut declared_vars)
155+ compile_lines (
156+ & Label :: function ( function. name . clone ( ) ) ,
157+ & function. instructions ,
158+ compiler,
159+ None ,
160+ & mut declared_vars,
161+ )
156162}
157163
158164fn compile_lines (
165+ function_name : & Label ,
159166 lines : & [ SimpleLine ] ,
160167 compiler : & mut Compiler ,
161168 final_jump : Option < Label > ,
@@ -212,6 +219,7 @@ fn compile_lines(
212219 let mut arm_declared_vars = declared_vars. clone ( ) ;
213220 compiler. stack_size = original_stack_size;
214221 let arm_instructions = compile_lines (
222+ function_name,
215223 arm,
216224 compiler,
217225 Some ( end_label. clone ( ) ) ,
@@ -229,7 +237,10 @@ fn compile_lines(
229237 } ;
230238 }
231239 compiler. stack_size = new_stack_size;
232- compiler. match_blocks . push ( compiled_arms) ;
240+ compiler. match_blocks . push ( MatchBlock {
241+ function_name : function_name. clone ( ) ,
242+ match_cases : compiled_arms,
243+ } ) ;
233244
234245 let value_scaled_offset = IntermediateValue :: MemoryAfterFp {
235246 offset : compiler. stack_size . into ( ) ,
@@ -261,8 +272,13 @@ fn compile_lines(
261272 updated_fp : None ,
262273 } ) ;
263274
264- let remaining =
265- compile_lines ( & lines[ i + 1 ..] , compiler, final_jump, declared_vars) ?;
275+ let remaining = compile_lines (
276+ function_name,
277+ & lines[ i + 1 ..] ,
278+ compiler,
279+ final_jump,
280+ declared_vars,
281+ ) ?;
266282 compiler. bytecode . insert ( end_label, remaining) ;
267283
268284 return Ok ( instructions) ;
@@ -349,6 +365,7 @@ fn compile_lines(
349365
350366 let mut then_declared_vars = declared_vars. clone ( ) ;
351367 let then_instructions = compile_lines (
368+ function_name,
352369 then_branch,
353370 compiler,
354371 Some ( end_label. clone ( ) ) ,
@@ -359,6 +376,7 @@ fn compile_lines(
359376 compiler. stack_size = original_stack;
360377 let mut else_declared_vars = declared_vars. clone ( ) ;
361378 let else_instructions = compile_lines (
379+ function_name,
362380 else_branch,
363381 compiler,
364382 Some ( end_label. clone ( ) ) ,
@@ -375,8 +393,13 @@ fn compile_lines(
375393 compiler. bytecode . insert ( if_label, then_instructions) ;
376394 compiler. bytecode . insert ( else_label, else_instructions) ;
377395
378- let remaining =
379- compile_lines ( & lines[ i + 1 ..] , compiler, final_jump, declared_vars) ?;
396+ let remaining = compile_lines (
397+ function_name,
398+ & lines[ i + 1 ..] ,
399+ compiler,
400+ final_jump,
401+ declared_vars,
402+ ) ?;
380403 compiler. bytecode . insert ( end_label, remaining) ;
381404
382405 return Ok ( instructions) ;
@@ -399,7 +422,7 @@ fn compile_lines(
399422 }
400423
401424 SimpleLine :: FunctionCall {
402- function_name,
425+ function_name : callee_function_name ,
403426 args,
404427 return_data,
405428 } => {
@@ -411,7 +434,7 @@ fn compile_lines(
411434 compiler. stack_size += 1 ;
412435
413436 instructions. extend ( setup_function_call (
414- function_name ,
437+ callee_function_name ,
415438 args,
416439 new_fp_pos,
417440 & return_label,
@@ -436,6 +459,7 @@ fn compile_lines(
436459 }
437460
438461 instructions. extend ( compile_lines (
462+ function_name,
439463 & lines[ i + 1 ..] ,
440464 compiler,
441465 final_jump,
0 commit comments