summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-10-13 09:52:08 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-10-20 15:59:03 +0200
commit62be5705b91cb233bf922021f102a08bccc95af5 (patch)
tree684f42edc5e42319910f1e6d4b98a4192e5fbaa1 /src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
parent19ee72193b6d3d4b1dc1e3bba430d3d741db97e3 (diff)
downloadscala-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.scala16
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()