summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-09-24 12:59:56 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-09-24 12:59:56 +1000
commitfd5994f39741782f8de65f0e6d36ce6344a25c3c (patch)
tree7aaca1e6f966375ad8f7e42b59ec7c696d36e91b /src
parent58a5c5a57c1ada086c4e728586537d64dca765ef (diff)
parent9d901b6598701d48091486d95c7c4e1fd286a126 (diff)
downloadscala-fd5994f39741782f8de65f0e6d36ce6344a25c3c.tar.gz
scala-fd5994f39741782f8de65f0e6d36ce6344a25c3c.tar.bz2
scala-fd5994f39741782f8de65f0e6d36ce6344a25c3c.zip
Merge pull request #4764 from lrytz/sd-33
SD-33 Consider methods annotated @CallerSensitive not safe to inline
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala3
2 files changed, 4 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala
index 5ff356b704..65a8c45813 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala
@@ -96,6 +96,8 @@ object BytecodeUtils {
def isNativeMethod(methodNode: MethodNode): Boolean = (methodNode.access & Opcodes.ACC_NATIVE) != 0
+ def hasCallerSensitiveAnnotation(methodNode: MethodNode) = methodNode.visibleAnnotations != null && methodNode.visibleAnnotations.asScala.exists(_.desc == "Lsun/reflect/CallerSensitive;")
+
def isFinalClass(classNode: ClassNode): Boolean = (classNode.access & Opcodes.ACC_FINAL) != 0
def isFinalMethod(methodNode: MethodNode): Boolean = (methodNode.access & (Opcodes.ACC_FINAL | Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC)) != 0
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala
index 32eaf07080..a8f1e43071 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala
@@ -311,7 +311,8 @@ class CallGraph[BT <: BTypes](val btypes: BT) {
isStaticallyResolved && // (1)
!isAbstract &&
!BytecodeUtils.isConstructor(calleeMethodNode) &&
- !BytecodeUtils.isNativeMethod(calleeMethodNode),
+ !BytecodeUtils.isNativeMethod(calleeMethodNode) &&
+ !BytecodeUtils.hasCallerSensitiveAnnotation(calleeMethodNode),
safeToRewrite = canInlineFromSource && isRewritableTraitCall, // (2)
annotatedInline = methodInlineInfo.annotatedInline,
annotatedNoInline = methodInlineInfo.annotatedNoInline,