commit working changes so far

This commit is contained in:
Kasey White 2023-02-05 15:35:32 -05:00 committed by Lucas
parent 31cd19f198
commit c32a9d7b6f
3 changed files with 121 additions and 65 deletions

View File

@ -70,6 +70,14 @@ impl<'a> CodeGenerator<'a> {
}
}
pub fn reset(&mut self) {
self.needs_field_access = false;
self.used_data_assert_on_list = false;
self.zero_arg_functions = IndexMap::new();
self.id_gen = IdGenerator::new();
self.defined_functions = IndexMap::new();
}
pub fn generate(
&mut self,
body: &TypedExpr,
@ -83,8 +91,12 @@ impl<'a> CodeGenerator<'a> {
self.define_ir(&mut ir_stack);
println!("{ir_stack:#?}");
self.convert_opaque_type_to_inner_ir(&mut ir_stack);
println!("{ir_stack:#?}");
let mut term = self.uplc_code_gen(&mut ir_stack);
if self.needs_field_access {
@ -113,6 +125,8 @@ impl<'a> CodeGenerator<'a> {
term,
};
println!("{}", program.to_pretty());
program = aiken_optimize_and_intern(program);
program
@ -302,13 +316,16 @@ impl<'a> CodeGenerator<'a> {
let mut value_scope = scope.clone();
value_scope.push(self.id_gen.next());
let mut replaced_type = tipo.clone();
replace_opaque_type(&mut replaced_type, self.data_types.clone());
self.build_ir(value, &mut value_vec, value_scope);
self.assignment_ir(
pattern,
&mut pattern_vec,
&mut value_vec,
tipo,
&replaced_type,
AssignmentProperties {
value_type: value.tipo(),
kind: *kind,
@ -326,6 +343,8 @@ impl<'a> CodeGenerator<'a> {
// assuming one subject at the moment
let subject = subjects[0].clone();
let mut replaced_type = subject.tipo();
replace_opaque_type(&mut replaced_type, self.data_types.clone());
if clauses.len() <= 1 {
let mut value_vec: Vec<Air> = vec![];
let mut pattern_vec: Vec<Air> = vec![];
@ -339,7 +358,7 @@ impl<'a> CodeGenerator<'a> {
&clauses[0].pattern[0],
&mut pattern_vec,
&mut subject_vec,
&subject.tipo(),
&replaced_type,
AssignmentProperties {
value_type: clauses[0].then.tipo(),
kind: AssignmentKind::Let,
@ -350,7 +369,8 @@ impl<'a> CodeGenerator<'a> {
ir_stack.append(&mut pattern_vec);
ir_stack.append(&mut value_vec);
} else {
let clauses = if matches!(clauses[0].pattern[0], Pattern::List { .. }) {
// HERE TODO
let clauses = if replaced_type.is_list() {
rearrange_clauses(clauses.clone())
} else {
clauses.clone()
@ -360,7 +380,7 @@ impl<'a> CodeGenerator<'a> {
let mut pattern_vec = vec![];
let mut clause_properties = ClauseProperties::init(
&subject.tipo(),
&replaced_type,
constr_var.clone(),
subject_name.clone(),
);
@ -369,7 +389,7 @@ impl<'a> CodeGenerator<'a> {
&mut pattern_vec,
&mut clause_properties,
clauses,
&subject.tipo(),
&replaced_type,
scope.clone(),
);
@ -395,7 +415,7 @@ impl<'a> CodeGenerator<'a> {
last_pattern,
&mut pattern_vec,
&mut final_clause_vec,
&subject.tipo(),
&replaced_type,
&mut clause_properties,
final_scope,
);
@ -411,7 +431,7 @@ impl<'a> CodeGenerator<'a> {
ir_stack.push(Air::When {
scope: scope.clone(),
subject_name,
tipo: subject.tipo(),
tipo: replaced_type.clone(),
});
let mut scope = scope;
@ -420,7 +440,7 @@ impl<'a> CodeGenerator<'a> {
ir_stack.push(Air::Var {
scope,
constructor: ValueConstructor::public(
subject.tipo(),
replaced_type,
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -432,7 +452,7 @@ impl<'a> CodeGenerator<'a> {
ir_stack.push(Air::When {
scope: scope.clone(),
subject_name,
tipo: subject.tipo(),
tipo: replaced_type,
});
let mut scope = scope;
@ -892,7 +912,6 @@ impl<'a> CodeGenerator<'a> {
new_vec.append(values);
// pattern_vec.push(value)
self.when_ir(
pattern,
pattern_vec,
@ -1724,8 +1743,7 @@ impl<'a> CodeGenerator<'a> {
}
}
if matches!(&assignment_properties.kind, AssignmentKind::Assert) {
} else {
if !names.is_empty() {
pattern_vec.push(Air::ListAccessor {
names,
tail: tail.is_some(),
@ -1733,6 +1751,11 @@ impl<'a> CodeGenerator<'a> {
tipo: tipo.clone().into(),
check_last_item: false,
});
} else {
pattern_vec.push(Air::Let {
scope,
name: "_".to_string(),
})
}
pattern_vec.append(values);
@ -1747,7 +1770,7 @@ impl<'a> CodeGenerator<'a> {
let mut nested_pattern = vec![];
let field_map = match constructor {
PatternConstructor::Record { field_map, .. } => field_map.clone().unwrap(),
PatternConstructor::Record { field_map, .. } => field_map.clone(),
};
let mut type_map: IndexMap<usize, Arc<Type>> = IndexMap::new();
@ -1759,14 +1782,19 @@ impl<'a> CodeGenerator<'a> {
let arguments_index = arguments
.iter()
.filter_map(|item| {
.enumerate()
.filter_map(|(index, item)| {
let label = item.label.clone().unwrap_or_default();
let field_index = field_map.fields.get(&label).map(|x| &x.0).unwrap_or(&0);
let field_index = if let Some(field_map) = &field_map {
*field_map.fields.get(&label).map(|x| &x.0).unwrap()
} else {
index
};
self.extract_arg_and_index(
&item.value,
*field_index,
field_index,
&mut nested_pattern,
type_map.get(field_index).unwrap(),
type_map.get(&field_index).unwrap(),
&assignment_properties,
&scope,
)
@ -1786,6 +1814,11 @@ impl<'a> CodeGenerator<'a> {
scope,
check_last_item: false,
});
} else {
pattern_vec.push(Air::Let {
scope,
name: "_".to_string(),
});
}
pattern_vec.append(values);
@ -1826,10 +1859,14 @@ impl<'a> CodeGenerator<'a> {
tipo: tipo.clone().into(),
check_last_item: true,
});
} else {
pattern_vec.push(Air::Let {
scope,
name: "_".to_string(),
});
}
pattern_vec.append(values);
pattern_vec.append(&mut nested_pattern);
}
}
@ -1904,6 +1941,8 @@ impl<'a> CodeGenerator<'a> {
self.recursive_assert_tipo(tipo, &mut assert_list_vec, &name, scope.clone());
names.push(name);
pattern_vec.push(Air::ListAccessor {
scope,
tipo: tipo.clone().into(),
@ -2105,6 +2144,9 @@ impl<'a> CodeGenerator<'a> {
name: &str,
scope: Vec<u64>,
) {
let mut tipo = tipo.clone().into();
replace_opaque_type(&mut tipo, self.data_types.clone());
if tipo.is_bool()
|| tipo.is_bytearray()
|| tipo.is_int()
@ -2123,25 +2165,25 @@ impl<'a> CodeGenerator<'a> {
assert_vec.push(Air::Call {
scope: scope.clone(),
count: 2,
tipo: tipo.clone().into(),
tipo: tipo.clone(),
});
assert_vec.push(Air::Builtin {
scope: scope.clone(),
func: DefaultFunction::ChooseUnit,
tipo: tipo.clone().into(),
tipo: tipo.clone(),
});
assert_vec.push(Air::Call {
scope: scope.clone(),
count: 2,
tipo: tipo.clone().into(),
tipo: tipo.clone(),
});
assert_vec.push(Air::Var {
scope: scope.clone(),
constructor: ValueConstructor::public(
tipo.clone().into(),
tipo.clone(),
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -2153,7 +2195,7 @@ impl<'a> CodeGenerator<'a> {
assert_vec.push(Air::Var {
scope: scope.clone(),
constructor: ValueConstructor::public(
tipo.clone().into(),
tipo.clone(),
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -2180,7 +2222,7 @@ impl<'a> CodeGenerator<'a> {
assert_vec.push(Air::Var {
scope: scope.clone(),
constructor: ValueConstructor::public(
tipo.clone().into(),
tipo.clone(),
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -2212,25 +2254,25 @@ impl<'a> CodeGenerator<'a> {
assert_vec.push(Air::Call {
scope: scope.clone(),
count: 2,
tipo: tipo.clone().into(),
tipo: tipo.clone(),
});
assert_vec.push(Air::Builtin {
scope: scope.clone(),
func: DefaultFunction::ChooseUnit,
tipo: tipo.clone().into(),
tipo: tipo.clone(),
});
assert_vec.push(Air::Call {
scope: scope.clone(),
count: 2,
tipo: tipo.clone().into(),
tipo: tipo.clone(),
});
assert_vec.push(Air::Var {
scope: scope.clone(),
constructor: ValueConstructor::public(
tipo.clone().into(),
tipo.clone(),
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -2242,7 +2284,7 @@ impl<'a> CodeGenerator<'a> {
assert_vec.push(Air::Var {
scope: scope.clone(),
constructor: ValueConstructor::public(
tipo.clone().into(),
tipo.clone(),
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -2269,7 +2311,7 @@ impl<'a> CodeGenerator<'a> {
assert_vec.push(Air::Var {
scope: scope.clone(),
constructor: ValueConstructor::public(
tipo.clone().into(),
tipo.clone(),
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -2327,31 +2369,31 @@ impl<'a> CodeGenerator<'a> {
);
}
} else {
let data_type = lookup_data_type_by_tipo(self.data_types.clone(), tipo).unwrap();
let data_type = lookup_data_type_by_tipo(self.data_types.clone(), &tipo).unwrap();
let new_id = self.id_gen.next();
assert_vec.push(Air::Call {
scope: scope.clone(),
count: 2,
tipo: tipo.clone().into(),
tipo: tipo.clone(),
});
assert_vec.push(Air::Builtin {
scope: scope.clone(),
func: DefaultFunction::ChooseUnit,
tipo: tipo.clone().into(),
tipo: tipo.clone(),
});
assert_vec.push(Air::When {
scope: scope.clone(),
tipo: tipo.clone().into(),
tipo: tipo.clone(),
subject_name: format!("__subject_{new_id}"),
});
assert_vec.push(Air::Var {
scope: scope.clone(),
constructor: ValueConstructor::public(
tipo.clone().into(),
tipo.clone(),
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -2376,7 +2418,7 @@ impl<'a> CodeGenerator<'a> {
assert_vec.push(Air::Clause {
scope: scope.clone(),
tipo: tipo.clone().into(),
tipo: tipo.clone(),
subject_name: format!("__subject_{new_id}"),
complex_clause: false,
});
@ -2386,6 +2428,7 @@ impl<'a> CodeGenerator<'a> {
value: index.to_string(),
});
if !arg_indices.is_empty() {
assert_vec.push(Air::FieldsExpose {
scope: scope.clone(),
indices: arg_indices.clone(),
@ -2395,7 +2438,7 @@ impl<'a> CodeGenerator<'a> {
assert_vec.push(Air::Var {
scope: scope.clone(),
constructor: ValueConstructor::public(
tipo.clone().into(),
tipo.clone(),
ValueConstructorVariant::LocalVariable {
location: Span::empty(),
},
@ -2403,6 +2446,7 @@ impl<'a> CodeGenerator<'a> {
name: name.to_owned(),
variant_name: String::new(),
});
}
for (_, name, tipo) in arg_indices {
self.recursive_assert_tipo(&tipo, assert_vec, &name, scope.clone());
@ -3494,9 +3538,12 @@ impl<'a> CodeGenerator<'a> {
let mut arg_stack: Vec<Term<Name>> = vec![];
while let Some(ir_element) = ir_stack.pop() {
println!("IR ELEMENT IS {:#?}", ir_element);
self.gen_uplc(ir_element, &mut arg_stack);
}
println!("Arg STACK LEN IS {:#?} ", arg_stack.len());
}
println!("ARGSTACK FINALLY IS {:#?}", arg_stack);
arg_stack[0].clone()
}
@ -4595,7 +4642,7 @@ impl<'a> CodeGenerator<'a> {
),
)
} else if tipo.is_list() || tipo.is_tuple() {
unreachable!()
unreachable!("{:#?}", tipo)
} else {
apply_wrap(
DefaultFunction::EqualsInteger.into(),

View File

@ -36,6 +36,7 @@ impl Blueprint<Schema> {
let validators: Result<Vec<_>, Error> = modules
.validators()
.map(|(validator, def)| {
generator.reset();
Validator::from_checked_module(modules, generator, validator, def)
})
.collect();

View File

@ -58,7 +58,7 @@ impl Program<Name> {
pub fn inline_reduce(self) -> Program<Name> {
let mut term = self.term.clone();
inline_reduce(&mut term);
inline_basic_reduce(&mut term);
Program {
version: self.version,
term,
@ -120,38 +120,46 @@ fn builtin_force_reduce(term: &mut Term<Name>, builtin_map: &mut IndexMap<u8, ()
}
}
fn inline_reduce(term: &mut Term<Name>) {
fn inline_basic_reduce(term: &mut Term<Name>) {
match term {
Term::Delay(d) => {
let d = Rc::make_mut(d);
inline_reduce(d);
inline_basic_reduce(d);
}
Term::Lambda { body, .. } => {
let body = Rc::make_mut(body);
inline_reduce(body);
inline_basic_reduce(body);
}
Term::Apply { function, argument } => {
let arg = Rc::make_mut(argument);
inline_reduce(arg);
inline_basic_reduce(arg);
let func = Rc::make_mut(function);
inline_reduce(func);
inline_basic_reduce(func);
if let Term::Lambda {
parameter_name,
body,
} = func
{
if let replace_term @ (Term::Var(_)
| Term::Constant(_)
| Term::Error
| Term::Delay(_)
| Term::Lambda { .. }) = argument.as_ref()
{
let mut occurrences = 0;
var_occurrences(body, parameter_name.clone(), &mut occurrences);
if occurrences <= 1 {
*term = substitute_term(body.as_ref(), parameter_name.clone(), argument);
*term =
substitute_term(body.as_ref(), parameter_name.clone(), replace_term);
}
}
}
}
Term::Force(f) => {
let f = Rc::make_mut(f);
inline_reduce(f);
inline_basic_reduce(f);
}
_ => {}
}