public FormalReceiverTypeFlow getFormalReceiver() { return (FormalReceiverTypeFlow) getParameter(0); }
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); }
public void addAllocation(NewInstanceTypeFlow sourceFlow) { originalMethodFlows.addAllocation(sourceFlow); }
MethodFlowsGraph originalFlows = methodFlow.getOriginalMethodFlows(); ArrayList<JavaTypeProfile> paramProfiles = new ArrayList<>(originalFlows.getParameters().length); for (int i = 0; i < originalFlows.getParameters().length; i++) { JavaTypeProfile paramProfile = makeTypeProfile(methodFlow.foldTypeFlow(bb, originalFlows.getParameter(i))); if (paramProfile != null) { ensureSize(paramProfiles, i); JavaTypeProfile resultTypeProfile = makeTypeProfile(methodFlow.foldTypeFlow(bb, originalFlows.getResult())); for (Map.Entry<Object, InstanceOfTypeFlow> entry : originalFlows.getInstanceOfFlows()) { if (BytecodeLocation.isValidBci(entry.getKey())) { int bci = (int) entry.getKey(); for (Entry<Object, InvokeTypeFlow> entry : originalFlows.getInvokes()) { if (BytecodeLocation.isValidBci(entry.getKey())) { int bci = (int) entry.getKey(); originalFlows.getMonitorEntries().stream() .filter(m -> m.getState().typesCount() > 20) .sorted(Comparator.comparingInt(m2 -> m2.getState().typesCount()))
assert originalMethodFlowsGraph != null && originalMethodFlowsGraph.isLinearized() : " Method " + this + " is not linearized"; for (int i = 0; i < originalMethodFlowsGraph.parameters.length; i++) { if (originalMethodFlowsGraph.getParameter(i) != null) { 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())));
InitialParamTypeFlow initialParameterFlow = originalMethodFlowsGraph.getInitialParameterFlow(i); if (initialParameterFlow != null && parameters[i] != null) { initialParameterFlow.addUse(bb, parameters[i]); TypeFlow<?> clone = lookupCloneOf(bb, original); assert !(originalObserver.isClone()); if (nonCloneableFlow(originalObserver)) { clone.addObserver(bb, originalObserver); } else if (crossMethodUse(original, originalObserver)) { TypeFlow<?> clonedObserver = lookupCloneOf(bb, originalObserver); clone.addObserver(bb, clonedObserver); assert !(originalUse.isClone()); if (nonCloneableFlow(originalUse)) { clone.addUse(bb, originalUse); } else if (crossMethodUse(original, originalUse)) { TypeFlow<?> clonedUse = lookupCloneOf(bb, originalUse); clone.addUse(bb, clonedUse);
TypeFlow<?> formalParam = calleeFlows.getParameter(i); ParameterNode paramNode = calleeFlows.getMethod().getTypeFlow().getReturnedParameter(); if (paramNode != null) { if (isStatic || paramNode.index() != 0) { if (calleeFlows.getResult() != null) { calleeFlows.getResult().addUse(bb, actualReturn); if (calleeFlows.getResult() != null) { calleeFlows.getResult().addUse(bb, actualReturn); calleeFlows.getMethod().registerAsImplementationInvoked(originalInvoke);
for (int i = 0; i < method.getTypeFlow().getOriginalMethodFlows().getParameters().length; i++) { TypeState state = method.getTypeFlow().getParameterTypeState(bigbang, i); if (state != null) { AnalysisType declaredType = method.getTypeFlow().getOriginalMethodFlows().getParameter(i).getDeclaredType(); if (declaredType.isInterface()) { state = TypeState.forSubtraction(bigbang, state, declaredType.getTypeFlow(bigbang, true).getState());
/** * Add the context, if not already added, and return the method flows clone from that context. */ public MethodFlowsGraph addContext(BigBang bb, AnalysisContext calleeContext, InvokeTypeFlow reason) { // make sure that the method is parsed before attempting to clone it; // the parsing should always happen on the same thread this.ensureParsed(bb, reason); AnalysisContext newContext = bb.contextPolicy().peel(calleeContext, localCallingContextDepth); MethodFlowsGraph methodFlows = clonedMethodFlows.get(newContext); if (methodFlows == null) { MethodFlowsGraph newFlows = new MethodFlowsGraph(method, newContext); newFlows.cloneOriginalFlows(bb); MethodFlowsGraph oldFlows = clonedMethodFlows.putIfAbsent(newContext, newFlows); methodFlows = oldFlows != null ? oldFlows : newFlows; if (oldFlows == null) { // link uses after adding the clone to the map since linking uses might trigger // updates to the current method in the current context methodFlows.linkClones(bb); } } return methodFlows; }
protected void addInstanceOf(Object key, InstanceOfTypeFlow instanceOf) { originalMethodFlows.addInstanceOf(key, instanceOf); }
protected void addFieldLoad(LoadFieldTypeFlow sourceFlow) { originalMethodFlows.addFieldLoad(sourceFlow); }
protected void addDynamicAllocation(DynamicNewInstanceTypeFlow sourceFlow) { originalMethodFlows.addDynamicAllocation(sourceFlow); }
protected void addClone(CloneTypeFlow sourceFlow) { originalMethodFlows.addClone(sourceFlow); }
protected void addIndexedLoad(LoadIndexedTypeFlow sourceFlow) { originalMethodFlows.addIndexedLoad(sourceFlow); }
public MethodTypeFlow(OptionValues options, AnalysisMethod method) { super(method, null); this.method = method; this.localCallingContextDepth = PointstoOptions.MaxCallingContextDepth.getValue(options); this.originalMethodFlows = new MethodFlowsGraph(method); this.clonedMethodFlows = new ConcurrentHashMap<>(4, 0.75f, 1); }
StoreInstanceFieldTypeFlow(BigBang bb, MethodFlowsGraph methodFlows, StoreInstanceFieldTypeFlow original) { super(original, methodFlows); this.valueFlow = methodFlows.lookupCloneOf(bb, original.valueFlow); this.objectFlow = methodFlows.lookupCloneOf(bb, original.objectFlow); }
protected FormalParamTypeFlow getParameterFlow(int idx) { return originalMethodFlows.getParameter(idx); }
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); }
public TypeState getParameterTypeState(BigBang bb, int parameter) { return foldTypeFlow(bb, originalMethodFlows.getParameter(parameter)); }
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); }