DFG: Added reference back to Ir for all calls
This commit is contained in:
+6
-3
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -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 -> {
|
||||||
|
|||||||
+9
-4
@@ -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?)
|
||||||
|
|||||||
Reference in New Issue
Block a user