Preserve resolve_obligations_as_possible
temporary allocation across calls
This commit is contained in:
parent
05b0612051
commit
c1c8e787d2
@ -143,6 +143,9 @@ pub(crate) struct InferenceTable<'a> {
|
|||||||
var_unification_table: ChalkInferenceTable,
|
var_unification_table: ChalkInferenceTable,
|
||||||
type_variable_table: Vec<TypeVariableFlags>,
|
type_variable_table: Vec<TypeVariableFlags>,
|
||||||
pending_obligations: Vec<Canonicalized<InEnvironment<Goal>>>,
|
pending_obligations: Vec<Canonicalized<InEnvironment<Goal>>>,
|
||||||
|
/// Double buffer used in [`Self::resolve_obligations_as_possible`] to cut down on
|
||||||
|
/// temporary allocations.
|
||||||
|
resolve_obligations_buffer: Vec<Canonicalized<InEnvironment<Goal>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) struct InferenceTableSnapshot {
|
pub(crate) struct InferenceTableSnapshot {
|
||||||
@ -159,6 +162,7 @@ pub(crate) fn new(db: &'a dyn HirDatabase, trait_env: Arc<TraitEnvironment>) ->
|
|||||||
var_unification_table: ChalkInferenceTable::new(),
|
var_unification_table: ChalkInferenceTable::new(),
|
||||||
type_variable_table: Vec::new(),
|
type_variable_table: Vec::new(),
|
||||||
pending_obligations: Vec::new(),
|
pending_obligations: Vec::new(),
|
||||||
|
resolve_obligations_buffer: Vec::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -510,10 +514,10 @@ pub(crate) fn register_infer_ok<T>(&mut self, infer_ok: InferOk<T>) {
|
|||||||
pub(crate) fn resolve_obligations_as_possible(&mut self) {
|
pub(crate) fn resolve_obligations_as_possible(&mut self) {
|
||||||
let _span = profile::span("resolve_obligations_as_possible");
|
let _span = profile::span("resolve_obligations_as_possible");
|
||||||
let mut changed = true;
|
let mut changed = true;
|
||||||
let mut obligations = Vec::new();
|
let mut obligations = mem::take(&mut self.resolve_obligations_buffer);
|
||||||
while changed {
|
while mem::take(&mut changed) {
|
||||||
changed = false;
|
|
||||||
mem::swap(&mut self.pending_obligations, &mut obligations);
|
mem::swap(&mut self.pending_obligations, &mut obligations);
|
||||||
|
|
||||||
for canonicalized in obligations.drain(..) {
|
for canonicalized in obligations.drain(..) {
|
||||||
if !self.check_changed(&canonicalized) {
|
if !self.check_changed(&canonicalized) {
|
||||||
self.pending_obligations.push(canonicalized);
|
self.pending_obligations.push(canonicalized);
|
||||||
@ -528,6 +532,8 @@ pub(crate) fn resolve_obligations_as_possible(&mut self) {
|
|||||||
self.register_obligation_in_env(uncanonical);
|
self.register_obligation_in_env(uncanonical);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.resolve_obligations_buffer = obligations;
|
||||||
|
self.resolve_obligations_buffer.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn fudge_inference<T: TypeFoldable<Interner>>(
|
pub(crate) fn fudge_inference<T: TypeFoldable<Interner>>(
|
||||||
|
Loading…
Reference in New Issue
Block a user