From 03e7c3b4b22e5abd53b2af64f09849ba0ca43b32 Mon Sep 17 00:00:00 2001 From: Markus Westerlind Date: Sat, 17 Aug 2019 00:21:34 +0200 Subject: [PATCH] =?UTF-8?q?perf(check):=20Remove=20some=20branches=20in=20?= =?UTF-8?q?the=20occurs=20check=C2=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- check/src/substitution.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/check/src/substitution.rs b/check/src/substitution.rs index ef9422b477..0c49c94f6e 100644 --- a/check/src/substitution.rs +++ b/check/src/substitution.rs @@ -153,22 +153,26 @@ where var: u32, subs: &'a Substitution, } - impl<'a, 't, T> Walker<'t, T> for Occurs<'a, T> + impl<'t, T> Walker<'t, T> for Occurs<'t, T> where T: Substitutable, { - fn walk(&mut self, typ: &'t T) { - if !typ.contains_variables() || self.occurs { + fn walk(&mut self, mut typ: &'t T) { + if !typ.contains_variables() { return; } - let typ = self.subs.real(typ); if let Some(other) = typ.get_var() { - if self.var.get_id() == other.get_id() { - self.occurs = true; - typ.traverse(self); - return; + let other_id = other.get_id(); + if let Some(real_type) = self.subs.find_type_for_var(other_id) { + typ = real_type; + } else { + if self.var.get_id() == other_id { + self.occurs = true; + typ.traverse(self); + return; + } + self.subs.update_level(self.var, other.get_id()); } - self.subs.update_level(self.var, other.get_id()); } typ.traverse(self); }