From 6a38f4371de46c7c5f6ea7364d8f610b227129a0 Mon Sep 17 00:00:00 2001 From: Markus Westerlind Date: Sat, 26 Jan 2019 22:43:34 +0100 Subject: [PATCH] perf: Avoid recursing in gather_foralls --- check/src/typecheck/generalize.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/check/src/typecheck/generalize.rs b/check/src/typecheck/generalize.rs index cee3f2d3b4..84bb4e166b 100644 --- a/check/src/typecheck/generalize.rs +++ b/check/src/typecheck/generalize.rs @@ -3,7 +3,7 @@ use crate::base::{ fnv::{FnvMap, FnvSet}, pos::{BytePos, Span}, symbol::Symbol, - types::{self, AppVec, ArcType, BuiltinType, Generic, Type, TypeInterner}, + types::{self, AppVec, ArcType, BuiltinType, Flags, Generic, Type, TypeExt, TypeInterner}, }; use crate::{substitution::Substitution, typ::RcType, typecheck::Typecheck}; @@ -252,6 +252,12 @@ struct TypeVariableGenerator { impl TypeVariableGenerator { fn new(subs: &Substitution, typ: &RcType) -> TypeVariableGenerator { fn gather_foralls(map: &mut FnvSet, subs: &Substitution, typ: &RcType) { + if !typ + .flags() + .intersects(Flags::HAS_VARIABLES | Flags::HAS_FORALL) + { + return; + } let typ = subs.real(typ); if let Type::Forall(ref params, _) = **typ { map.extend(params.iter().map(|param| param.id.clone()));