summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-08-26 17:15:18 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-09-17 20:16:14 +0200
commit89c0a7f0a320e898f360c7c94b1ad0bbce681b3a (patch)
tree6b3e9196b6562be22d236214a6bebb5a4d99e174 /src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala
parentda8f263208f8934650d3900793a4115ff1751310 (diff)
downloadscala-89c0a7f0a320e898f360c7c94b1ad0bbce681b3a.tar.gz
scala-89c0a7f0a320e898f360c7c94b1ad0bbce681b3a.tar.bz2
scala-89c0a7f0a320e898f360c7c94b1ad0bbce681b3a.zip
Store information about function literals in call graph
Remember in the call graph if a function literal is passed as an argument to a higher-order function.
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala
index ba6897b06e..70e203aac1 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala
@@ -9,6 +9,7 @@ package opt
import scala.annotation.switch
import scala.collection.immutable
+import scala.collection.immutable.IntMap
import scala.reflect.internal.util.NoPosition
import scala.tools.asm.{Type, Opcodes}
import scala.tools.asm.tree._
@@ -235,24 +236,25 @@ class ClosureOptimizer[BT <: BTypes](val btypes: BT) {
// the method node is needed for building the call graph entry
val bodyMethod = byteCodeRepository.methodNode(lambdaBodyHandle.getOwner, lambdaBodyHandle.getName, lambdaBodyHandle.getDesc)
def bodyMethodIsBeingCompiled = byteCodeRepository.classNodeAndSource(lambdaBodyHandle.getOwner).map(_._2 == CompilationUnit).getOrElse(false)
+ val callee = bodyMethod.map({
+ case (bodyMethodNode, bodyMethodDeclClass) =>
+ val bodyDeclClassType = classBTypeFromParsedClassfile(bodyMethodDeclClass)
+ Callee(
+ callee = bodyMethodNode,
+ calleeDeclarationClass = bodyDeclClassType,
+ safeToInline = compilerSettings.YoptInlineGlobal || bodyMethodIsBeingCompiled,
+ safeToRewrite = false, // the lambda body method is not a trait interface method
+ annotatedInline = false,
+ annotatedNoInline = false,
+ inliner.heuristics.higherOrderParams(bodyMethodNode, bodyDeclClassType),
+ calleeInfoWarning = None)
+ })
val bodyMethodCallsite = Callsite(
callsiteInstruction = bodyInvocation,
callsiteMethod = ownerMethod,
callsiteClass = closureInit.ownerClass,
- callee = bodyMethod.map({
- case (bodyMethodNode, bodyMethodDeclClass) =>
- val bodyDeclClassType = classBTypeFromParsedClassfile(bodyMethodDeclClass)
- Callee(
- callee = bodyMethodNode,
- calleeDeclarationClass = bodyDeclClassType,
- safeToInline = compilerSettings.YoptInlineGlobal || bodyMethodIsBeingCompiled,
- safeToRewrite = false, // the lambda body method is not a trait interface method
- annotatedInline = false,
- annotatedNoInline = false,
- inliner.heuristics.higherOrderParams(bodyMethodNode, bodyDeclClassType),
- calleeInfoWarning = None)
- }),
- argInfos = Nil,
+ callee = callee,
+ argInfos = computeArgInfos(callee, bodyInvocation, ownerMethod, closureInit.ownerClass),
callsiteStackHeight = invocationStackHeight,
receiverKnownNotNull = true, // see below (*)
callsitePosition = originalCallsite.map(_.callsitePosition).getOrElse(NoPosition)