Replace JvmTarget with GenerationState in DescriptorBasedFunctionHandleForJvm

This commit is contained in:
Denis Zharkov
2018-12-21 10:31:15 +03:00
parent 254380d418
commit cd51658976
4 changed files with 25 additions and 24 deletions
@@ -1057,14 +1057,14 @@ public class FunctionCodegen {
private boolean hasSpecialBridgeMethod(@NotNull FunctionDescriptor descriptor) { private boolean hasSpecialBridgeMethod(@NotNull FunctionDescriptor descriptor) {
if (SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(descriptor) == null) return false; if (SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(descriptor) == null) return false;
return !BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial( return !BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial(
descriptor, typeMapper::mapAsmMethod, state.getTarget() descriptor, typeMapper::mapAsmMethod, state
).isEmpty(); ).isEmpty();
} }
public void generateBridges(@NotNull FunctionDescriptor descriptor) { public void generateBridges(@NotNull FunctionDescriptor descriptor) {
if (descriptor instanceof ConstructorDescriptor) return; if (descriptor instanceof ConstructorDescriptor) return;
if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS) return; if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS) return;
if (JvmBridgesImplKt.isAbstractOnJvmIgnoringActualModality(state.getTarget(), descriptor)) return; if (JvmBridgesImplKt.isAbstractOnJvmIgnoringActualModality(state, descriptor)) return;
// equals(Any?), hashCode(), toString() never need bridges // equals(Any?), hashCode(), toString() never need bridges
if (isMethodOfAny(descriptor)) return; if (isMethodOfAny(descriptor)) return;
@@ -1074,7 +1074,7 @@ public class FunctionCodegen {
Set<Bridge<Method>> bridgesToGenerate; Set<Bridge<Method>> bridgesToGenerate;
if (!isSpecial) { if (!isSpecial) {
bridgesToGenerate = bridgesToGenerate =
JvmBridgesImplKt.generateBridgesForFunctionDescriptorForJvm(descriptor, typeMapper::mapAsmMethod, state.getTarget()); JvmBridgesImplKt.generateBridgesForFunctionDescriptorForJvm(descriptor, typeMapper::mapAsmMethod, state);
if (!bridgesToGenerate.isEmpty()) { if (!bridgesToGenerate.isEmpty()) {
PsiElement origin = descriptor.getKind() == DECLARATION ? getSourceFromDescriptor(descriptor) : null; PsiElement origin = descriptor.getKind() == DECLARATION ? getSourceFromDescriptor(descriptor) : null;
boolean isSpecialBridge = boolean isSpecialBridge =
@@ -1087,7 +1087,7 @@ public class FunctionCodegen {
} }
else { else {
Set<BridgeForBuiltinSpecial<Method>> specials = BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial( Set<BridgeForBuiltinSpecial<Method>> specials = BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial(
descriptor, typeMapper::mapAsmMethod, state.getTarget() descriptor, typeMapper::mapAsmMethod, state
); );
if (!specials.isEmpty()) { if (!specials.isEmpty()) {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.codegen package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.backend.common.bridges.* import org.jetbrains.kotlin.backend.common.bridges.*
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
@@ -15,10 +16,10 @@ import org.jetbrains.kotlin.resolve.jvm.annotations.hasPlatformDependentAnnotati
class DescriptorBasedFunctionHandleForJvm( class DescriptorBasedFunctionHandleForJvm(
descriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
private val jvmTarget: JvmTarget private val state: GenerationState
) : DescriptorBasedFunctionHandle(descriptor) { ) : DescriptorBasedFunctionHandle(descriptor) {
override fun createHandleForOverridden(overridden: FunctionDescriptor) = override fun createHandleForOverridden(overridden: FunctionDescriptor) =
DescriptorBasedFunctionHandleForJvm(overridden, jvmTarget) DescriptorBasedFunctionHandleForJvm(overridden, state)
/* /*
For @JvmDefault JVM members they are placed in interface classes and For @JvmDefault JVM members they are placed in interface classes and
@@ -26,7 +27,7 @@ class DescriptorBasedFunctionHandleForJvm(
For non-@JvmDefault interfaces function, its body is generated in a separate place (DefaultImpls) and For non-@JvmDefault interfaces function, its body is generated in a separate place (DefaultImpls) and
the method in the interface is abstract so we must not generate bridges for such cases. the method in the interface is abstract so we must not generate bridges for such cases.
*/ */
override val isAbstract: Boolean = super.isAbstract || isAbstractOnJvmIgnoringActualModality(jvmTarget, descriptor) override val isAbstract: Boolean = super.isAbstract || isAbstractOnJvmIgnoringActualModality(state, descriptor)
override val mayBeUsedAsSuperImplementation: Boolean = override val mayBeUsedAsSuperImplementation: Boolean =
super.mayBeUsedAsSuperImplementation || descriptor.isJvmDefaultOrPlatformDependent() super.mayBeUsedAsSuperImplementation || descriptor.isJvmDefaultOrPlatformDependent()
@@ -48,9 +49,9 @@ private fun needToGenerateDelegationToDefaultImpls(descriptor: FunctionDescripto
/** /**
* @return return true for interface method not annotated with @JvmDefault or @PlatformDependent * @return return true for interface method not annotated with @JvmDefault or @PlatformDependent
*/ */
fun isAbstractOnJvmIgnoringActualModality(jvmTarget: JvmTarget, descriptor: FunctionDescriptor): Boolean { fun isAbstractOnJvmIgnoringActualModality(state: GenerationState, descriptor: FunctionDescriptor): Boolean {
if (!DescriptorUtils.isInterface(descriptor.containingDeclaration)) return false if (!DescriptorUtils.isInterface(descriptor.containingDeclaration)) return false
if (jvmTarget == JvmTarget.JVM_1_6) return true if (state.target == JvmTarget.JVM_1_6) return true
return !descriptor.isJvmDefaultOrPlatformDependent() return !descriptor.isJvmDefaultOrPlatformDependent()
} }
@@ -58,7 +59,7 @@ fun isAbstractOnJvmIgnoringActualModality(jvmTarget: JvmTarget, descriptor: Func
fun <Signature> generateBridgesForFunctionDescriptorForJvm( fun <Signature> generateBridgesForFunctionDescriptorForJvm(
descriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
signature: (FunctionDescriptor) -> Signature, signature: (FunctionDescriptor) -> Signature,
jvmTarget: JvmTarget state: GenerationState
): Set<Bridge<Signature>> { ): Set<Bridge<Signature>> {
return generateBridges(DescriptorBasedFunctionHandleForJvm(descriptor, jvmTarget)) { signature(it.descriptor) } return generateBridges(DescriptorBasedFunctionHandleForJvm(descriptor, state)) { signature(it.descriptor) }
} }
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.backend.common.bridges.findAllReachableDeclarations import org.jetbrains.kotlin.backend.common.bridges.findAllReachableDeclarations
import org.jetbrains.kotlin.backend.common.bridges.findConcreteSuperDeclaration import org.jetbrains.kotlin.backend.common.bridges.findConcreteSuperDeclaration
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
@@ -47,14 +47,14 @@ object BuiltinSpecialBridgesUtil {
fun <Signature : Any> generateBridgesForBuiltinSpecial( fun <Signature : Any> generateBridgesForBuiltinSpecial(
function: FunctionDescriptor, function: FunctionDescriptor,
signatureByDescriptor: (FunctionDescriptor) -> Signature, signatureByDescriptor: (FunctionDescriptor) -> Signature,
jvmTarget: JvmTarget state: GenerationState
): Set<BridgeForBuiltinSpecial<Signature>> { ): Set<BridgeForBuiltinSpecial<Signature>> {
val functionHandle = DescriptorBasedFunctionHandleForJvm(function, jvmTarget) val functionHandle = DescriptorBasedFunctionHandleForJvm(function, state)
val fake = !functionHandle.isDeclaration val fake = !functionHandle.isDeclaration
val overriddenBuiltin = function.getOverriddenBuiltinReflectingJvmDescriptor()!! val overriddenBuiltin = function.getOverriddenBuiltinReflectingJvmDescriptor()!!
val reachableDeclarations = findAllReachableDeclarations(function, jvmTarget) val reachableDeclarations = findAllReachableDeclarations(function, state)
// e.g. `getSize()I` // e.g. `getSize()I`
val methodItself = signatureByDescriptor(function) val methodItself = signatureByDescriptor(function)
@@ -78,11 +78,11 @@ object BuiltinSpecialBridgesUtil {
if (fake) { if (fake) {
for (overridden in function.overriddenDescriptors.map { it.original }) { for (overridden in function.overriddenDescriptors.map { it.original }) {
if (!DescriptorBasedFunctionHandleForJvm(overridden, jvmTarget).isAbstract) { if (!DescriptorBasedFunctionHandleForJvm(overridden, state).isAbstract) {
commonBridges.removeAll( commonBridges.removeAll(
findAllReachableDeclarations( findAllReachableDeclarations(
overridden, overridden,
jvmTarget state
).map(signatureByDescriptor) ).map(signatureByDescriptor)
) )
} }
@@ -93,7 +93,7 @@ object BuiltinSpecialBridgesUtil {
val superImplementationDescriptor = val superImplementationDescriptor =
if (specialBridge != null && fake && !functionHandle.isAbstract) if (specialBridge != null && fake && !functionHandle.isAbstract)
findSuperImplementationForStubDelegation(function, jvmTarget, signatureByDescriptor) findSuperImplementationForStubDelegation(function, state, signatureByDescriptor)
else else
null null
@@ -150,10 +150,10 @@ object BuiltinSpecialBridgesUtil {
*/ */
private fun <Signature> findSuperImplementationForStubDelegation( private fun <Signature> findSuperImplementationForStubDelegation(
function: FunctionDescriptor, function: FunctionDescriptor,
jvmTarget: JvmTarget, state: GenerationState,
signatureByDescriptor: (FunctionDescriptor) -> Signature signatureByDescriptor: (FunctionDescriptor) -> Signature
): FunctionDescriptor? { ): FunctionDescriptor? {
val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandleForJvm(function, jvmTarget)) val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandleForJvm(function, state))
// Implementation from interface will be generated by common mechanism // Implementation from interface will be generated by common mechanism
if (!implementation.mayBeUsedAsSuperImplementation) return null if (!implementation.mayBeUsedAsSuperImplementation) return null
@@ -170,12 +170,12 @@ private fun <Signature> findSuperImplementationForStubDelegation(
private fun findAllReachableDeclarations( private fun findAllReachableDeclarations(
functionDescriptor: FunctionDescriptor, functionDescriptor: FunctionDescriptor,
jvmTarget: JvmTarget state: GenerationState
): MutableSet<FunctionDescriptor> = ): MutableSet<FunctionDescriptor> =
findAllReachableDeclarations( findAllReachableDeclarations(
DescriptorBasedFunctionHandleForJvm( DescriptorBasedFunctionHandleForJvm(
functionDescriptor, functionDescriptor,
jvmTarget state
) )
).map { it.descriptor }.toMutableSet() ).map { it.descriptor }.toMutableSet()
@@ -115,7 +115,7 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
bridgesToGenerate = generateBridgesForFunctionDescriptorForJvm( bridgesToGenerate = generateBridgesForFunctionDescriptorForJvm(
descriptor, descriptor,
getSignatureMapper(typeMapper), getSignatureMapper(typeMapper),
state.target state
) )
if (!bridgesToGenerate.isEmpty()) { if (!bridgesToGenerate.isEmpty()) {
val origin = if (descriptor.kind == DECLARATION) getSourceFromDescriptor(descriptor) else null val origin = if (descriptor.kind == DECLARATION) getSourceFromDescriptor(descriptor) else null
@@ -130,7 +130,7 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
val specials = BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial( val specials = BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial(
descriptor, descriptor,
getSignatureMapper(typeMapper), getSignatureMapper(typeMapper),
state.target state
) )
if (!specials.isEmpty()) { if (!specials.isEmpty()) {