[K/N][optmz] Fix for https://youtrack.jetbrains.com/issue/KT-48380
This commit is contained in:
+1
-2
@@ -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)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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()
|
||||||
|
|
||||||
|
|||||||
+3
-11
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user