public ArrayCopyTypeFlow(BigBang bb, ArrayCopyTypeFlow original, MethodFlowsGraph methodFlows) { super(original, methodFlows); this.srcArrayFlow = methodFlows.lookupCloneOf(bb, original.srcArrayFlow); this.dstArrayFlow = methodFlows.lookupCloneOf(bb, original.dstArrayFlow); }
StoreInstanceFieldTypeFlow(BigBang bb, MethodFlowsGraph methodFlows, StoreInstanceFieldTypeFlow original) { super(original, methodFlows); this.valueFlow = methodFlows.lookupCloneOf(bb, original.valueFlow); this.objectFlow = methodFlows.lookupCloneOf(bb, original.objectFlow); }
public CloneTypeFlow(BigBang bb, CloneTypeFlow original, MethodFlowsGraph methodFlows, AnalysisContext allocationContext) { super(original, methodFlows); this.cloneSite = original.cloneSite; this.allocationContext = allocationContext; this.input = methodFlows.lookupCloneOf(bb, original.input); }
private DynamicNewInstanceTypeFlow(BigBang bb, DynamicNewInstanceTypeFlow original, MethodFlowsGraph methodFlows, AnalysisContext allocationContext) { super(original, methodFlows); this.allocationSite = original.allocationSite; this.allocationContext = allocationContext; this.newTypeFlow = methodFlows.lookupCloneOf(bb, original.newTypeFlow); }
public OffsetStoreTypeFlow(BigBang bb, MethodFlowsGraph methodFlows, OffsetStoreTypeFlow original) { super(original, methodFlows); this.valueFlow = methodFlows.lookupCloneOf(bb, original.valueFlow); this.objectFlow = methodFlows.lookupCloneOf(bb, original.objectFlow); }
StoreStaticFieldTypeFlow(BigBang bb, MethodFlowsGraph methodFlows, StoreStaticFieldTypeFlow original) { super(original, methodFlows); this.valueFlow = methodFlows.lookupCloneOf(bb, original.valueFlow); this.fieldFlow = original.fieldFlow; }
LoadInstanceFieldTypeFlow(BigBang bb, MethodFlowsGraph methodFlows, LoadInstanceFieldTypeFlow original) { super(methodFlows, original); this.objectFlow = methodFlows.lookupCloneOf(bb, original.objectFlow); }
public OffsetLoadTypeFlow(BigBang bb, MethodFlowsGraph methodFlows, OffsetLoadTypeFlow original) { super(original, methodFlows); this.objectFlow = methodFlows.lookupCloneOf(bb, original.objectFlow); }
parameters[i] = lookupCloneOf(bb, originalMethodFlowsGraph.getParameter(i)); allocations = originalMethodFlowsGraph.allocations.stream().map(f -> lookupCloneOf(bb, f)).collect(Collectors.toList()); dynamicAllocations = originalMethodFlowsGraph.dynamicAllocations.stream().map(f -> lookupCloneOf(bb, f)).collect(Collectors.toList()); monitorEntries = originalMethodFlowsGraph.monitorEntries.stream().map(f -> lookupCloneOf(bb, f)).collect(Collectors.toList()); clones = originalMethodFlowsGraph.clones.stream().map(f -> lookupCloneOf(bb, f)).collect(Collectors.toList()); sources = originalMethodFlowsGraph.sources.stream().map(f -> lookupCloneOf(bb, f)).collect(Collectors.toList()); result = originalMethodFlowsGraph.getResult() != null ? lookupCloneOf(bb, originalMethodFlowsGraph.getResult()) : null; fieldLoads = originalMethodFlowsGraph.fieldLoads.stream().map(f -> lookupCloneOf(bb, f)).collect(Collectors.toList()); indexedLoads = originalMethodFlowsGraph.indexedLoads.stream().map(f -> lookupCloneOf(bb, f)).collect(Collectors.toList()); instanceOfFlows = originalMethodFlowsGraph.instanceOfFlows.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> lookupCloneOf(bb, e.getValue()))); miscEntryFlows = originalMethodFlowsGraph.miscEntryFlows.stream().map(f -> lookupCloneOf(bb, f)).collect(Collectors.toList()); invokeFlows = originalMethodFlowsGraph.invokeFlows.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> lookupCloneOf(bb, e.getValue())));
protected InvokeTypeFlow(BigBang bb, MethodFlowsGraph methodFlows, InvokeTypeFlow original) { super(original, methodFlows); this.originalInvoke = original; this.location = original.location; this.invoke = original.invoke; actualReturn = original.getActualReturn() != null ? (ActualReturnTypeFlow) methodFlows.lookupCloneOf(bb, original.getActualReturn()) : null; actualParameters = new TypeFlow<?>[original.actualParameters.length]; for (int i = 0; i < original.actualParameters.length; i++) { if (original.getActualParameter(i) != null) { actualParameters[i] = methodFlows.lookupCloneOf(bb, original.getActualParameter(i)); } } }
/** * Get a type state containing the union of states over all the clones of the original flow. * * @param originalTypeFlow the original type flow * @return the resulting type state object */ public TypeState foldTypeFlow(BigBang bb, TypeFlow<?> originalTypeFlow) { if (originalTypeFlow == null) { return null; } TypeState result = TypeState.forEmpty(); for (MethodFlowsGraph methodFlows : clonedMethodFlows.values()) { TypeFlow<?> clonedTypeFlow = methodFlows.lookupCloneOf(bb, originalTypeFlow); TypeState cloneState = clonedTypeFlow.getState(); /* * Make a shallow copy of the clone state, i.e., only the types and not the concrete * objects, so that the union operation doesn't merge the concrete objects with abstract * objects. */ TypeState cloneStateCopy = TypeState.forContextInsensitiveTypeState(bb, cloneState); result = TypeState.forUnion(bb, result, cloneStateCopy); } return result; }
private void add(TypeFlow<?> flow, WorkListEntry reason) { if (processed.contains(flow)) { return; } processed.add(flow); WorkListEntry entry = new WorkListEntry(flow, reason); worklist.add(entry); if (!flow.isClone() && flow.getSource() instanceof ValueNode) { AnalysisMethod method = (AnalysisMethod) ((ValueNode) flow.getSource()).graph().method(); for (MethodFlowsGraph methodFlow : method.getTypeFlow().getMethodContextFlows().values()) { TypeFlow<?> curClone = methodFlow.lookupCloneOf(bb, flow); add(curClone, entry); } } } }
TypeFlow<?> clone = lookupCloneOf(bb, original); TypeFlow<?> clonedObserver = lookupCloneOf(bb, originalObserver); clone.addObserver(bb, clonedObserver); TypeFlow<?> clonedUse = lookupCloneOf(bb, originalUse); clone.addUse(bb, clonedUse);