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( DataFlowIR.Node.FieldWrite(
receiver, receiver,
value.symbol.owner.toDataFlowIRField(), value.symbol.owner.toDataFlowIRField(),
expressionToEdge(value.value), expressionToEdge(value.value)
mapReturnType(value.value.type, value.symbol.owner.type)
) )
} }
@@ -266,7 +266,7 @@ internal object DataFlowIR {
class FieldRead(val receiver: Edge?, val field: Field, val type: Type, val ir: IrGetField?) : Node() 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() 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) doCast(function, fieldNode, actualType)
} }
fun writeField(field: DataFlowIR.Field, actualType: DataFlowIR.Type.Declared, value: Node) { fun writeField(field: DataFlowIR.Field, value: Node) = addEdge(value, fieldNode(field))
val fieldNode = fieldNode(field)
val expectedType = field.type.resolved()
val castedValue = if (!useTypes || actualType == expectedType)
value
else
doCast(function, value, actualType)
addEdge(castedValue, fieldNode)
}
if (node is DataFlowIR.Node.Variable && node.kind != DataFlowIR.VariableKind.Temporary) { if (node is DataFlowIR.Node.Variable && node.kind != DataFlowIR.VariableKind.Temporary) {
var variableNode = variables[node] var variableNode = variables[node]
@@ -1227,7 +1219,7 @@ internal object DevirtualizationAnalysis {
val type = node.field.type.resolved() val type = node.field.type.resolved()
if (entryPoint == null && type.isFinal) if (entryPoint == null && type.isFinal)
addInstantiatingClass(type) addInstantiatingClass(type)
writeField(node.field, node.type.resolved(), edgeToConstraintNode(node.value)) writeField(node.field, edgeToConstraintNode(node.value))
constraintGraph.voidNode constraintGraph.voidNode
} }
@@ -1235,7 +1227,7 @@ internal object DevirtualizationAnalysis {
readField(constraintGraph.arrayItemField, node.type.resolved()) readField(constraintGraph.arrayItemField, node.type.resolved())
is DataFlowIR.Node.ArrayWrite -> { is DataFlowIR.Node.ArrayWrite -> {
writeField(constraintGraph.arrayItemField, node.type.resolved(), edgeToConstraintNode(node.value)) writeField(constraintGraph.arrayItemField, edgeToConstraintNode(node.value))
constraintGraph.voidNode constraintGraph.voidNode
} }