From bc4a7aec76124c131b817ae1942799fa514ceb89 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Fri, 6 Jul 2018 19:06:54 +0300 Subject: [PATCH] Remove suspendCoroutineOrReturn intrinsic from compiler #KT-21240: Fixed Also, change logic of intrinsics check. #KT-23438: Fixed --- .../kotlin/backend/common/CodegenUtil.kt | 23 +++++----- .../common/commonCoroutineCodegenUtil.kt | 44 +++---------------- .../kotlin/codegen/AssertCodegenUtil.kt | 1 + .../kotlin/codegen/RangeCodegenUtil.kt | 9 +--- .../coroutines/coroutineCodegenUtil.kt | 43 +----------------- .../kotlin/codegen/inline/InlineCodegen.kt | 5 --- .../jetbrains/kotlin/js/inline/JsInliner.java | 2 +- .../reference/CallArgumentTranslator.kt | 8 +--- 8 files changed, 21 insertions(+), 114 deletions(-) diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt index c14dd4d8b21..9cb95405fe6 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.backend.common @@ -220,3 +209,11 @@ object CodegenUtil { return descriptor.valueParameters } } + +fun DeclarationDescriptor.isTopLevelInPackage(name: String, packageName: String): Boolean { + if (name != this.name.asString()) return false + + val containingDeclaration = containingDeclaration as? PackageFragmentDescriptor ?: return false + val packageFqName = containingDeclaration.fqName.asString() + return packageName == packageFqName +} \ No newline at end of file diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/commonCoroutineCodegenUtil.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/commonCoroutineCodegenUtil.kt index 87a51976e7d..9ee80210814 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/commonCoroutineCodegenUtil.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/commonCoroutineCodegenUtil.kt @@ -7,48 +7,16 @@ package org.jetbrains.kotlin.backend.common import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.coroutinesIntrinsicsPackageFqName -import org.jetbrains.kotlin.config.isReleaseCoroutines -import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.DescriptorEquivalenceForOverrides -import org.jetbrains.kotlin.resolve.descriptorUtil.module -val SUSPEND_COROUTINE_OR_RETURN_NAME = Name.identifier("suspendCoroutineOrReturn") -val INTERCEPTED_NAME = Name.identifier("intercepted") val COROUTINE_SUSPENDED_NAME = Name.identifier("COROUTINE_SUSPENDED") -val SUSPEND_COROUTINE_UNINTERCEPTED_OR_RETURN_NAME = Name.identifier("suspendCoroutineUninterceptedOrReturn") +fun FunctionDescriptor.isBuiltInIntercepted(languageVersionSettings: LanguageVersionSettings): Boolean = + isTopLevelInPackage("intercepted", languageVersionSettings.coroutinesIntrinsicsPackageFqName().asString()) -fun FunctionDescriptor.isBuiltInIntercepted(languageVersionSettings: LanguageVersionSettings): Boolean { - if (name != INTERCEPTED_NAME || languageVersionSettings.isReleaseCoroutines()) return false - val original = - module.getPackage(languageVersionSettings.coroutinesIntrinsicsPackageFqName()).memberScope - .getContributedFunctions(INTERCEPTED_NAME, NoLookupLocation.FROM_BACKEND) - .singleOrNull() as CallableDescriptor - return DescriptorEquivalenceForOverrides.areEquivalent(original, this) -} - -fun FunctionDescriptor.isBuiltInSuspendCoroutineOrReturn(languageVersionSettings: LanguageVersionSettings): Boolean { - if (name != SUSPEND_COROUTINE_OR_RETURN_NAME || languageVersionSettings.isReleaseCoroutines()) return false - - val originalDeclaration = getBuiltInSuspendCoroutineOrReturn(languageVersionSettings) ?: return false - - return DescriptorEquivalenceForOverrides.areEquivalent( - originalDeclaration, this +fun FunctionDescriptor.isBuiltInSuspendCoroutineUninterceptedOrReturn(languageVersionSettings: LanguageVersionSettings): Boolean = + isTopLevelInPackage( + "suspendCoroutineUninterceptedOrReturn", + languageVersionSettings.coroutinesIntrinsicsPackageFqName().asString() ) -} - -fun FunctionDescriptor.getBuiltInSuspendCoroutineOrReturn(languageVersionSettings: LanguageVersionSettings) = - module.getPackage(languageVersionSettings.coroutinesIntrinsicsPackageFqName()).memberScope - .getContributedFunctions(SUSPEND_COROUTINE_OR_RETURN_NAME, NoLookupLocation.FROM_BACKEND) - .singleOrNull() - -fun FunctionDescriptor.isBuiltInSuspendCoroutineUninterceptedOrReturn(languageVersionSettings: LanguageVersionSettings): Boolean { - if (name != SUSPEND_COROUTINE_UNINTERCEPTED_OR_RETURN_NAME) return false - val original = module.getPackage(languageVersionSettings.coroutinesIntrinsicsPackageFqName()).memberScope - .getContributedFunctions(SUSPEND_COROUTINE_UNINTERCEPTED_OR_RETURN_NAME, NoLookupLocation.FROM_BACKEND) - .singleOrNull() as CallableDescriptor - return DescriptorEquivalenceForOverrides.areEquivalent(original, this) -} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AssertCodegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AssertCodegenUtil.kt index d1dc3abe934..04f9c6951b3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AssertCodegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AssertCodegenUtil.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.codegen +import org.jetbrains.kotlin.backend.common.isTopLevelInPackage import org.jetbrains.kotlin.codegen.coroutines.createCustomCopy import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.config.JVMAssertionsMode diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/RangeCodegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/RangeCodegenUtil.kt index 076dbedc7f0..0cbdda6c1ba 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/RangeCodegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/RangeCodegenUtil.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.codegen +import org.jetbrains.kotlin.backend.common.isTopLevelInPackage import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns.RANGES_PACKAGE_FQ_NAME import org.jetbrains.kotlin.builtins.PrimitiveType @@ -224,14 +225,6 @@ fun getClosedFloatingPointRangeElementType(rangeType: KotlinType): KotlinType? { return rangeType.arguments.singleOrNull()?.type } -fun DeclarationDescriptor.isTopLevelInPackage(name: String, packageName: String): Boolean { - if (name != this.name.asString()) return false - - val containingDeclaration = containingDeclaration as? PackageFragmentDescriptor ?: return false - val packageFqName = containingDeclaration.fqName.asString() - return packageName == packageFqName -} - fun getAsmRangeElementTypeForPrimitiveRangeOrProgression(rangeCallee: CallableDescriptor): Type { val rangeType = rangeCallee.returnType!! diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt index 29b6b40d726..9b321ad6cda 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.codegen.coroutines import com.intellij.openapi.project.Project import org.jetbrains.kotlin.backend.common.COROUTINE_SUSPENDED_NAME import org.jetbrains.kotlin.backend.common.isBuiltInIntercepted -import org.jetbrains.kotlin.backend.common.isBuiltInSuspendCoroutineOrReturn import org.jetbrains.kotlin.backend.common.isBuiltInSuspendCoroutineUninterceptedOrReturn import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType import org.jetbrains.kotlin.codegen.ExpressionCodegen @@ -219,9 +218,7 @@ fun ResolvedCall<*>.isSuspendNoInlineCall(codegen: ExpressionCodegen, languageVe val functionDescriptor = resultingDescriptor as? FunctionDescriptor ?: return false if (!functionDescriptor.unwrapInitialDescriptorForSuspendFunction().isSuspend) return false - if (functionDescriptor.isBuiltInSuspendCoroutineOrReturnInJvm(languageVersionSettings) || - functionDescriptor.isBuiltInSuspendCoroutineUninterceptedOrReturnInJvm(languageVersionSettings) - ) return true + if (functionDescriptor.isBuiltInSuspendCoroutineUninterceptedOrReturnInJvm(languageVersionSettings)) return true return !(functionDescriptor.isInline || isInlineLambda) } @@ -313,44 +310,6 @@ fun ModuleDescriptor.getSuccessOrFailure(kotlinType: KotlinType) = ) } ?: ErrorUtils.createErrorType("For SuccessOrFailure") -fun FunctionDescriptor.isBuiltInSuspendCoroutineOrReturnInJvm(languageVersionSettings: LanguageVersionSettings) = - getUserData(INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION)?.isBuiltInSuspendCoroutineOrReturn(languageVersionSettings) == true - -fun createMethodNodeForSuspendCoroutineOrReturn( - functionDescriptor: FunctionDescriptor, - typeMapper: KotlinTypeMapper, - languageVersionSettings: LanguageVersionSettings -): MethodNode { - assert(functionDescriptor.isBuiltInSuspendCoroutineOrReturnInJvm(languageVersionSettings)) { - "functionDescriptor must be kotlin.coroutines.intrinsics.suspendOrReturn" - } - - val node = - MethodNode( - Opcodes.ASM5, - Opcodes.ACC_STATIC, - "fake", - typeMapper.mapAsmMethod(functionDescriptor).descriptor, null, null - ) - - node.visitVarInsn(Opcodes.ALOAD, 0) - node.visitVarInsn(Opcodes.ALOAD, 1) - - node.invokeNormalizeContinuation(languageVersionSettings) - - node.visitMethodInsn( - Opcodes.INVOKEINTERFACE, - typeMapper.mapType(functionDescriptor.valueParameters[0]).internalName, - OperatorNameConventions.INVOKE.identifier, - "(${AsmTypes.OBJECT_TYPE})${AsmTypes.OBJECT_TYPE}", - true - ) - node.visitInsn(Opcodes.ARETURN) - node.visitMaxs(2, 2) - - return node -} - private fun MethodNode.invokeNormalizeContinuation(languageVersionSettings: LanguageVersionSettings) { visitMethodInsn( Opcodes.INVOKESTATIC, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.kt index e71325ef018..32bd705e6f0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.kt @@ -469,11 +469,6 @@ abstract class InlineCodegen( ) return SMAPAndMethodNode(node, createDefaultFakeSMAP()) } - functionDescriptor.isBuiltInSuspendCoroutineOrReturnInJvm(languageVersionSettings) -> - return SMAPAndMethodNode( - createMethodNodeForSuspendCoroutineOrReturn(functionDescriptor, state.typeMapper, languageVersionSettings), - createDefaultFakeSMAP() - ) functionDescriptor.isBuiltInIntercepted(languageVersionSettings) -> return SMAPAndMethodNode( createMethodNodeForIntercepted(functionDescriptor, state.typeMapper, languageVersionSettings), diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java index 4fc955750f7..c27370e2106 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java @@ -496,7 +496,7 @@ public class JsInliner extends JsVisitorWithContextImpl { @NotNull LanguageVersionSettings languageVersionSettings ) { if (!(descriptor instanceof FunctionDescriptor)) return false; - return CommonCoroutineCodegenUtilKt.isBuiltInSuspendCoroutineOrReturn( + return CommonCoroutineCodegenUtilKt.isBuiltInSuspendCoroutineUninterceptedOrReturn( (FunctionDescriptor) descriptor.getOriginal(), languageVersionSettings ); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt index f562c0b57bf..fc986f68062 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.js.translate.reference -import org.jetbrains.kotlin.backend.common.isBuiltInSuspendCoroutineOrReturn import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor @@ -153,12 +152,7 @@ class CallArgumentTranslator private constructor( val callableDescriptor = resolvedCall.resultingDescriptor if (callableDescriptor is FunctionDescriptor && callableDescriptor.isSuspend) { - var continuationArg: JsExpression = TranslationUtils.translateContinuationArgument(context()) - if (callableDescriptor.original.isBuiltInSuspendCoroutineOrReturn(context.languageVersionSettings)) { - val facadeName = context().getNameForDescriptor(TranslationUtils.getCoroutineProperty(context(), "facade")) - continuationArg = JsAstUtils.pureFqn(facadeName, continuationArg) - } - result.add(continuationArg) + result.add(TranslationUtils.translateContinuationArgument(context())) } removeLastUndefinedArguments(result)