diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2015-10-13 09:52:08 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2015-10-20 15:59:03 +0200 |
commit | 62be5705b91cb233bf922021f102a08bccc95af5 (patch) | |
tree | 684f42edc5e42319910f1e6d4b98a4192e5fbaa1 /src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala | |
parent | 19ee72193b6d3d4b1dc1e3bba430d3d741db97e3 (diff) | |
download | scala-62be5705b91cb233bf922021f102a08bccc95af5.tar.gz scala-62be5705b91cb233bf922021f102a08bccc95af5.tar.bz2 scala-62be5705b91cb233bf922021f102a08bccc95af5.zip |
Allow @inline/noinline at callsites (in addition to def-site)
Allow annotating individual callsites @inline / @noinline using an
annotation ascription
c.foo(): @inline
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala index a42332f7f2..c4eb6e1b42 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala @@ -16,6 +16,7 @@ import java.lang.invoke.LambdaMetafactory import scala.tools.asm import GenBCode._ import BackendReporting._ +import scala.tools.asm.tree.MethodInsnNode /* * @@ -706,6 +707,21 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder { } else { genCallMethod(sym, invokeStyle, app.pos, hostClass) + // Check if the Apply tree has an InlineAnnotatedAttachment, added by the typer + // for callsites marked `f(): @inline/noinline`. For nullary calls, the attachment + // is on the Select node (not on the Apply node added by UnCurry). + def checkInlineAnnotated(t: Tree): Unit = { + if (t.hasAttachment[InlineAnnotatedAttachment]) bc.jmethod.instructions.getLast match { + case m: MethodInsnNode => + if (app.hasAttachment[NoInlineCallsiteAttachment.type]) noInlineAnnotatedCallsites += m + else inlineAnnotatedCallsites += m + case _ => + } else t match { + case Apply(fun, _) => checkInlineAnnotated(fun) + case _ => + } + } + checkInlineAnnotated(app) } } // end of genNormalMethodCall() |