TypeFlowBuilder<?> objectBuilder = state.lookup(node.object()); storeFieldBuilder = TypeFlowBuilder.create(bb, node, StoreFieldTypeFlow.class, () -> { StoreInstanceFieldTypeFlow storeFieldFlow = new StoreInstanceFieldTypeFlow(node, valueBuilder.get(), objectBuilder.get()); methodFlow.addMiscEntry(storeFieldFlow); return storeFieldFlow;
} else if (flow instanceof StoreInstanceFieldTypeFlow) { StoreInstanceFieldTypeFlow store = (StoreInstanceFieldTypeFlow) flow; return "InstanceStore(" + formatField(store.field()) + ")@" + formatSource(flow); } else if (flow instanceof StoreStaticFieldTypeFlow) { StoreStaticFieldTypeFlow store = (StoreStaticFieldTypeFlow) flow;
@Override public void onObservedUpdate(BigBang bb) { /* Only a clone should be updated */ assert this.isClone(); /* * The state of the receiver object has changed. Add an use link between the value flow * and the field flows of the new objects. */ TypeState objectState = objectFlow.getState(); if (objectState.isUnknown()) { bb.reportIllegalUnknownUse(graphRef.getMethod(), source, "Illegal: Storing into UnknownTypeState objects. Field: " + field); return; } /* Iterate over the receiver objects. */ for (AnalysisObject receiver : objectState.objects()) { /* Get the field flow corresponding to the receiver object. */ FieldTypeFlow fieldFlow = receiver.getInstanceFieldFlow(bb, field, true); /* Register the field flow as a use, if not already registered. */ this.addUse(bb, fieldFlow); } }
@Override public StoreInstanceFieldTypeFlow copy(BigBang bb, MethodFlowsGraph methodFlows) { return new StoreInstanceFieldTypeFlow(bb, methodFlows, this); }
@Override public String toString() { return "StoreInstanceFieldTypeFlow<" + getState() + ">"; } }
@Override public boolean addState(BigBang bb, TypeState add) { /* Only a clone should be updated */ assert this.isClone(); return super.addState(bb, add); }