diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2015-10-15 10:48:23 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2015-10-20 21:24:59 +0200 |
commit | 48c2d7bebb6ac41a897e58bd991cfa06818c7d71 (patch) | |
tree | 33a35ec2ba3bf6b7d37deb8359dc57858b302c0c /src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala | |
parent | 6df88b024f720a10d3f7451750ab620addf725b9 (diff) | |
download | scala-48c2d7bebb6ac41a897e58bd991cfa06818c7d71.tar.gz scala-48c2d7bebb6ac41a897e58bd991cfa06818c7d71.tar.bz2 scala-48c2d7bebb6ac41a897e58bd991cfa06818c7d71.zip |
Simplify and correctify calculation of the InnerClass attribute
The InnerClass attribute needs to contain an entry for every nested
class that is defined or referenced in a class. Details are in a
doc comment in BTypes.scala.
Instead of collecting ClassBTypes of nested classes into a hash map
during code generation, traverse the class before writing it out to
disk. The previous approach was incorrect as soon as the generated
bytecode was modified by the optimzier (DCE, inlining).
Fixes https://github.com/scala/scala-dev/issues/21.
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala index e1a724f1cb..35e4db33bc 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala @@ -245,6 +245,11 @@ abstract class GenBCode extends BCodeSyncAndTry { BackendStats.timed(BackendStats.methodOptTimer)(localOpt.methodOptimizations(classNode)) } + def setInnerClasses(classNode: ClassNode): Unit = if (classNode != null) { + classNode.innerClasses.clear() + addInnerClasses(classNode, bTypes.backendUtils.collectNestedClasses(classNode)) + } + def run() { runGlobalOptimizations() @@ -257,6 +262,9 @@ abstract class GenBCode extends BCodeSyncAndTry { else { try { localOptimizations(item.plain) + setInnerClasses(item.plain) + setInnerClasses(item.mirror) + setInnerClasses(item.bean) addToQ3(item) } catch { case e: java.lang.RuntimeException if e.getMessage != null && (e.getMessage contains "too large!") => |