diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2015-08-26 17:15:18 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2015-09-17 20:16:14 +0200 |
commit | 89c0a7f0a320e898f360c7c94b1ad0bbce681b3a (patch) | |
tree | 6b3e9196b6562be22d236214a6bebb5a4d99e174 /src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala | |
parent | da8f263208f8934650d3900793a4115ff1751310 (diff) | |
download | scala-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.scala | 30 |
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) |