[dfg] Added field.type

This commit is contained in:
Igor Chevdar
2018-08-08 16:28:54 +03:00
parent 6876ccd3ee
commit a07ca86575
4 changed files with 11 additions and 8 deletions
@@ -669,6 +669,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
receiver,
DataFlowIR.Field(
receiverType,
symbolTable.mapType(value.symbol.owner.type),
name.localHash.value,
takeName { name }
),
@@ -684,6 +685,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
receiver,
DataFlowIR.Field(
receiverType,
symbolTable.mapType(value.symbol.owner.type),
name.localHash.value,
takeName { name }
),
@@ -407,12 +407,13 @@ internal object DFGSerializer {
}
}
class Field(val type: Int?, val hash: Long, val name: String?) {
class Field(val receiverType: Int?, val type: Int, val hash: Long, val name: String?) {
constructor(data: ArraySlice) : this(data.readNullableInt(), data.readLong(), data.readNullable { readString() })
constructor(data: ArraySlice) : this(data.readNullableInt(), data.readInt(), data.readLong(), data.readNullable { readString() })
fun write(result: ArraySlice) {
result.writeNullableInt(type)
result.writeNullableInt(receiverType)
result.writeInt(type)
result.writeLong(hash)
result.writeNullable(name) { writeString(it) }
}
@@ -869,7 +870,7 @@ internal object DFGSerializer {
VirtualCall(buildCall(virtualCall), typeMap[virtualCall.receiverType]!!)
fun buildField(field: DataFlowIR.Field) =
Field(field.type?.let { typeMap[it]!! }, field.hash, field.name)
Field(field.receiverType?.let { typeMap[it]!! }, typeMap[field.type]!!, field.hash, field.name)
when (node) {
is DataFlowIR.Node.Parameter -> Node.parameter(node.index)
@@ -1076,7 +1077,7 @@ internal object DFGSerializer {
}
fun deserializeField(field: Field) =
DataFlowIR.Field(field.type?.let { types[it] }, field.hash, field.name)
DataFlowIR.Field(field.receiverType?.let { types[it] }, types[field.type], field.hash, field.name)
fun deserializeBody(body: FunctionBody): DataFlowIR.FunctionBody {
val nodes = body.nodes.map {
@@ -209,7 +209,7 @@ internal object DataFlowIR {
}
}
data class Field(val type: Type?, val hash: Long, val name: String? = null)
data class Field(val receiverType: Type?, val type: Type, val hash: Long, val name: String? = null)
class Edge(val castToType: Type?) {
@@ -163,7 +163,7 @@ internal object Devirtualization {
class VirtualCallSiteReceivers(val receiver: Node, val caller: DataFlowIR.FunctionSymbol, val devirtualizedCallees: List<DevirtualizedCallee>)
class ConstraintGraph : DirectedGraph<Node, Node> {
inner class ConstraintGraph : DirectedGraph<Node, Node> {
private var nodesCount = 0
@@ -172,7 +172,7 @@ internal object Devirtualization {
val voidNode = addNode { Node.Ordinary(it, { "Void" }) }
val virtualNode = addNode { Node.Source(it, VIRTUAL_TYPE_ID, { "Virtual" }) }
val arrayItemField = DataFlowIR.Field(null, 1, "Array\$Item")
val arrayItemField = DataFlowIR.Field(null, symbolTable.mapClass(context.irBuiltIns.anyClass.owner), 1, "Array\$Item")
val functions = mutableMapOf<DataFlowIR.FunctionSymbol, Function>()
val concreteClasses = mutableMapOf<DataFlowIR.Type.Declared, Node>()
val externalFunctions = mutableMapOf<DataFlowIR.FunctionSymbol, Node>()