IR: Supported special coroutine intrinsic
See https://youtrack.jetbrains.com/issue/KT-26317 for details
This commit is contained in:
+25
-13
@@ -16,21 +16,22 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.common.lower
|
package org.jetbrains.kotlin.backend.common.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.BackendContext
|
import org.jetbrains.kotlin.backend.common.*
|
||||||
import org.jetbrains.kotlin.backend.common.FunctionLoweringPass
|
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrSetVariable
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrValueAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.dump
|
import org.jetbrains.kotlin.ir.util.dump
|
||||||
import org.jetbrains.kotlin.ir.visitors.*
|
import org.jetbrains.kotlin.ir.visitors.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
object CoroutineIntrinsicLambdaOrigin : IrStatementOriginImpl("Coroutine intrinsic lambda")
|
||||||
|
|
||||||
class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPass {
|
class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPass {
|
||||||
override fun lower(irFunction: IrFunction) {
|
override fun lower(irFunction: IrFunction) {
|
||||||
SharedVariablesTransformer(irFunction).lowerSharedVariables()
|
SharedVariablesTransformer(irFunction).lowerSharedVariables()
|
||||||
@@ -47,17 +48,28 @@ class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPas
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun collectSharedVariables() {
|
private fun collectSharedVariables() {
|
||||||
irFunction.accept(object : IrElementVisitor<Unit, IrDeclarationParent> {
|
irFunction.accept(object : IrElementVisitor<Unit, IrDeclarationParent?> {
|
||||||
val relevantVars = HashSet<IrVariable>()
|
val relevantVars = mutableSetOf<IrVariable>()
|
||||||
|
|
||||||
override fun visitElement(element: IrElement, data: IrDeclarationParent) {
|
override fun visitElement(element: IrElement, data: IrDeclarationParent?) {
|
||||||
element.acceptChildren(this, data)
|
element.acceptChildren(this, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent) =
|
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent?) =
|
||||||
super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data)
|
super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data)
|
||||||
|
|
||||||
override fun visitVariable(declaration: IrVariable, data: IrDeclarationParent) {
|
override fun visitContainerExpression(expression: IrContainerExpression, data: IrDeclarationParent?) =
|
||||||
|
super.visitContainerExpression(
|
||||||
|
expression,
|
||||||
|
if (expression is IrReturnableBlock
|
||||||
|
&& expression.origin == CoroutineIntrinsicLambdaOrigin
|
||||||
|
)
|
||||||
|
null
|
||||||
|
else
|
||||||
|
data
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun visitVariable(declaration: IrVariable, data: IrDeclarationParent?) {
|
||||||
declaration.acceptChildren(this, data)
|
declaration.acceptChildren(this, data)
|
||||||
|
|
||||||
if (declaration.isVar) {
|
if (declaration.isVar) {
|
||||||
@@ -65,7 +77,7 @@ class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPas
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitValueAccess(expression: IrValueAccessExpression, data: IrDeclarationParent) {
|
override fun visitValueAccess(expression: IrValueAccessExpression, data: IrDeclarationParent?) {
|
||||||
expression.acceptChildren(this, data)
|
expression.acceptChildren(this, data)
|
||||||
|
|
||||||
val value = expression.symbol.owner
|
val value = expression.symbol.owner
|
||||||
|
|||||||
Reference in New Issue
Block a user