From c73b0d7b76ea2bce58a696379a8df27fab5a25c6 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 15 Dec 2016 19:18:13 +0300 Subject: [PATCH] Move coroutine intrinsics to object (backend's) --- .../codegen/coroutines/coroutineCodegenUtil.kt | 18 ++++++++++++------ .../kotlin/codegen/state/KotlinTypeMapper.java | 9 --------- .../jetbrains/kotlin/resolve/jvm/AsmTypes.java | 2 +- .../expression/LiteralFunctionTranslator.kt | 15 +++++++++------ 4 files changed, 22 insertions(+), 22 deletions(-) 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 32a373b4ab8..1f3f4e31a77 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl +import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext @@ -278,9 +279,14 @@ fun createMethodNodeForSuspendWithCurrentContinuation( fun CallableDescriptor?.unwrapInitialDescriptorForSuspendFunction() = (this as? SimpleFunctionDescriptor)?.getUserData(INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION) ?: this -fun InstructionAdapter.loadSuspendMarker() = invokestatic( - AsmTypes.COROUTINES_SUSPEND_MARKER_OWNER.internalName, - "getSUSPENDED", - Type.getMethodDescriptor(AsmTypes.OBJECT_TYPE), - false -) +fun InstructionAdapter.loadSuspendMarker() { + getstatic( + AsmTypes.COROUTINES_INTRINSICS.internalName, JvmAbi.INSTANCE_FIELD, AsmTypes.COROUTINES_INTRINSICS.descriptor + ) + invokevirtual( + AsmTypes.COROUTINES_INTRINSICS.internalName, + "getSUSPENDED", + Type.getMethodDescriptor(AsmTypes.OBJECT_TYPE), + false + ) +} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index 4b99f3f9643..68b253ca40b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -331,20 +331,11 @@ public class KotlinTypeMapper { } private static final ClassId FAKE_CLASS_ID_FOR_BUILTINS = ClassId.topLevel(new FqName("kotlin.KotlinPackage")); - private static final FqName COROUTINE_SUSPENDED_PROPERTY = new FqName("kotlin.coroutines.SUSPENDED"); @Nullable private static ContainingClassesInfo getPackageMemberContainingClassesInfo(@NotNull DeserializedCallableMemberDescriptor descriptor) { DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); if (containingDeclaration instanceof BuiltInsPackageFragment) { - // TODO: Top level callables are not supported in built-ins - // (while they are loaded from .kotlin-builtins files information about the actual file part is lost) - // This must be fixed when built-ins get loaded through their class files - if (DescriptorUtils.getFqName(descriptor).equals(COROUTINE_SUSPENDED_PROPERTY.toUnsafe())) { - ClassId id = ClassId.topLevel(new FqName("kotlin.coroutines.CoroutinesKt")); - return new ContainingClassesInfo(id, id); - } - return new ContainingClassesInfo(FAKE_CLASS_ID_FOR_BUILTINS, FAKE_CLASS_ID_FOR_BUILTINS); } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java index bee0f118b5f..a2f26045ce7 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java @@ -42,7 +42,7 @@ public class AsmTypes { public static final Type MUTABLE_PROPERTY_REFERENCE2 = Type.getObjectType("kotlin/jvm/internal/MutablePropertyReference2"); public static final Type COROUTINE_IMPL = Type.getObjectType("kotlin/jvm/internal/CoroutineImpl"); public static final Type RESTRICTED_COROUTINE_IMPL = Type.getObjectType("kotlin/jvm/internal/RestrictedCoroutineImpl"); - public static final Type COROUTINES_SUSPEND_MARKER_OWNER = Type.getObjectType("kotlin/coroutines/CoroutinesKt"); + public static final Type COROUTINES_INTRINSICS = Type.getObjectType("kotlin/coroutines/CoroutineIntrinsics"); public static final Type CONTINUATION = Type.getObjectType("kotlin/coroutines/Continuation"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LiteralFunctionTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LiteralFunctionTranslator.kt index e20bbbfc76f..b6193365b86 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LiteralFunctionTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LiteralFunctionTranslator.kt @@ -21,6 +21,7 @@ import com.google.dart.compiler.backend.js.ast.metadata.* import org.jetbrains.kotlin.builtins.isBuiltinExtensionFunctionalType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.js.descriptorUtils.isCoroutineLambda import org.jetbrains.kotlin.js.inline.util.getInnerFunction import org.jetbrains.kotlin.js.translate.context.TranslationContext @@ -35,16 +36,17 @@ import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.TranslationUtils import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.simpleReturnFunction import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtDeclarationWithBody import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.inline.InlineUtil -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.types.KotlinType class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslator(context) { companion object { - private val SUSPEND_FQ_NAME = FqName("kotlin.coroutines.SUSPENDED") + private val SUSPEND_NAME = Name.identifier("SUSPENDED") + private val COROUTINE_INTRINSICS_FQ_NAME = FqName("kotlin.coroutines.CoroutineIntrinsics") } fun translate( @@ -111,15 +113,16 @@ class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslato fun JsFunction.fillCoroutineMetadata(context: TranslationContext, continuationType: KotlinType?) { if (continuationType == null) return - val suspendObjectDescriptor = context().currentModule.getPackage(SUSPEND_FQ_NAME.parent()) - .memberScope.getContributedDescriptors(DescriptorKindFilter.CALLABLES) - .first { it is PropertyDescriptor && it.name == SUSPEND_FQ_NAME.shortName() } + val suspendPropertyDescriptor = context().currentModule.getPackage(COROUTINE_INTRINSICS_FQ_NAME.parent()) + .memberScope.getContributedClassifier(COROUTINE_INTRINSICS_FQ_NAME.shortName(), NoLookupLocation.FROM_BACKEND) + .let { (it as ClassDescriptor) }.unsubstitutedMemberScope + .getContributedVariables(SUSPEND_NAME, NoLookupLocation.FROM_BACKEND).first() val coroutineBaseClassRef = ReferenceTranslator.translateAsTypeReference(TranslationUtils.getCoroutineBaseClass(context), context) coroutineMetadata = CoroutineMetadata( doResumeName = context.getNameForDescriptor(TranslationUtils.getCoroutineDoResumeFunction(context)), - suspendObjectRef = ReferenceTranslator.translateAsValueReference(suspendObjectDescriptor, context()), + suspendObjectRef = ReferenceTranslator.translateAsValueReference(suspendPropertyDescriptor, context()), baseClassRef = coroutineBaseClassRef, stateName = context.getNameForDescriptor(TranslationUtils.getCoroutineProperty(context, "state")), exceptionStateName = context.getNameForDescriptor(TranslationUtils.getCoroutineProperty(context, "exceptionState")),