reduce cloning of Env

This commit is contained in:
Folkert 2022-03-01 00:08:56 +01:00
parent d3bbf6d504
commit 8b457a56c5
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
2 changed files with 17 additions and 9 deletions

View file

@ -3104,7 +3104,7 @@ fn run_solve<'a>(
let (solved_subs, solved_env, problems) = let (solved_subs, solved_env, problems) =
roc_solve::module::run_solve(rigid_variables, constraint, var_store); roc_solve::module::run_solve(rigid_variables, constraint, var_store);
let mut exposed_vars_by_symbol: MutMap<Symbol, Variable> = solved_env.vars_by_symbol().clone(); let mut exposed_vars_by_symbol: MutMap<Symbol, Variable> = solved_env.vars_by_symbol();
exposed_vars_by_symbol.retain(|k, _| exposed_symbols.contains(k)); exposed_vars_by_symbol.retain(|k, _| exposed_symbols.contains(k));
let solved_types = roc_solve::module::make_solved_types(&solved_subs, &exposed_vars_by_symbol); let solved_types = roc_solve::module::make_solved_types(&solved_subs, &exposed_vars_by_symbol);

View file

@ -1,3 +1,4 @@
use bumpalo::Bump;
use roc_can::constraint::Constraint::{self, *}; use roc_can::constraint::Constraint::{self, *};
use roc_can::constraint::PresenceConstraint; use roc_can::constraint::PresenceConstraint;
use roc_can::expected::{Expected, PExpected}; use roc_can::expected::{Expected, PExpected};
@ -192,7 +193,11 @@ pub fn run_in_place(
mark: Mark::NONE.next(), mark: Mark::NONE.next(),
}; };
let rank = Rank::toplevel(); let rank = Rank::toplevel();
let arena = Bump::new();
let state = solve( let state = solve(
&arena,
env, env,
state, state,
rank, rank,
@ -212,7 +217,7 @@ enum After {
enum Work<'a> { enum Work<'a> {
Constraint { Constraint {
env: Env, env: &'a Env,
rank: Rank, rank: Rank,
constraint: &'a Constraint, constraint: &'a Constraint,
after: Option<After>, after: Option<After>,
@ -223,6 +228,7 @@ enum Work<'a> {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
fn solve( fn solve(
arena: &Bump,
env: &Env, env: &Env,
mut state: State, mut state: State,
rank: Rank, rank: Rank,
@ -233,7 +239,7 @@ fn solve(
constraint: &Constraint, constraint: &Constraint,
) -> State { ) -> State {
let mut stack = vec![Work::Constraint { let mut stack = vec![Work::Constraint {
env: env.clone(), env,
rank, rank,
constraint, constraint,
after: None, after: None,
@ -269,7 +275,7 @@ fn solve(
// NOTE deviation: elm only copies the env into the state on SaveTheEnvironment // NOTE deviation: elm only copies the env into the state on SaveTheEnvironment
let mut copy = state; let mut copy = state;
copy.env = env; copy.env = env.clone();
copy copy
} }
@ -412,7 +418,7 @@ fn solve(
And(sub_constraints) => { And(sub_constraints) => {
for sub_constraint in sub_constraints.iter().rev() { for sub_constraint in sub_constraints.iter().rev() {
stack.push(Work::Constraint { stack.push(Work::Constraint {
env: env.clone(), env,
rank, rank,
constraint: sub_constraint, constraint: sub_constraint,
after: None, after: None,
@ -484,7 +490,8 @@ fn solve(
ret_con if let_con.rigid_vars.is_empty() && let_con.flex_vars.is_empty() => { ret_con if let_con.rigid_vars.is_empty() && let_con.flex_vars.is_empty() => {
// TODO: make into `WorkItem` with `After` // TODO: make into `WorkItem` with `After`
let state = solve( let state = solve(
&env, arena,
env,
state, state,
rank, rank,
pools, pools,
@ -517,7 +524,7 @@ fn solve(
} }
stack.push(Work::Constraint { stack.push(Work::Constraint {
env: new_env, env: arena.alloc(new_env),
rank, rank,
constraint: ret_con, constraint: ret_con,
after: Some(After::CheckForInfiniteTypes(local_def_vars)), after: Some(After::CheckForInfiniteTypes(local_def_vars)),
@ -581,7 +588,8 @@ fn solve(
env: saved_env, env: saved_env,
mark, mark,
} = solve( } = solve(
&env, arena,
env,
state, state,
next_rank, next_rank,
pools, pools,
@ -660,7 +668,7 @@ fn solve(
// Now solve the body, using the new vars_by_symbol which includes // Now solve the body, using the new vars_by_symbol which includes
// the assignments' name-to-variable mappings. // the assignments' name-to-variable mappings.
stack.push(Work::Constraint { stack.push(Work::Constraint {
env: new_env, env: arena.alloc(new_env),
rank, rank,
constraint: ret_con, constraint: ret_con,
after: Some(After::CheckForInfiniteTypes(local_def_vars)), after: Some(After::CheckForInfiniteTypes(local_def_vars)),