[JVM IR] Avoid hard-coded checks for coroutine intrinsics

Use existing helpers for that instead, and introduce a new one.
This commit is contained in:
Sergej Jaskiewicz
2024-01-26 18:03:22 +01:00
committed by Space Team
parent ebeba231a0
commit 4f44d32cc2
3 changed files with 8 additions and 5 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.common.ir.getNonDefaultAdditionalStatementsF
import org.jetbrains.kotlin.backend.common.ir.getOriginalStatementsFromInlinedBlock
import org.jetbrains.kotlin.backend.common.lower.BOUND_RECEIVER_PARAMETER
import org.jetbrains.kotlin.backend.common.lower.LoweredStatementOrigins
import org.jetbrains.kotlin.backend.common.lower.inline.isBuiltInSuspendCoroutineUninterceptedOrReturn
import org.jetbrains.kotlin.backend.jvm.*
import org.jetbrains.kotlin.backend.jvm.intrinsics.IntrinsicMethod
import org.jetbrains.kotlin.backend.jvm.intrinsics.JavaClassProperty
@@ -686,9 +687,7 @@ class ExpressionCodegen(
SuspensionPointKind.NEVER
// Copy-pasted bytecode blocks are not suspension points.
symbol.owner.isInline ->
if (symbol.owner.name.asString() == "suspendCoroutineUninterceptedOrReturn" &&
symbol.owner.getPackageFragment().packageFqName == FqName("kotlin.coroutines.intrinsics")
)
if (symbol.owner.isBuiltInSuspendCoroutineUninterceptedOrReturn())
SuspensionPointKind.ALWAYS
else
SuspensionPointKind.NEVER
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.backend.jvm.ir
import org.jetbrains.kotlin.backend.common.lower.inline.isBuiltInSuspendCoroutineUninterceptedOrReturn
import org.jetbrains.kotlin.backend.common.lower.inline.isBuiltInSuspendCoroutine
import org.jetbrains.kotlin.ir.util.inlineDeclaration
import org.jetbrains.kotlin.ir.util.isFunctionInlining
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
@@ -76,8 +78,7 @@ class IrInlineScopeResolver(context: JvmBackendContext) : IrInlineReferenceLocat
get() = isInline && DescriptorVisibilities.isPrivate(visibility)
private fun IrFunction.isCoroutineIntrinsic(): Boolean =
(name.asString() == "suspendCoroutine" && getPackageFragment().packageFqName == FqName("kotlin.coroutines")) ||
(name.asString() == "suspendCoroutineUninterceptedOrReturn" && getPackageFragment().packageFqName == FqName("kotlin.coroutines.intrinsics"))
isBuiltInSuspendCoroutine() || isBuiltInSuspendCoroutineUninterceptedOrReturn()
fun findContainer(scope: IrElement): IrDeclarationContainer? =
findContainer(scope, approximateToPackage = false)
@@ -60,6 +60,9 @@ abstract class InlineFunctionResolver {
}
}
fun IrFunction.isBuiltInSuspendCoroutine(): Boolean =
isTopLevelInPackage("suspendCoroutine", StandardNames.COROUTINES_PACKAGE_FQ_NAME)
fun IrFunction.isBuiltInSuspendCoroutineUninterceptedOrReturn(): Boolean =
isTopLevelInPackage(
"suspendCoroutineUninterceptedOrReturn",