fix: scope issue with ir_stack being incremented wrongly with assignment

Also fixed  scope of constructor tag and void in whens
This commit is contained in:
Kasey White 2023-03-28 19:58:36 -04:00 committed by Kasey
parent 80f2fd746d
commit aa29636d50
2 changed files with 25 additions and 7 deletions

View File

@ -491,7 +491,7 @@ impl<'a> CodeGenerator<'a> {
);
pattern_stack.merge_child(value_stack);
ir_stack.merge_child(pattern_stack);
ir_stack.merge(pattern_stack);
} else {
// TODO: go over rearrange clauses
let clauses = if subject_tipo.is_list() {
@ -545,31 +545,39 @@ impl<'a> CodeGenerator<'a> {
self.build(subject, &mut subject_stack);
ir_stack.let_assignment(constr_var.clone(), subject_stack);
let mut let_stack = ir_stack.empty_with_scope();
let_stack.let_assignment(constr_var.clone(), subject_stack);
ir_stack.merge(let_stack);
let mut var_stack = ir_stack.empty_with_scope();
let mut when_stack = ir_stack.empty_with_scope();
var_stack.local_var(subject_tipo.clone(), constr_var);
ir_stack.when(
when_stack.when(
subject_tipo,
subject_name,
var_stack,
pattern_stack,
finally_stack,
);
ir_stack.merge(when_stack);
} else {
let mut subject_stack = ir_stack.empty_with_scope();
let mut when_stack = ir_stack.empty_with_scope();
self.build(subject, &mut subject_stack);
ir_stack.when(
when_stack.when(
subject_tipo,
subject_name,
subject_stack,
pattern_stack,
finally_stack,
);
ir_stack.merge(when_stack);
}
}
}
@ -993,7 +1001,11 @@ impl<'a> CodeGenerator<'a> {
*clause_properties.needs_constr_var() = false;
pattern_stack.void();
let mut void_stack = pattern_stack.empty_with_scope();
void_stack.void();
pattern_stack.merge(void_stack);
self.expose_elements(pattern, pattern_stack, value_stack, clause_properties, tipo);
}
@ -1033,7 +1045,9 @@ impl<'a> CodeGenerator<'a> {
// if only one constructor, no need to check
if data_type.constructors.len() > 1 {
// push constructor Index
pattern_stack.integer(index.to_string());
let mut tag_stack = pattern_stack.empty_with_scope();
tag_stack.integer(index.to_string());
pattern_stack.merge_child(tag_stack);
}
if *temp_clause_properties.needs_constr_var() {

View File

@ -17,5 +17,9 @@ pub fn aiken_optimize_and_intern(program: Program<Name>) -> Program<Name> {
let program: Program<Name> = program_named.try_into().unwrap();
program.lambda_reduce().inline_reduce()
program
.lambda_reduce()
.inline_reduce()
.lambda_reduce()
.inline_reduce()
}