protected InvokeTypeFlow(Invoke invoke, MethodCallTargetNode target, TypeFlow<?>[] actualParameters, ActualReturnTypeFlow actualReturn, BytecodeLocation location) { super(target, null); this.originalInvoke = null; this.location = location; this.invoke = invoke; this.actualParameters = actualParameters; this.actualReturn = actualReturn; getTargetMethod().registerAsInvoked(this); }
private void processInvoke(InvokeTypeFlow invokeFlow, MethodNode callerNode, Deque<MethodNode> workList) { InvokeNode invokeNode = new InvokeNode(invokeFlow.getTargetMethod(), invokeFlow.invoke().getInvokeKind(), sourceReference(invokeFlow)); callerNode.addInvoke(invokeNode); invokeFlow.getCallees().stream().sorted(methodComparator).forEach(callee -> { if (methodToNode.containsKey(callee)) { MethodNodeReference calleeNode = new MethodNodeReference(methodToNode.get(callee)); invokeNode.addCallee(calleeNode); } else { MethodNode calleeNode = new MethodNode(callee); invokeNode.addCallee(calleeNode); methodToNode.put(callee, calleeNode); workList.add(calleeNode); } }); }
if (originalInvoke.getTargetMethod().hasReceiver()) { invokeTypeState = methodFlow.foldTypeFlow(bb, originalInvoke.getReceiver()); originalInvoke.setState(bb, invokeTypeState);
} else if (flow instanceof InvokeTypeFlow) { InvokeTypeFlow invoke = (InvokeTypeFlow) flow; return "Invoke(" + formatMethod(invoke.getTargetMethod()) + ")@" + formatSource(flow); } else if (flow instanceof InitialParamTypeFlow) { InitialParamTypeFlow param = (InitialParamTypeFlow) flow; ActualReturnTypeFlow ret = (ActualReturnTypeFlow) flow; InvokeTypeFlow invoke = ret.invokeFlow(); return "ActualReturn(" + formatMethod(invoke.getTargetMethod()) + ")@ " + formatSource(flow); } else if (flow instanceof MergeTypeFlow) { return "Merge @ " + formatSource(flow);