JVM_IR: merge suspend view and suspend stub maps
This commit is contained in:
@@ -115,23 +115,12 @@ class JvmBackendContext(
|
|||||||
|
|
||||||
val suspendLambdaToOriginalFunctionMap = mutableMapOf<IrFunctionReference, IrFunction>()
|
val suspendLambdaToOriginalFunctionMap = mutableMapOf<IrFunctionReference, IrFunction>()
|
||||||
val suspendFunctionOriginalToView = mutableMapOf<IrFunction, IrFunction>()
|
val suspendFunctionOriginalToView = mutableMapOf<IrFunction, IrFunction>()
|
||||||
val suspendFunctionOriginalToStub = mutableMapOf<IrFunction, IrFunction>()
|
|
||||||
val fakeContinuation: IrExpression = createFakeContinuation(this)
|
val fakeContinuation: IrExpression = createFakeContinuation(this)
|
||||||
|
|
||||||
val staticDefaultStubs = mutableMapOf<IrFunctionSymbol, IrFunction>()
|
val staticDefaultStubs = mutableMapOf<IrFunctionSymbol, IrFunction>()
|
||||||
|
|
||||||
val inlineClassReplacements = MemoizedInlineClassReplacements()
|
val inlineClassReplacements = MemoizedInlineClassReplacements()
|
||||||
|
|
||||||
internal fun recordSuspendFunctionView(function: IrFunction, view: IrFunction) {
|
|
||||||
val attribute = function.suspendFunctionOriginal()
|
|
||||||
suspendFunctionOriginalToStub.remove(attribute)
|
|
||||||
suspendFunctionOriginalToView[attribute] = view
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun recordSuspendFunctionViewStub(function: IrFunction, stub: IrFunction) {
|
|
||||||
suspendFunctionOriginalToStub[function.suspendFunctionOriginal()] = stub
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun referenceClass(descriptor: ClassDescriptor): IrClassSymbol =
|
internal fun referenceClass(descriptor: ClassDescriptor): IrClassSymbol =
|
||||||
symbolTable.lazyWrapper.referenceClass(descriptor)
|
symbolTable.lazyWrapper.referenceClass(descriptor)
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -10,7 +10,7 @@ import com.intellij.psi.PsiElement
|
|||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import org.jetbrains.kotlin.backend.common.CodegenUtil
|
import org.jetbrains.kotlin.backend.common.CodegenUtil
|
||||||
import org.jetbrains.kotlin.backend.common.ir.ir2string
|
import org.jetbrains.kotlin.backend.common.ir.ir2string
|
||||||
import org.jetbrains.kotlin.backend.jvm.lower.getOrCreateSuspendFunctionViewIfNeeded
|
import org.jetbrains.kotlin.backend.jvm.lower.suspendFunctionView
|
||||||
import org.jetbrains.kotlin.codegen.BaseExpressionCodegen
|
import org.jetbrains.kotlin.codegen.BaseExpressionCodegen
|
||||||
import org.jetbrains.kotlin.codegen.ClassBuilder
|
import org.jetbrains.kotlin.codegen.ClassBuilder
|
||||||
import org.jetbrains.kotlin.codegen.OwnerKind
|
import org.jetbrains.kotlin.codegen.OwnerKind
|
||||||
@@ -107,7 +107,7 @@ class IrSourceCompilerForInline(
|
|||||||
function.parentAsClass.functions.find {
|
function.parentAsClass.functions.find {
|
||||||
it.name.asString() == function.name.asString() + FOR_INLINE_SUFFIX &&
|
it.name.asString() == function.name.asString() + FOR_INLINE_SUFFIX &&
|
||||||
it.attributeOwnerId == (function as? IrAttributeContainer)?.attributeOwnerId
|
it.attributeOwnerId == (function as? IrAttributeContainer)?.attributeOwnerId
|
||||||
} ?: function.getOrCreateSuspendFunctionViewIfNeeded(classCodegen.context)
|
} ?: function.suspendFunctionView(codegen.classCodegen.context)
|
||||||
else function
|
else function
|
||||||
val functionCodegen = object : FunctionCodegen(forInlineFunction, classCodegen, codegen.takeIf { isLambda }) {
|
val functionCodegen = object : FunctionCodegen(forInlineFunction, classCodegen, codegen.takeIf { isLambda }) {
|
||||||
override fun createMethod(flags: Int, signature: JvmMethodGenericSignature): MethodVisitor {
|
override fun createMethod(flags: Int, signature: JvmMethodGenericSignature): MethodVisitor {
|
||||||
|
|||||||
+10
-26
@@ -560,7 +560,7 @@ private class AddContinuationLowering(private val context: JvmBackendContext) :
|
|||||||
val flag = MutableFlag(false)
|
val flag = MutableFlag(false)
|
||||||
function.accept(this, flag)
|
function.accept(this, flag)
|
||||||
|
|
||||||
val view = function.getOrCreateSuspendFunctionViewIfNeeded(context) as IrSimpleFunction
|
val view = function.suspendFunctionView(context) as IrSimpleFunction
|
||||||
val result = mutableListOf(view)
|
val result = mutableListOf(view)
|
||||||
if (function.body == null || !function.hasContinuation()) return result
|
if (function.body == null || !function.hasContinuation()) return result
|
||||||
|
|
||||||
@@ -621,14 +621,19 @@ private class AddContinuationLowering(private val context: JvmBackendContext) :
|
|||||||
|
|
||||||
// Transform `suspend fun foo(params): RetType` into `fun foo(params, $completion: Continuation<RetType>): Any?`
|
// Transform `suspend fun foo(params): RetType` into `fun foo(params, $completion: Continuation<RetType>): Any?`
|
||||||
// the result is called 'view', just to be consistent with old backend.
|
// the result is called 'view', just to be consistent with old backend.
|
||||||
internal fun IrFunction.getOrCreateSuspendFunctionViewIfNeeded(context: JvmBackendContext): IrFunction {
|
internal fun IrFunction.suspendFunctionView(context: JvmBackendContext): IrFunction {
|
||||||
if (!isSuspend) return this
|
if (!isSuspend) return this
|
||||||
return context.suspendFunctionOriginalToView[suspendFunctionOriginal()] ?: suspendFunctionView(context)
|
val stub = suspendFunctionViewOrStub(context)
|
||||||
|
if (stub.body == null) {
|
||||||
|
val continuationParameter = stub.continuationParameter()
|
||||||
|
stub.body = moveBodyTo(stub, explicitParameters.zip(stub.explicitParameters.filter { it != continuationParameter }).toMap())
|
||||||
|
}
|
||||||
|
return stub
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrFunction.getOrCreateSuspendFunctionStub(context: JvmBackendContext): IrFunction {
|
internal fun IrFunction.suspendFunctionViewOrStub(context: JvmBackendContext): IrFunction {
|
||||||
if (!isSuspend) return this
|
if (!isSuspend) return this
|
||||||
return context.suspendFunctionOriginalToStub[suspendFunctionOriginal()] ?: suspendFunctionStub(context)
|
return context.suspendFunctionOriginalToView.getOrPut(suspendFunctionOriginal()) { suspendFunctionStub(context) }
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun IrFunction.suspendFunctionOriginal(): IrFunction {
|
internal fun IrFunction.suspendFunctionOriginal(): IrFunction {
|
||||||
@@ -667,8 +672,6 @@ private fun IrFunction.suspendFunctionStub(context: JvmBackendContext): IrFuncti
|
|||||||
SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, continuationType(context), JvmLoweredDeclarationOrigin.CONTINUATION_CLASS
|
SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, continuationType(context), JvmLoweredDeclarationOrigin.CONTINUATION_CLASS
|
||||||
)
|
)
|
||||||
function.valueParameters += valueParameters.drop(index).map { it.copyTo(function, index = it.index + 1) }
|
function.valueParameters += valueParameters.drop(index).map { it.copyTo(function, index = it.index + 1) }
|
||||||
|
|
||||||
context.recordSuspendFunctionViewStub(this, function)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,25 +688,6 @@ private fun IrFunction.continuationType(context: JvmBackendContext): IrType {
|
|||||||
context.ir.symbols.continuationClass.typeWith(returnType)
|
context.ir.symbols.continuationClass.typeWith(returnType)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrFunction.suspendFunctionView(context: JvmBackendContext): IrFunction {
|
|
||||||
require(isSuspend && this is IrSimpleFunction)
|
|
||||||
return getOrCreateSuspendFunctionStub(context).also { function ->
|
|
||||||
context.recordSuspendFunctionView(this, function)
|
|
||||||
|
|
||||||
val continuationParameter =
|
|
||||||
function.valueParameters.find { it.origin == IrDeclarationOrigin.MASK_FOR_DEFAULT_FUNCTION }
|
|
||||||
?.let { function.valueParameters[it.index - 1] } ?: function.valueParameters.last()
|
|
||||||
|
|
||||||
function.body =
|
|
||||||
moveBodyTo(function, explicitParameters.zip(function.explicitParameters.filter { it != continuationParameter }).toMap())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun IrFunction.suspendFunctionViewOrStub(context: JvmBackendContext): IrFunction {
|
|
||||||
if (!isSuspend) return this
|
|
||||||
return context.suspendFunctionOriginalToView[suspendFunctionOriginal()] ?: getOrCreateSuspendFunctionStub(context)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun IrCall.createSuspendFunctionCallViewIfNeeded(context: JvmBackendContext, caller: IrFunction): IrCall {
|
private fun IrCall.createSuspendFunctionCallViewIfNeeded(context: JvmBackendContext, caller: IrFunction): IrCall {
|
||||||
// Calls inside continuation are already generated with continuation parameter as well as calls to suspendImpls
|
// Calls inside continuation are already generated with continuation parameter as well as calls to suspendImpls
|
||||||
if (!isSuspend || caller.isInvokeSuspendOfContinuation()
|
if (!isSuspend || caller.isInvokeSuspendOfContinuation()
|
||||||
|
|||||||
Reference in New Issue
Block a user