summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2016-03-30 14:02:26 -0700
committerAdriaan Moors <adriaan.moors@typesafe.com>2016-03-30 14:23:46 -0700
commit7025be9a468419ca6076d78f8da32c6a667fc829 (patch)
treee6ed17b36b80172d9572c0f40163ece1c07327d1 /src/compiler/scala/tools
parentaec2b940cfa04843efe2eab00272557823fd8dd2 (diff)
downloadscala-7025be9a468419ca6076d78f8da32c6a667fc829.tar.gz
scala-7025be9a468419ca6076d78f8da32c6a667fc829.tar.bz2
scala-7025be9a468419ca6076d78f8da32c6a667fc829.zip
Bring back AbstractFunction parent
Jason points out we still need it for bytecode efficiency, due to mixin forwarders.
Diffstat (limited to 'src/compiler/scala/tools')
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreeGen.scala6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
index 227d395036..0786ceb7c2 100644
--- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
@@ -310,9 +310,13 @@ abstract class TreeGen extends scala.reflect.internal.TreeGen with TreeDSL {
newDefDef(methSym, moveToMethod(useMethodParams(fun.body)))(tpt = TypeTree(resTp))
}
+ // TODO: the rewrite to AbstractFunction is superfluous once we compile FunctionN to a SAM type (aka functional interface)
+ def functionClassType(fun: Function): Type =
+ if (isFunctionType(fun.tpe)) abstractFunctionType(fun.vparams.map(_.symbol.tpe), fun.body.tpe.deconst)
+ else fun.tpe
def expandFunction(localTyper: analyzer.Typer)(fun: Function, inConstructorFlag: Long): Tree = {
- val parents = addSerializable(fun.tpe)
+ val parents = addSerializable(functionClassType(fun))
val anonClass = fun.symbol.owner newAnonymousFunctionClass(fun.pos, inConstructorFlag) addAnnotation SerialVersionUIDAnnotation
// The original owner is used in the backend for the EnclosingMethod attribute. If fun is