diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2016-04-04 16:49:48 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2016-04-07 16:42:44 +0200 |
commit | 17d97067a72b15c33a249dd201f3af452e3bb3ab (patch) | |
tree | 80bcb8858c27d9c33e6bcfff4f10f65c369ae7dc /src | |
parent | 2ed0d2ad63afc4ed9b1a95d85c0b15898ce66e2f (diff) | |
download | scala-17d97067a72b15c33a249dd201f3af452e3bb3ab.tar.gz scala-17d97067a72b15c33a249dd201f3af452e3bb3ab.tar.bz2 scala-17d97067a72b15c33a249dd201f3af452e3bb3ab.zip |
Fix InlineInfo attribute for nested module accessors
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala index 99d4390873..7786dbed7a 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala @@ -263,11 +263,13 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters { val name = methodSym.javaSimpleName.toString // same as in genDefDef val signature = name + methodSymToDescriptor(methodSym) - // Some detours are required here because of changing flags (lateDEFERRED): - // 1. Why the phase travel? Concrete trait methods obtain the lateDEFERRED flag in Mixin. - // This makes isEffectivelyFinalOrNotOverridden false, which would prevent non-final - // but non-overridden methods of sealed traits from being inlined. - val effectivelyFinal = exitingPickler(methodSym.isEffectivelyFinalOrNotOverridden) && !(methodSym.owner.isTrait && methodSym.isModule) + // In `trait T { object O }`, `oSym.isEffectivelyFinalOrNotOverridden` is true, but the + // method is abstract in bytecode, `defDef.rhs.isEmpty`. Abstract methods are excluded + // so they are not marked final in the InlineInfo attribute. + // + // However, due to https://github.com/scala/scala-dev/issues/126, this currently does not + // work, the abstract accessor for O will be marked effectivelyFinal. + val effectivelyFinal = methodSym.isEffectivelyFinalOrNotOverridden && !methodSym.isDeferred val info = MethodInlineInfo( effectivelyFinal = effectivelyFinal, |