diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2016-02-12 11:57:21 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2016-02-12 11:57:21 +1000 |
commit | a80f6a00a8519766599e5ca0db61570b7252b584 (patch) | |
tree | 9f758cc64badd074f526b040c233a01af49b95b3 /src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala | |
parent | 6d09a1ba5fffadd1d886afb66ab4496291fda3dd (diff) | |
parent | df0d105f90816960b711c35a3289ff460295d1cc (diff) | |
download | scala-a80f6a00a8519766599e5ca0db61570b7252b584.tar.gz scala-a80f6a00a8519766599e5ca0db61570b7252b584.tar.bz2 scala-a80f6a00a8519766599e5ca0db61570b7252b584.zip |
Merge pull request #4896 from retronym/topic/indy-all-the-things
Use invokedynamic for structural calls, symbol literals, lambda ser.
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala b/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala index 6d322d1a34..3617f3d863 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala @@ -1,6 +1,8 @@ package scala.tools.nsc package backend.jvm +import scala.annotation.switch +import scala.tools.asm import scala.tools.nsc.backend.jvm.BTypes.InternalName /** @@ -111,8 +113,10 @@ class CoreBTypes[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: BTFS) { lazy val jliMethodTypeRef : ClassBType = classBTypeFromSymbol(requiredClass[java.lang.invoke.MethodType]) lazy val jliCallSiteRef : ClassBType = classBTypeFromSymbol(requiredClass[java.lang.invoke.CallSite]) lazy val jliLambdaMetafactoryRef : ClassBType = classBTypeFromSymbol(requiredClass[java.lang.invoke.LambdaMetafactory]) - lazy val srLambdaDeserializerRef : ClassBType = classBTypeFromSymbol(requiredModule[scala.runtime.LambdaDeserializer.type].moduleClass) lazy val srBoxesRunTimeRef : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.BoxesRunTime]) + lazy val srSymbolLiteral : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.SymbolLiteral]) + lazy val srStructuralCallSite : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.StructuralCallSite]) + lazy val srLambdaDeserialize : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.LambdaDeserialize]) lazy val srBoxedUnitRef : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.BoxedUnit]) private def methodNameAndType(cls: Symbol, name: Name, static: Boolean = false, filterOverload: Symbol => Boolean = _ => true): MethodNameAndType = { @@ -265,6 +269,30 @@ class CoreBTypes[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: BTFS) { case _ => false }) } + + lazy val lambdaMetaFactoryBootstrapHandle = + new asm.Handle(asm.Opcodes.H_INVOKESTATIC, + coreBTypes.jliLambdaMetafactoryRef.internalName, sn.AltMetafactory.toString, + MethodBType( + List( + coreBTypes.jliMethodHandlesLookupRef, + coreBTypes.StringRef, + coreBTypes.jliMethodTypeRef, + ArrayBType(ObjectRef)), + coreBTypes.jliCallSiteRef + ).descriptor) + + lazy val lambdaDeserializeBootstrapHandle = + new scala.tools.asm.Handle(scala.tools.asm.Opcodes.H_INVOKESTATIC, + coreBTypes.srLambdaDeserialize.internalName, sn.Bootstrap.toString, + MethodBType( + List( + coreBTypes.jliMethodHandlesLookupRef, + coreBTypes.StringRef, + coreBTypes.jliMethodTypeRef + ), + coreBTypes.jliCallSiteRef + ).descriptor) } /** @@ -292,10 +320,10 @@ trait CoreBTypesProxyGlobalIndependent[BTS <: BTypes] { def jiSerializableRef : ClassBType def juHashMapRef : ClassBType def juMapRef : ClassBType + def jliCallSiteRef : ClassBType + def jliMethodTypeRef : ClassBType def jliSerializedLambdaRef : ClassBType - def jliMethodHandlesRef : ClassBType def jliMethodHandlesLookupRef : ClassBType - def srLambdaDeserializerRef : ClassBType def srBoxesRunTimeRef : ClassBType def srBoxedUnitRef : ClassBType @@ -316,6 +344,9 @@ trait CoreBTypesProxyGlobalIndependent[BTS <: BTypes] { def tupleClassConstructors : Map[InternalName, MethodNameAndType] def srJFunctionRefs: Set[InternalName] + + def lambdaMetaFactoryBootstrapHandle : asm.Handle + def lambdaDeserializeBootstrapHandle : asm.Handle } /** @@ -360,7 +391,6 @@ final class CoreBTypesProxy[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: def jliMethodTypeRef : ClassBType = _coreBTypes.jliMethodTypeRef def jliCallSiteRef : ClassBType = _coreBTypes.jliCallSiteRef def jliLambdaMetafactoryRef : ClassBType = _coreBTypes.jliLambdaMetafactoryRef - def srLambdaDeserializerRef : ClassBType = _coreBTypes.srLambdaDeserializerRef def srBoxesRunTimeRef : ClassBType = _coreBTypes.srBoxesRunTimeRef def srBoxedUnitRef : ClassBType = _coreBTypes.srBoxedUnitRef @@ -382,6 +412,10 @@ final class CoreBTypesProxy[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: def srJFunctionRefs: Set[InternalName] = _coreBTypes.srJFunctionRefs + def srSymbolLiteral : ClassBType = _coreBTypes.srSymbolLiteral + def srStructuralCallSite : ClassBType = _coreBTypes.srStructuralCallSite + def srLambdaDeserialize : ClassBType = _coreBTypes.srLambdaDeserialize + def typeOfArrayOp: Map[Int, BType] = _coreBTypes.typeOfArrayOp // Some symbols. These references should probably be moved to Definitions. @@ -394,4 +428,7 @@ final class CoreBTypesProxy[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: def BeanInfoAttr: Symbol = _coreBTypes.BeanInfoAttr def String_valueOf: Symbol = _coreBTypes.String_valueOf + + def lambdaMetaFactoryBootstrapHandle = _coreBTypes.lambdaMetaFactoryBootstrapHandle + def lambdaDeserializeBootstrapHandle = _coreBTypes.lambdaDeserializeBootstrapHandle } |