summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-10-15 10:48:23 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-10-20 21:24:59 +0200
commit48c2d7bebb6ac41a897e58bd991cfa06818c7d71 (patch)
tree33a35ec2ba3bf6b7d37deb8359dc57858b302c0c /src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala
parent6df88b024f720a10d3f7451750ab620addf725b9 (diff)
downloadscala-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.scala17
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