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/CoreBTypes.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/CoreBTypes.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala b/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala index 48e43c74f4..8d55b9952e 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala @@ -29,7 +29,7 @@ import scala.annotation.switch class CoreBTypes[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: BTFS) { import bTypes._ import global._ - import rootMirror.{requiredClass, getClassIfDefined} + import rootMirror.{requiredClass, requiredModule, getClassIfDefined} import definitions._ /** @@ -116,6 +116,11 @@ class CoreBTypes[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: BTFS) { lazy val classCastExceptionReference : ClassBType = classBTypeFromSymbol(ClassCastExceptionClass) // java/lang/ClassCastException lazy val javaUtilMapReference : ClassBType = classBTypeFromSymbol(JavaUtilMap) // java/util/Map lazy val javaUtilHashMapReference : ClassBType = classBTypeFromSymbol(JavaUtilHashMap) // java/util/HashMap + lazy val ScalaBeanInfoReference : ClassBType = classBTypeFromSymbol(requiredClass[scala.beans.ScalaBeanInfo]) + lazy val jliSerializedLambda : ClassBType = classBTypeFromSymbol(requiredClass[java.lang.invoke.SerializedLambda]) + lazy val jliMethodHandles : ClassBType = classBTypeFromSymbol(requiredClass[java.lang.invoke.MethodHandles]) + lazy val jliMethodHandlesLookup : ClassBType = classBTypeFromSymbol(exitingPickler(rootMirror.getRequiredClass("java.lang.invoke.MethodHandles.Lookup"))) + lazy val srLambdaDeserializer : ClassBType = classBTypeFromSymbol(requiredModule[scala.runtime.LambdaDeserializer.type].moduleClass) lazy val srBooleanRef : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.BooleanRef]) lazy val srByteRef : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.ByteRef]) @@ -214,6 +219,11 @@ trait CoreBTypesProxyGlobalIndependent[BTS <: BTypes] { def jioSerializableReference: ClassBType def javaUtilHashMapReference: ClassBType def javaUtilMapReference : ClassBType + + def jliSerializedLambda : ClassBType + def jliMethodHandles : ClassBType + def jliMethodHandlesLookup : ClassBType + def srLambdaDeserializer : ClassBType } /** @@ -264,6 +274,11 @@ final class CoreBTypesProxy[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: def classCastExceptionReference : ClassBType = _coreBTypes.classCastExceptionReference def javaUtilMapReference : ClassBType = _coreBTypes.javaUtilMapReference def javaUtilHashMapReference : ClassBType = _coreBTypes.javaUtilHashMapReference + def ScalaBeanInfoReference : ClassBType = _coreBTypes.ScalaBeanInfoReference + def jliSerializedLambda : ClassBType = _coreBTypes.jliSerializedLambda + def jliMethodHandles : ClassBType = _coreBTypes.jliMethodHandles + def jliMethodHandlesLookup : ClassBType = _coreBTypes.jliMethodHandlesLookup + def srLambdaDeserializer : ClassBType = _coreBTypes.srLambdaDeserializer def srBooleanRef : ClassBType = _coreBTypes.srBooleanRef def srByteRef : ClassBType = _coreBTypes.srByteRef |