DFG: Added reference back to Ir for all calls

This commit is contained in:
Igor Chevdar
2017-12-14 23:47:50 +03:00
parent cd02040d3f
commit 78a07fc8b9
3 changed files with 19 additions and 10 deletions
@@ -499,7 +499,8 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
DataFlowIR.Node.NewObject( DataFlowIR.Node.NewObject(
symbolTable.mapFunction(callee), symbolTable.mapFunction(callee),
arguments, arguments,
symbolTable.mapClass(callee.constructedClass) symbolTable.mapClass(callee.constructedClass),
value
) )
} else { } else {
if (callee.isOverridable && value.superQualifier == null) { if (callee.isOverridable && value.superQualifier == null) {
@@ -532,7 +533,8 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
symbolTable.mapFunction(actualCallee), symbolTable.mapFunction(actualCallee),
arguments, arguments,
symbolTable.mapType(actualCallee.returnType!!), symbolTable.mapType(actualCallee.returnType!!),
actualCallee.dispatchReceiverParameter?.let { symbolTable.mapType(it.type) } actualCallee.dispatchReceiverParameter?.let { symbolTable.mapType(it.type) },
value
) )
} }
} }
@@ -547,7 +549,8 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
symbolTable.mapFunction(value.descriptor), symbolTable.mapFunction(value.descriptor),
arguments.map { expressionToEdge(it) }, arguments.map { expressionToEdge(it) },
symbolTable.mapClass(context.builtIns.unit), symbolTable.mapClass(context.builtIns.unit),
symbolTable.mapType(thiz.type) symbolTable.mapType(thiz.type),
value
) )
} }
@@ -864,7 +864,8 @@ internal object DFGSerializer {
DataFlowIR.Node.Call( DataFlowIR.Node.Call(
functionSymbols[call.callee], functionSymbols[call.callee],
call.arguments.map { deserializeEdge(it) }, call.arguments.map { deserializeEdge(it) },
types[call.returnType] types[call.returnType],
null
) )
fun deserializeVirtualCall(virtualCall: VirtualCall): DataFlowIR.Node.VirtualCall { fun deserializeVirtualCall(virtualCall: VirtualCall): DataFlowIR.Node.VirtualCall {
@@ -894,12 +895,12 @@ internal object DFGSerializer {
val staticCall = it.staticCall!! val staticCall = it.staticCall!!
val call = deserializeCall(staticCall.call) val call = deserializeCall(staticCall.call)
val receiverType = staticCall.receiverType?.let { types[it] } val receiverType = staticCall.receiverType?.let { types[it] }
DataFlowIR.Node.StaticCall(call.callee, call.arguments, call.returnType, receiverType) DataFlowIR.Node.StaticCall(call.callee, call.arguments, call.returnType, receiverType, null)
} }
NodeType.NEW_OBJECT -> { NodeType.NEW_OBJECT -> {
val call = deserializeCall(it.newObject!!.call) val call = deserializeCall(it.newObject!!.call)
DataFlowIR.Node.NewObject(call.callee, call.arguments, call.returnType) DataFlowIR.Node.NewObject(call.callee, call.arguments, call.returnType, null)
} }
NodeType.VTABLE_CALL -> { NodeType.VTABLE_CALL -> {
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFunction 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.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
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
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -169,15 +170,19 @@ internal object DataFlowIR {
class Const(val type: Type) : Node() class Const(val type: Type) : Node()
open class Call(val callee: FunctionSymbol, val arguments: List<Edge>, val returnType: Type) : Node() open class Call(val callee: FunctionSymbol, val arguments: List<Edge>, val returnType: Type,
open val callSite: IrFunctionAccessExpression?) : Node()
class StaticCall(callee: FunctionSymbol, arguments: List<Edge>, returnType: Type, class StaticCall(callee: FunctionSymbol, arguments: List<Edge>, returnType: Type,
val receiverType: Type?) : Call(callee, arguments, returnType) val receiverType: Type?, callSite: IrFunctionAccessExpression?)
: Call(callee, arguments, returnType, callSite)
class NewObject(constructor: FunctionSymbol, arguments: List<Edge>, type: Type) : Call(constructor, arguments, type) class NewObject(constructor: FunctionSymbol, arguments: List<Edge>, type: Type, override val callSite: IrCall?)
: Call(constructor, arguments, type, callSite)
open class VirtualCall(callee: FunctionSymbol, arguments: List<Edge>, returnType: Type, open class VirtualCall(callee: FunctionSymbol, arguments: List<Edge>, returnType: Type,
val receiverType: Type, val callSite: IrCall?) : Call(callee, arguments, returnType) val receiverType: Type, override val callSite: IrCall?)
: Call(callee, arguments, returnType, callSite)
class VtableCall(callee: FunctionSymbol, receiverType: Type, val calleeVtableIndex: Int, class VtableCall(callee: FunctionSymbol, receiverType: Type, val calleeVtableIndex: Int,
arguments: List<Edge>, returnType: Type, callSite: IrCall?) arguments: List<Edge>, returnType: Type, callSite: IrCall?)