This commit is contained in:
Igor Chevdar
2018-09-20 15:59:02 +03:00
parent 059f572b6a
commit 30b0602492
2 changed files with 17 additions and 6 deletions
@@ -143,7 +143,7 @@ private class Inliner(val globalSubstituteMap: MutableMap<DeclarationDescriptor,
}
}
private fun inlineFunction(callee: IrCall, // Call to be substituted.
private fun inlineFunction(callee: IrCall, // Call to be substituted.
caller: IrFunction): IrReturnableBlockImpl { // Function to substitute.
val copyFunctionDeclaration = copyIrElement.copy( // Create copy of original function.
@@ -194,12 +194,14 @@ private class Inliner(val globalSubstituteMap: MutableMap<DeclarationDescriptor,
val returnType = substitutedDescriptor?.let { context.ir.translateErased((it.descriptor as ClassDescriptor).defaultType) }
?: copyFunctionDeclaration.returnType
val isCoroutineIntrinsicCall = callee.descriptor.isBuiltInSuspendCoroutineUninterceptedOrReturn(context.config.configuration.languageVersionSettings)
return IrReturnableBlockImpl( // Create new IR element to replace "call".
startOffset = startOffset,
endOffset = endOffset,
type = returnType,
symbol = irReturnableBlockSymbol,
origin = null,
origin = if (isCoroutineIntrinsicCall) CoroutineIntrinsicLambdaOrigin else null,
statements = statements,
sourceFileName = sourceFileName
)
@@ -10,15 +10,14 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrGetValue
import org.jetbrains.kotlin.ir.expressions.IrSetVariable
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.IrVariableSymbol
import org.jetbrains.kotlin.ir.visitors.*
import java.util.*
object CoroutineIntrinsicLambdaOrigin: IrStatementOriginImpl("Coroutine intrinsic lambda")
// TODO: Fix .parent for variables and use from common backend.
class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPass {
override fun lower(irFunction: IrFunction) {
@@ -50,6 +49,16 @@ class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPas
functionsVariables.pop()
}
override fun visitContainerExpression(expression: IrContainerExpression) {
if (expression !is IrReturnableBlock || expression.origin != CoroutineIntrinsicLambdaOrigin)
super.visitContainerExpression(expression)
else {
functionsVariables.push(mutableSetOf())
expression.acceptChildrenVoid(this)
functionsVariables.pop()
}
}
override fun visitVariable(declaration: IrVariable) {
declaration.acceptChildrenVoid(this)