Eliminate a Vec in record solving

This commit is contained in:
Richard Feldman 2021-08-07 08:22:23 -04:00
parent 5e42a7b8b1
commit 49aa0b8ffd
2 changed files with 58 additions and 28 deletions

View file

@ -1392,24 +1392,39 @@ fn deep_copy_var_help(
same @ EmptyRecord | same @ EmptyTagUnion | same @ Erroneous(_) => same, same @ EmptyRecord | same @ EmptyTagUnion | same @ Erroneous(_) => same,
Record(fields, ext_var) => { Record(fields, ext_var) => {
let mut new_vars = Vec::with_capacity(fields.len()); let record_fields = {
for index in fields.iter_variables() { let mut new_vars = Vec::with_capacity(fields.len());
let var = subs[index];
let copy_var = deep_copy_var_help(subs, max_rank, pools, var);
new_vars.push(copy_var);
}
let it = fields.iter_all().zip(new_vars).map(|((i1, _, i3), var)| { for index in fields.iter_variables() {
let label = subs[i1].clone(); let var = subs[index];
let record_field = subs[i3].map(|_| var); let copy_var = deep_copy_var_help(subs, max_rank, pools, var);
(label, record_field) new_vars.push(copy_var);
}); }
// lifetime troubles let field_names_start = subs.field_names.len() as u32;
let vec: Vec<_> = it.collect(); let variables_start = subs.variables.len() as u32;
let field_types_start = subs.record_fields.len() as u32;
let record_fields = RecordFields::insert_into_subs(subs, vec); let mut length = 0;
for ((i1, _, i3), var) in fields.iter_all().zip(new_vars) {
let record_field = subs[i3].map(|_| var);
subs.field_names.push(subs[i1].clone());
subs.record_fields.push(record_field.map(|_| ()));
subs.variables.push(*record_field.as_inner());
length += 1;
}
RecordFields {
length,
field_names_start,
variables_start,
field_types_start,
}
};
Record( Record(
record_fields, record_fields,

View file

@ -1519,24 +1519,39 @@ fn deep_copy_var_help(
same @ EmptyRecord | same @ EmptyTagUnion | same @ Erroneous(_) => same, same @ EmptyRecord | same @ EmptyTagUnion | same @ Erroneous(_) => same,
Record(fields, ext_var) => { Record(fields, ext_var) => {
let mut new_vars = Vec::with_capacity(fields.len()); let record_fields = {
for index in fields.iter_variables() { let mut new_vars = Vec::with_capacity(fields.len());
let var = subs[index];
let copy_var = deep_copy_var_help(subs, max_rank, pools, var);
new_vars.push(copy_var);
}
let it = fields.iter_all().zip(new_vars).map(|((i1, _, i3), var)| { for index in fields.iter_variables() {
let label = subs[i1].clone(); let var = subs[index];
let record_field = subs[i3].map(|_| var); let copy_var = deep_copy_var_help(subs, max_rank, pools, var);
(label, record_field) new_vars.push(copy_var);
}); }
// lifetime troubles let field_names_start = subs.field_names.len() as u32;
let vec: Vec<_> = it.collect(); let variables_start = subs.variables.len() as u32;
let field_types_start = subs.record_fields.len() as u32;
let record_fields = RecordFields::insert_into_subs(subs, vec); let mut length = 0;
for ((i1, _, i3), var) in fields.iter_all().zip(new_vars) {
let record_field = subs[i3].map(|_| var);
subs.field_names.push(subs[i1].clone());
subs.record_fields.push(record_field.map(|_| ()));
subs.variables.push(*record_field.as_inner());
length += 1;
}
RecordFields {
length,
field_names_start,
variables_start,
field_types_start,
}
};
Record( Record(
record_fields, record_fields,