Move coroutine intrinsics to object (backend's)
This commit is contained in:
committed by
Stanislav Erokhin
parent
7b079bd1f7
commit
c73b0d7b76
+12
-6
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
@@ -278,9 +279,14 @@ fun createMethodNodeForSuspendWithCurrentContinuation(
|
|||||||
fun CallableDescriptor?.unwrapInitialDescriptorForSuspendFunction() =
|
fun CallableDescriptor?.unwrapInitialDescriptorForSuspendFunction() =
|
||||||
(this as? SimpleFunctionDescriptor)?.getUserData(INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION) ?: this
|
(this as? SimpleFunctionDescriptor)?.getUserData(INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION) ?: this
|
||||||
|
|
||||||
fun InstructionAdapter.loadSuspendMarker() = invokestatic(
|
fun InstructionAdapter.loadSuspendMarker() {
|
||||||
AsmTypes.COROUTINES_SUSPEND_MARKER_OWNER.internalName,
|
getstatic(
|
||||||
"getSUSPENDED",
|
AsmTypes.COROUTINES_INTRINSICS.internalName, JvmAbi.INSTANCE_FIELD, AsmTypes.COROUTINES_INTRINSICS.descriptor
|
||||||
Type.getMethodDescriptor(AsmTypes.OBJECT_TYPE),
|
)
|
||||||
false
|
invokevirtual(
|
||||||
)
|
AsmTypes.COROUTINES_INTRINSICS.internalName,
|
||||||
|
"getSUSPENDED",
|
||||||
|
Type.getMethodDescriptor(AsmTypes.OBJECT_TYPE),
|
||||||
|
false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 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
|
@Nullable
|
||||||
private static ContainingClassesInfo getPackageMemberContainingClassesInfo(@NotNull DeserializedCallableMemberDescriptor descriptor) {
|
private static ContainingClassesInfo getPackageMemberContainingClassesInfo(@NotNull DeserializedCallableMemberDescriptor descriptor) {
|
||||||
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
|
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
|
||||||
if (containingDeclaration instanceof BuiltInsPackageFragment) {
|
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);
|
return new ContainingClassesInfo(FAKE_CLASS_ID_FOR_BUILTINS, FAKE_CLASS_ID_FOR_BUILTINS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class AsmTypes {
|
|||||||
public static final Type MUTABLE_PROPERTY_REFERENCE2 = Type.getObjectType("kotlin/jvm/internal/MutablePropertyReference2");
|
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 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 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");
|
public static final Type CONTINUATION = Type.getObjectType("kotlin/coroutines/Continuation");
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+9
-6
@@ -21,6 +21,7 @@ import com.google.dart.compiler.backend.js.ast.metadata.*
|
|||||||
import org.jetbrains.kotlin.builtins.isBuiltinExtensionFunctionalType
|
import org.jetbrains.kotlin.builtins.isBuiltinExtensionFunctionalType
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
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.descriptorUtils.isCoroutineLambda
|
||||||
import org.jetbrains.kotlin.js.inline.util.getInnerFunction
|
import org.jetbrains.kotlin.js.inline.util.getInnerFunction
|
||||||
import org.jetbrains.kotlin.js.translate.context.TranslationContext
|
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
|
||||||
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.simpleReturnFunction
|
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.simpleReturnFunction
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtDeclarationWithBody
|
import org.jetbrains.kotlin.psi.KtDeclarationWithBody
|
||||||
import org.jetbrains.kotlin.psi.KtParameter
|
import org.jetbrains.kotlin.psi.KtParameter
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil
|
import org.jetbrains.kotlin.resolve.inline.InlineUtil
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslator(context) {
|
class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslator(context) {
|
||||||
companion object {
|
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(
|
fun translate(
|
||||||
@@ -111,15 +113,16 @@ class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslato
|
|||||||
fun JsFunction.fillCoroutineMetadata(context: TranslationContext, continuationType: KotlinType?) {
|
fun JsFunction.fillCoroutineMetadata(context: TranslationContext, continuationType: KotlinType?) {
|
||||||
if (continuationType == null) return
|
if (continuationType == null) return
|
||||||
|
|
||||||
val suspendObjectDescriptor = context().currentModule.getPackage(SUSPEND_FQ_NAME.parent())
|
val suspendPropertyDescriptor = context().currentModule.getPackage(COROUTINE_INTRINSICS_FQ_NAME.parent())
|
||||||
.memberScope.getContributedDescriptors(DescriptorKindFilter.CALLABLES)
|
.memberScope.getContributedClassifier(COROUTINE_INTRINSICS_FQ_NAME.shortName(), NoLookupLocation.FROM_BACKEND)
|
||||||
.first { it is PropertyDescriptor && it.name == SUSPEND_FQ_NAME.shortName() }
|
.let { (it as ClassDescriptor) }.unsubstitutedMemberScope
|
||||||
|
.getContributedVariables(SUSPEND_NAME, NoLookupLocation.FROM_BACKEND).first()
|
||||||
|
|
||||||
val coroutineBaseClassRef = ReferenceTranslator.translateAsTypeReference(TranslationUtils.getCoroutineBaseClass(context), context)
|
val coroutineBaseClassRef = ReferenceTranslator.translateAsTypeReference(TranslationUtils.getCoroutineBaseClass(context), context)
|
||||||
|
|
||||||
coroutineMetadata = CoroutineMetadata(
|
coroutineMetadata = CoroutineMetadata(
|
||||||
doResumeName = context.getNameForDescriptor(TranslationUtils.getCoroutineDoResumeFunction(context)),
|
doResumeName = context.getNameForDescriptor(TranslationUtils.getCoroutineDoResumeFunction(context)),
|
||||||
suspendObjectRef = ReferenceTranslator.translateAsValueReference(suspendObjectDescriptor, context()),
|
suspendObjectRef = ReferenceTranslator.translateAsValueReference(suspendPropertyDescriptor, context()),
|
||||||
baseClassRef = coroutineBaseClassRef,
|
baseClassRef = coroutineBaseClassRef,
|
||||||
stateName = context.getNameForDescriptor(TranslationUtils.getCoroutineProperty(context, "state")),
|
stateName = context.getNameForDescriptor(TranslationUtils.getCoroutineProperty(context, "state")),
|
||||||
exceptionStateName = context.getNameForDescriptor(TranslationUtils.getCoroutineProperty(context, "exceptionState")),
|
exceptionStateName = context.getNameForDescriptor(TranslationUtils.getCoroutineProperty(context, "exceptionState")),
|
||||||
|
|||||||
Reference in New Issue
Block a user