@@ -129,7 +129,7 @@ fn compile_function(
129129) -> Result < Vec < IntermediateInstruction > , String > {
130130 // memory layout: pc, fp, args, return_vars, internal_vars
131131 let mut stack_pos = 2 ; // Reserve space for pc and fp
132- let mut function_scope_layout = ScopeLayout :: default ( ) ;
132+ let function_scope_layout = ScopeLayout :: default ( ) ;
133133 compiler. stack_frame_layout = StackFrameLayout {
134134 scopes : vec ! [ function_scope_layout] ,
135135 } ;
@@ -212,7 +212,6 @@ fn compile_lines(
212212 }
213213
214214 SimpleLine :: Match { value, arms } => {
215- let saved_stack_pos = compiler. stack_pos ;
216215 compiler. stack_frame_layout . scopes . push ( ScopeLayout :: default ( ) ) ;
217216
218217 let match_index = compiler. match_blocks . len ( ) ;
@@ -221,6 +220,8 @@ fn compile_lines(
221220 let value_simplified = IntermediateValue :: from_simple_expr ( value, compiler) ;
222221
223222 let mut compiled_arms = vec ! [ ] ;
223+ let saved_stack_pos = compiler. stack_pos ;
224+ let mut new_stack_pos = saved_stack_pos;
224225 for ( i, arm) in arms. iter ( ) . enumerate ( ) {
225226 let mut arm_declared_vars = declared_vars. clone ( ) ;
226227 compiler. stack_pos = saved_stack_pos;
@@ -237,7 +238,9 @@ fn compile_lines(
237238 } else {
238239 declared_vars. intersection ( & arm_declared_vars) . cloned ( ) . collect ( )
239240 } ;
241+ new_stack_pos = new_stack_pos. max ( compiler. stack_pos ) ;
240242 }
243+ compiler. stack_pos = new_stack_pos;
241244 compiler. match_blocks . push ( MatchBlock {
242245 function_name : function_name. clone ( ) ,
243246 match_cases : compiled_arms,
@@ -549,54 +552,56 @@ fn compile_lines(
549552 to_decompose,
550553 label,
551554 } => {
555+ declared_vars. insert ( var. clone ( ) ) ;
556+ let mut current_scope_layout = compiler. stack_frame_layout . scopes . last_mut ( ) . unwrap ( ) ;
557+ current_scope_layout. var_positions . insert ( var. clone ( ) , compiler. stack_pos ) ;
558+ compiler. stack_pos += 1 ;
559+
552560 instructions. push ( IntermediateInstruction :: DecomposeBits {
553561 res_offset : compiler. stack_pos ,
554562 to_decompose : to_decompose
555563 . iter ( )
556564 . map ( |expr| IntermediateValue :: from_simple_expr ( expr, compiler) )
557565 . collect ( ) ,
558566 } ) ;
559- declared_vars. insert ( var. clone ( ) ) ;
560- let mut current_scope_layout = compiler. stack_frame_layout . scopes . last_mut ( ) . unwrap ( ) ;
561- current_scope_layout. var_positions . insert ( var. clone ( ) , compiler. stack_pos ) ;
562- compiler. stack_pos += F :: bits ( ) * to_decompose. len ( ) ;
563567
564- // TODO: is handle_const_malloc needed?
565- // handle_const_malloc(
566- // declared_vars ,
567- // &mut instructions ,
568- // compiler ,
569- // var ,
570- // F::bits() * to_decompose.len() ,
571- // label,
572- // );
568+ handle_const_malloc (
569+ declared_vars ,
570+ & mut instructions ,
571+ compiler ,
572+ var ,
573+ F :: bits ( ) * to_decompose . len ( ) ,
574+ label ,
575+ ) ;
576+ compiler . stack_pos += F :: bits ( ) * to_decompose . len ( ) ;
573577 }
574578 SimpleLine :: DecomposeCustom {
575579 var,
576580 to_decompose,
577581 label,
578582 } => {
583+ declared_vars. insert ( var. clone ( ) ) ;
584+ let mut current_scope_layout = compiler. stack_frame_layout . scopes . last_mut ( ) . unwrap ( ) ;
585+ current_scope_layout. var_positions . insert ( var. clone ( ) , compiler. stack_pos ) ;
586+ compiler. stack_pos += 1 ;
587+
579588 instructions. push ( IntermediateInstruction :: DecomposeCustom {
580589 res_offset : compiler. stack_pos ,
581590 to_decompose : to_decompose
582591 . iter ( )
583592 . map ( |expr| IntermediateValue :: from_simple_expr ( expr, compiler) )
584593 . collect ( ) ,
585594 } ) ;
586- declared_vars. insert ( var. clone ( ) ) ;
587- let mut current_scope_layout = compiler. stack_frame_layout . scopes . last_mut ( ) . unwrap ( ) ;
588- current_scope_layout. var_positions . insert ( var. clone ( ) , compiler. stack_pos ) ;
589- compiler. stack_pos += F :: bits ( ) * to_decompose. len ( ) ;
590595
591- // TODO: is handle_const_malloc needed?
592- // handle_const_malloc(
593- // declared_vars ,
594- // &mut instructions ,
595- // compiler ,
596- // var ,
597- // F::bits() * to_decompose.len() ,
598- // label,
599- // );
596+ handle_const_malloc (
597+ declared_vars ,
598+ & mut instructions ,
599+ compiler ,
600+ var ,
601+ F :: bits ( ) * to_decompose . len ( ) ,
602+ label ,
603+ ) ;
604+ compiler . stack_pos += F :: bits ( ) * to_decompose . len ( ) ;
600605 }
601606 SimpleLine :: CounterHint { var } => {
602607 let mut current_scope_layout = compiler. stack_frame_layout . scopes . last_mut ( ) . unwrap ( ) ;
0 commit comments