mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 08:34:33 +00:00
Eliminate a Vec in record solving
This commit is contained in:
parent
5e42a7b8b1
commit
49aa0b8ffd
2 changed files with 58 additions and 28 deletions
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue