DFG: workers support
This commit is contained in:
+15
-4
@@ -38,12 +38,9 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction
|
|||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.createValueSymbol
|
import org.jetbrains.kotlin.ir.symbols.impl.createValueSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.util.getArguments
|
import org.jetbrains.kotlin.ir.util.getArguments
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||||
@@ -350,6 +347,14 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
|||||||
expressions += expression
|
expressions += expression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (expression is IrCall && expression.symbol == scheduleImplSymbol) {
|
||||||
|
// Producer of scheduleImpl is called externally, we need to reflect this somehow.
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
val producerInvocation = IrCallImpl(expression.startOffset, expression.endOffset, scheduleImplProducerInvokeDescriptor)
|
||||||
|
producerInvocation.dispatchReceiver = expression.getValueArgument(2)
|
||||||
|
expressions += producerInvocation
|
||||||
|
}
|
||||||
|
|
||||||
if (expression is IrReturnableBlock) {
|
if (expression is IrReturnableBlock) {
|
||||||
returnableBlocks.put(expression.descriptor, expression)
|
returnableBlocks.put(expression.descriptor, expression)
|
||||||
returnableBlockValues.put(expression, mutableListOf())
|
returnableBlockValues.put(expression, mutableListOf())
|
||||||
@@ -412,6 +417,12 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
|||||||
|
|
||||||
private val arrayGetSymbol = context.ir.symbols.arrayGet
|
private val arrayGetSymbol = context.ir.symbols.arrayGet
|
||||||
private val arraySetSymbol = context.ir.symbols.arraySet
|
private val arraySetSymbol = context.ir.symbols.arraySet
|
||||||
|
private val scheduleImplSymbol = context.ir.symbols.scheduleImpl
|
||||||
|
private val scheduleImplProducerParam = scheduleImplSymbol.descriptor.valueParameters[2].also {
|
||||||
|
assert(it.name.asString() == "producer")
|
||||||
|
}
|
||||||
|
private val scheduleImplProducerInvokeDescriptor = scheduleImplProducerParam.type.memberScope
|
||||||
|
.getContributedFunctions(Name.identifier("invoke"), NoLookupLocation.FROM_BACKEND).single()
|
||||||
|
|
||||||
private inner class FunctionDFGBuilder(val expressionValuesExtractor: ExpressionValuesExtractor,
|
private inner class FunctionDFGBuilder(val expressionValuesExtractor: ExpressionValuesExtractor,
|
||||||
val variableValues: VariableValues,
|
val variableValues: VariableValues,
|
||||||
|
|||||||
Reference in New Issue
Block a user