diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt index 4a99b949f11..979ee55670b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt @@ -50,7 +50,7 @@ class AccessorForFunctionDescriptor( if (calleeDescriptor.getUserData(INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION) != null) { userDataMap = LinkedHashMap, Any>() userDataMap[INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION] = - calleeDescriptor.getUserData(INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION) + calleeDescriptor.getUserData(INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION) } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java index 2764a922a58..3e53da7413a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java @@ -232,9 +232,7 @@ public class DescriptorAsmUtil { int flags = getVisibilityAccessFlag(functionDescriptor, kind); flags |= getVarargsFlag(functionDescriptor); flags |= getDeprecatedAccessFlag(functionDescriptor); - if (deprecationResolver.isDeprecatedHidden(functionDescriptor) || - isInlineWithReified(functionDescriptor) || - functionDescriptor.isSuspend() && functionDescriptor.getVisibility().equals(DescriptorVisibilities.PRIVATE)) { + if (deprecationResolver.isDeprecatedHidden(functionDescriptor) || isInlineWithReified(functionDescriptor)) { flags |= ACC_SYNTHETIC; } return flags; @@ -427,10 +425,6 @@ public class DescriptorAsmUtil { return null; } - if (memberDescriptor instanceof FunctionDescriptor && ((FunctionDescriptor) memberDescriptor).isSuspend()) { - return NO_FLAG_PACKAGE_PRIVATE; - } - if (memberDescriptor instanceof AccessorForCompanionObjectInstanceFieldDescriptor) { return NO_FLAG_PACKAGE_PRIVATE; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt index b3ae6dc6ac2..3c664a8c983 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt @@ -721,9 +721,16 @@ class CoroutineCodegenForNamedFunction private constructor( } val isInterfaceMethod = DescriptorUtils.isInterface(suspendFunctionJvmView.containingDeclaration) + val callableAccessorMethod = + typeMapper.mapToCallableMethod( + context.accessibleDescriptor(suspendFunctionJvmView.unwrapFrontendVersion(), null), + // Obtain default impls method for interfaces + isInterfaceMethod + ) + val callableMethod = typeMapper.mapToCallableMethod( - suspendFunctionJvmView, + suspendFunctionJvmView.unwrapFrontendVersion(), // Obtain default impls method for interfaces isInterfaceMethod ) @@ -736,10 +743,10 @@ class CoroutineCodegenForNamedFunction private constructor( if (suspendFunctionJvmView.isOverridable && !isInterfaceMethod && captureThisType != null) { val owner = captureThisType.internalName - val impl = callableMethod.getAsmMethod().getImplForOpenMethod(owner) + val impl = callableAccessorMethod.getAsmMethod().getImplForOpenMethod(owner) codegen.v.invokestatic(owner, impl.name, impl.descriptor, false) } else { - callableMethod.genInvokeInstruction(codegen.v) + callableAccessorMethod.genInvokeInstruction(codegen.v) } if (inlineClassToBoxInInvokeSuspend != null) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt index 5a55189613e..3be7d1be9e6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt @@ -493,9 +493,8 @@ class KotlinTypeMapper @JvmOverloads constructor( boxInlineClassBeforeInvoke = true } else -> { - val isPrivateFunInvocation = - DescriptorVisibilities.isPrivate(functionDescriptor.visibility) && !functionDescriptor.isSuspend - invokeOpcode = if (superCall || isPrivateFunInvocation) INVOKESPECIAL else INVOKEVIRTUAL + invokeOpcode = + if (superCall || DescriptorVisibilities.isPrivate(functionDescriptor.visibility)) INVOKESPECIAL else INVOKEVIRTUAL isInterfaceMember = false } } diff --git a/compiler/testData/codegen/box/coroutines/featureIntersection/jvmDefault.kt b/compiler/testData/codegen/box/coroutines/featureIntersection/jvmDefault.kt index 543cbfe87bd..70afe7729dc 100644 --- a/compiler/testData/codegen/box/coroutines/featureIntersection/jvmDefault.kt +++ b/compiler/testData/codegen/box/coroutines/featureIntersection/jvmDefault.kt @@ -2,7 +2,6 @@ // !JVM_DEFAULT_MODE: all // TARGET_BACKEND: JVM // JVM_TARGET: 1.8 -// IGNORE_BACKEND: JVM import kotlin.coroutines.* diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/privateSuspend.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/privateSuspend.kt index f4bd316256e..6e98772e943 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/privateSuspend.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/privateSuspend.kt @@ -3,7 +3,6 @@ // JVM_TARGET: 1.8 // WITH_COROUTINES // WITH_RUNTIME -// IGNORE_BACKEND: JVM import helpers.* import kotlin.coroutines.* import kotlin.coroutines.intrinsics.* diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor.txt b/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor.txt index b7dd9b3abfc..83ec3e82d00 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor.txt @@ -1,6 +1,6 @@ @kotlin.Metadata public final class PrivateAccessorKt { // source: 'privateAccessor.kt' - synthetic final static method bar(p0: kotlin.coroutines.Continuation): java.lang.Object + private final static method bar(p0: kotlin.coroutines.Continuation): java.lang.Object private final static method foo(): void } diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/privateSuspendFun.txt b/compiler/testData/codegen/bytecodeListing/coroutines/privateSuspendFun.txt index 34b3572a797..77213ee9d05 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/privateSuspendFun.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/privateSuspendFun.txt @@ -2,11 +2,11 @@ public final class A { // source: 'privateSuspendFun.kt' public method (): void - synthetic final method foo(p0: java.lang.Object): java.lang.Object + private final method foo(p0: java.lang.Object): java.lang.Object } @kotlin.Metadata public final class PrivateSuspendFunKt { // source: 'privateSuspendFun.kt' - synthetic final static method foo(p0: java.lang.Object): java.lang.Object + private final static method foo(p0: java.lang.Object): java.lang.Object } diff --git a/compiler/testData/codegen/bytecodeListing/inline/simpleNamed.txt b/compiler/testData/codegen/bytecodeListing/inline/simpleNamed.txt index 29a548af43a..24019d1f771 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/simpleNamed.txt +++ b/compiler/testData/codegen/bytecodeListing/inline/simpleNamed.txt @@ -10,7 +10,7 @@ public final class Foo { public final @org.jetbrains.annotations.Nullable method generic(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object public synthetic final method genericWithReified(p0: java.lang.Object, p1: kotlin.coroutines.Continuation): java.lang.Object public synthetic final method genericWithReified(p0: kotlin.coroutines.Continuation): java.lang.Object - private synthetic final method privateInline(p0: kotlin.coroutines.Continuation): java.lang.Object + private final method privateInline(p0: kotlin.coroutines.Continuation): java.lang.Object private final @kotlin.internal.InlineOnly method shouldNotHaveSuffix(p0: kotlin.coroutines.Continuation): java.lang.Object private final @org.jetbrains.annotations.Nullable method simple$$forInline(@org.jetbrains.annotations.NotNull p0: kotlin.Unit, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object private final @org.jetbrains.annotations.Nullable method simple$$forInline(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object @@ -29,7 +29,7 @@ public final class SimpleNamedKt { public final static @org.jetbrains.annotations.Nullable method generic(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object public synthetic final static method genericWithReified(p0: java.lang.Object, p1: kotlin.coroutines.Continuation): java.lang.Object public synthetic final static method genericWithReified(p0: kotlin.coroutines.Continuation): java.lang.Object - private synthetic final static method privateInline(p0: kotlin.coroutines.Continuation): java.lang.Object + private final static method privateInline(p0: kotlin.coroutines.Continuation): java.lang.Object private final static @kotlin.internal.InlineOnly method shouldNotHaveSuffix(p0: kotlin.coroutines.Continuation): java.lang.Object private final static @org.jetbrains.annotations.Nullable method simple$$forInline(@org.jetbrains.annotations.NotNull p0: kotlin.Unit, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object private final static @org.jetbrains.annotations.Nullable method simple$$forInline(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object