summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2013-03-17 22:02:34 -0700
committerAdriaan Moors <adriaan.moors@typesafe.com>2013-03-17 22:02:34 -0700
commit144671eb943dc689e555ddc50d0d4c045182b6c8 (patch)
tree1d0a9d6abd6e3d63e3b6ee8363a3c00bae8c7612
parent752aa52207bf0e29baeccf2ac369e80f257821b1 (diff)
parent552b6234dbbb4ff1e971e2c0f87ecd4090dd36a5 (diff)
downloadscala-144671eb943dc689e555ddc50d0d4c045182b6c8.tar.gz
scala-144671eb943dc689e555ddc50d0d4c045182b6c8.tar.bz2
scala-144671eb943dc689e555ddc50d0d4c045182b6c8.zip
Merge pull request #2255 from retronym/ticket/7249
SI-7249 Reign in overzealous Function0 optimization.
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala6
-rw-r--r--test/files/run/t7249.check1
-rw-r--r--test/files/run/t7249.scala7
3 files changed, 13 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index e9f403aea0..66328e23bb 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -492,10 +492,14 @@ abstract class UnCurry extends InfoTransform
}
else {
log(s"Argument '$arg' at line ${arg.pos.safeLine} is $formal from ${fun.fullName}")
+ def canUseDirectly(recv: Tree) = (
+ recv.tpe.typeSymbol.isSubClass(FunctionClass(0))
+ && treeInfo.isExprSafeToInline(recv)
+ )
arg match {
// don't add a thunk for by-name argument if argument already is an application of
// a Function0. We can then remove the application and use the existing Function0.
- case Apply(Select(recv, nme.apply), Nil) if recv.tpe.typeSymbol isSubClass FunctionClass(0) =>
+ case Apply(Select(recv, nme.apply), Nil) if canUseDirectly(recv) =>
recv
case _ =>
newFunction0(arg)
diff --git a/test/files/run/t7249.check b/test/files/run/t7249.check
new file mode 100644
index 0000000000..7777e0a5a2
--- /dev/null
+++ b/test/files/run/t7249.check
@@ -0,0 +1 @@
+Yup!
diff --git a/test/files/run/t7249.scala b/test/files/run/t7249.scala
new file mode 100644
index 0000000000..375df5c3ad
--- /dev/null
+++ b/test/files/run/t7249.scala
@@ -0,0 +1,7 @@
+object Test extends App {
+ def bnToLambda(s: => String): () => String = () => s
+ var x: () => String = () => sys.error("Nope")
+ val y = bnToLambda { x() }
+ x = () => "Yup!"
+ println(y())
+}