Skip to content

Commit d9ea883

Browse files
committed
wip: issue/88
1 parent b175780 commit d9ea883

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

crates/lean_compiler/src/b_compile_intermediate.rs

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)