summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2013-07-03 14:27:25 -0700
committerAdriaan Moors <adriaan.moors@typesafe.com>2013-07-03 14:27:25 -0700
commitdcdf85e183cb7ba554a7fc22ad783ca55ecf50dd (patch)
tree8a406c2b92aed45c8586cc5c7873c46daeaa0fc9 /src/compiler/scala/tools/nsc/backend
parent67cff1027738ec2818e9c3d98de3b2b8849fcc39 (diff)
parent1c69dbcead1d4b1d5033d316d1c0468e46b310b3 (diff)
downloadscala-dcdf85e183cb7ba554a7fc22ad783ca55ecf50dd.tar.gz
scala-dcdf85e183cb7ba554a7fc22ad783ca55ecf50dd.tar.bz2
scala-dcdf85e183cb7ba554a7fc22ad783ca55ecf50dd.zip
Merge pull request #2660 from retronym/ticket/7582
SI-7582 Only inline accessible calls to package-private Java code
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend')
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/Inliners.scala15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
index a6eedbd07e..56191cc981 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
@@ -679,9 +679,18 @@ abstract class Inliners extends SubComponent {
}
*/
- def checkField(f: Symbol) = check(f, f.isPrivate && !canMakePublic(f))
- def checkSuper(n: Symbol) = check(n, n.isPrivate || !n.isClassConstructor)
- def checkMethod(n: Symbol) = check(n, n.isPrivate)
+
+ def isPrivateForInlining(sym: Symbol): Boolean = {
+ if (sym.isJavaDefined) {
+ def check(sym: Symbol) = !(sym.isPublic || sym.isProtected)
+ check(sym) || check(sym.owner) // SI-7582 Must check the enclosing class *and* the symbol for Java.
+ }
+ else sym.isPrivate // Scala never emits package-private bytecode
+ }
+
+ def checkField(f: Symbol) = check(f, isPrivateForInlining(f) && !canMakePublic(f))
+ def checkSuper(n: Symbol) = check(n, isPrivateForInlining(n) || !n.isClassConstructor)
+ def checkMethod(n: Symbol) = check(n, isPrivateForInlining(n))
def getAccess(i: Instruction) = i match {
case CALL_METHOD(n, SuperCall(_)) => checkSuper(n)