提交 5a24b354 编写于 作者: S Steffen Forkmann 提交者: Kevin Ransom (msft)

Remove double lookups from ConstraintSolver (#4732)

上级 4cfdb417
......@@ -778,7 +778,7 @@ and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace
match sty1, sty2 with
// type vars inside forall-types may be alpha-equivalent
| TType_var tp1, TType_var tp2 when typarEq tp1 tp2 || (aenv.EquivTypars.ContainsKey tp1 && typeEquiv g aenv.EquivTypars.[tp1] ty2) -> CompleteD
| TType_var tp1, TType_var tp2 when typarEq tp1 tp2 || (match aenv.EquivTypars.TryFind tp1 with | Some v when typeEquiv g v ty2 -> true | _ -> false) -> CompleteD
| TType_var tp1, TType_var tp2 when PreferUnifyTypar tp1 tp2 -> SolveTyparEqualsTyp csenv ndeep m2 trace sty1 ty2
| TType_var tp1, TType_var tp2 when not csenv.MatchingOnly && PreferUnifyTypar tp2 tp1 -> SolveTyparEqualsTyp csenv ndeep m2 trace sty2 ty1
......@@ -850,12 +850,17 @@ and SolveTypSubsumesTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTra
let aenv = csenv.EquivEnv
let denv = csenv.DisplayEnv
match sty1, sty2 with
| TType_var tp1, _ when aenv.EquivTypars.ContainsKey tp1 ->
SolveTypSubsumesTyp csenv ndeep m2 trace cxsln aenv.EquivTypars.[tp1] ty2
| TType_var r1, TType_var r2 when typarEq r1 r2 -> CompleteD
| TType_var tp1, _ ->
match aenv.EquivTypars.TryFind tp1 with
| Some v -> SolveTypSubsumesTyp csenv ndeep m2 trace cxsln v ty2
| _ ->
match sty2 with
| TType_var r2 when typarEq tp1 r2 -> CompleteD
| TType_var r when not csenv.MatchingOnly -> SolveTyparSubtypeOfType csenv ndeep m2 trace r ty1
| _ -> SolveTypEqualsTypKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ty1 ty2
| _, TType_var r when not csenv.MatchingOnly -> SolveTyparSubtypeOfType csenv ndeep m2 trace r ty1
| TType_var _ , _ -> SolveTypEqualsTypKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ty1 ty2
| TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) ->
if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) else
SolveTypEqualsTypEqns csenv ndeep m2 trace cxsln l1 l2 (* nb. can unify since no variance *)
......
......@@ -43,6 +43,10 @@ type TyparMap<'T> =
let (TPMap m) = tm
m.ContainsKey(v.Stamp)
member tm.TryFind (v: Typar) =
let (TPMap m) = tm
m.TryFind(v.Stamp)
member tm.Add (v: Typar, x) =
let (TPMap m) = tm
TPMap (m.Add(v.Stamp, x))
......
......@@ -306,6 +306,7 @@ type ValMultiMap<'T> =
type TyparMap<'T> =
member Item : Typar -> 'T with get
member ContainsKey : Typar -> bool
member TryFind : Typar -> 'T option
member Add : Typar * 'T -> TyparMap<'T>
static member Empty : TyparMap<'T>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册