diff options
author | Martin Odersky <odersky@gmail.com> | 2014-02-21 18:38:48 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-02-21 18:42:50 +0100 |
commit | 8d294b9b42dfcdfaee1722095d76a1c80ed9b6d5 (patch) | |
tree | 311fa8d7d19b4d738d8156d276eeb19aa198599d /src/dotty/tools/dotc/typer/Inferencing.scala | |
parent | 0a0cb0ca1dcf8f615d3a3e79fac8dc9a62bb1397 (diff) | |
download | dotty-8d294b9b42dfcdfaee1722095d76a1c80ed9b6d5.tar.gz dotty-8d294b9b42dfcdfaee1722095d76a1c80ed9b6d5.tar.bz2 dotty-8d294b9b42dfcdfaee1722095d76a1c80ed9b6d5.zip |
Performance improvement: Cache uninstatiated typevars in constraints
Pro: Much faster to iterate through uninstantiated type variables
Con: Constraints can no longer be value classes.
Still this seems to give a net win of ~2%.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Inferencing.scala')
-rw-r--r-- | src/dotty/tools/dotc/typer/Inferencing.scala | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/typer/Inferencing.scala b/src/dotty/tools/dotc/typer/Inferencing.scala index cd30f8ff6..a8003f8c2 100644 --- a/src/dotty/tools/dotc/typer/Inferencing.scala +++ b/src/dotty/tools/dotc/typer/Inferencing.scala @@ -606,9 +606,7 @@ object Inferencing { val constraint = ctx.typerState.constraint constr.println(s"interpolate undet vars in ${tp.show}, pos = ${tree.pos}, mode = ${ctx.mode}, undets = ${constraint.uninstVars map (tvar => s"${tvar.show}@${tvar.owningTree.pos}")}") - constr.println(s"qualifying undet vars: ${constraint.uninstVars filter qualifies map (tvar => s"$tvar / ${tvar.show}")}") - constr.println(s"fulltype: $tp") // !!! DEBUG - constr.println(s"constraint: ${constraint.show}") + constr.println(s"qualifying undet vars: ${constraint.uninstVars filter qualifies map (tvar => s"$tvar / ${tvar.show}")}, constraint: ${constraint.show}") def qualifies(tvar: TypeVar) = tree contains tvar.owningTree val vs = tp.variances(tvar => (constraint contains tvar) && qualifies(tvar)) @@ -623,12 +621,11 @@ object Inferencing { if (changed) // instantiations might have uncovered new typevars to interpolate interpolateUndetVars(tree) else - constraint.foreachUninstVar { tvar => + for (tvar <- constraint.uninstVars) if (!(vs contains tvar) && qualifies(tvar)) { typr.println(s"instantiating non-occurring ${tvar.show} in ${tp.show}") tvar.instantiate(fromBelow = true) } - } } /** Instantiate undetermined type variables to that type `tp` is |