diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2012-11-03 13:34:20 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2012-11-03 23:25:13 +0100 |
commit | dad886659faca4fba2d4937c9bc6780591b02c27 (patch) | |
tree | 0fcb5ab4e20c6570bd15cf773c9ec9d1d74f7e81 /src/reflect/scala/reflect/internal/TreeInfo.scala | |
parent | b5e3eafabe4b9cfe1e6de9eeedfe1140afeaa4eb (diff) | |
download | scala-dad886659faca4fba2d4937c9bc6780591b02c27.tar.gz scala-dad886659faca4fba2d4937c9bc6780591b02c27.tar.bz2 scala-dad886659faca4fba2d4937c9bc6780591b02c27.zip |
SI-6611 Tighten up an unsafe array optimization
The net was cast too wide and was unsafely optimizing away array
copies.
Diffstat (limited to 'src/reflect/scala/reflect/internal/TreeInfo.scala')
-rw-r--r-- | src/reflect/scala/reflect/internal/TreeInfo.scala | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/TreeInfo.scala b/src/reflect/scala/reflect/internal/TreeInfo.scala index 66326c90e9..bee92b446b 100644 --- a/src/reflect/scala/reflect/internal/TreeInfo.scala +++ b/src/reflect/scala/reflect/internal/TreeInfo.scala @@ -265,6 +265,20 @@ abstract class TreeInfo { tree } + /** Strips layers of `.asInstanceOf[T]` / `_.$asInstanceOf[T]()` from an expression */ + def stripCast(tree: Tree): Tree = tree match { + case TypeApply(sel @ Select(inner, _), _) if isCastSymbol(sel.symbol) => + stripCast(inner) + case Apply(TypeApply(sel @ Select(inner, _), _), Nil) if isCastSymbol(sel.symbol) => + stripCast(inner) + case t => + t + } + + object StripCast { + def unapply(tree: Tree): Some[Tree] = Some(stripCast(tree)) + } + /** Is tree a self or super constructor call? */ def isSelfOrSuperConstrCall(tree: Tree) = { // stripNamedApply for SI-3584: adaptToImplicitMethod in Typers creates a special context |