This commit is contained in:
Igor Chevdar
2021-08-31 14:04:29 +05:00
parent 47a660e479
commit 8ad540953e
3 changed files with 5 additions and 14 deletions
@@ -859,8 +859,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
DataFlowIR.Node.FieldWrite(
receiver,
value.symbol.owner.toDataFlowIRField(),
expressionToEdge(value.value),
mapReturnType(value.value.type, value.symbol.owner.type)
expressionToEdge(value.value)
)
}
@@ -266,7 +266,7 @@ internal object DataFlowIR {
class FieldRead(val receiver: Edge?, val field: Field, val type: Type, val ir: IrGetField?) : Node()
class FieldWrite(val receiver: Edge?, val field: Field, val value: Edge, val type: Type) : Node()
class FieldWrite(val receiver: Edge?, val field: Field, val value: Edge) : Node()
class ArrayRead(val callee: FunctionSymbol, val array: Edge, val index: Edge, val type: Type, val irCallSite: IrCall?) : Node()
@@ -1098,15 +1098,7 @@ internal object DevirtualizationAnalysis {
doCast(function, fieldNode, actualType)
}
fun writeField(field: DataFlowIR.Field, actualType: DataFlowIR.Type.Declared, value: Node) {
val fieldNode = fieldNode(field)
val expectedType = field.type.resolved()
val castedValue = if (!useTypes || actualType == expectedType)
value
else
doCast(function, value, actualType)
addEdge(castedValue, fieldNode)
}
fun writeField(field: DataFlowIR.Field, value: Node) = addEdge(value, fieldNode(field))
if (node is DataFlowIR.Node.Variable && node.kind != DataFlowIR.VariableKind.Temporary) {
var variableNode = variables[node]
@@ -1227,7 +1219,7 @@ internal object DevirtualizationAnalysis {
val type = node.field.type.resolved()
if (entryPoint == null && type.isFinal)
addInstantiatingClass(type)
writeField(node.field, node.type.resolved(), edgeToConstraintNode(node.value))
writeField(node.field, edgeToConstraintNode(node.value))
constraintGraph.voidNode
}
@@ -1235,7 +1227,7 @@ internal object DevirtualizationAnalysis {
readField(constraintGraph.arrayItemField, node.type.resolved())
is DataFlowIR.Node.ArrayWrite -> {
writeField(constraintGraph.arrayItemField, node.type.resolved(), edgeToConstraintNode(node.value))
writeField(constraintGraph.arrayItemField, edgeToConstraintNode(node.value))
constraintGraph.voidNode
}