[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:
committed by
Space Team
parent
ebeba231a0
commit
4f44d32cc2
+2
-3
@@ -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
|
||||
|
||||
+3
-2
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user