diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2015-09-24 12:59:56 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2015-09-24 12:59:56 +1000 |
commit | fd5994f39741782f8de65f0e6d36ce6344a25c3c (patch) | |
tree | 7aaca1e6f966375ad8f7e42b59ec7c696d36e91b /src/compiler | |
parent | 58a5c5a57c1ada086c4e728586537d64dca765ef (diff) | |
parent | 9d901b6598701d48091486d95c7c4e1fd286a126 (diff) | |
download | scala-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/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala | 3 |
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, |