ProgramState stackValue(SymbolicValue sv) { Deque<SymbolicValue> newStack = new LinkedList<>(stack); newStack.push(sv); return new ProgramState(this, newStack); }
public ProgramState addConstraints(SymbolicValue symbolicValue, ConstraintsByDomain constraintsForSV) { PMap<SymbolicValue, ConstraintsByDomain> newConstraints = constraints.put(symbolicValue, constraintsForSV); if (newConstraints != constraints) { return new ProgramState(this, newConstraints); } return this; }
public ProgramState addConstraint(SymbolicValue symbolicValue, Constraint constraint) { PMap<SymbolicValue, Constraint> newConstraints = constraints.put(symbolicValue, constraint); if (newConstraints != constraints) { return new ProgramState(this, newConstraints); } return this; }
public ProgramState addConstraints(SymbolicValue symbolicValue, ConstraintsByDomain constraintsForSV) { PMap<SymbolicValue, ConstraintsByDomain> newConstraints = constraints.put(symbolicValue, constraintsForSV); if (newConstraints != constraints) { return new ProgramState(this, newConstraints); } return this; }
public Pop unstackValue(int nbElements) { if (nbElements == 0) { return new Pop(this, Collections.<SymbolicValue>emptyList()); } Preconditions.checkArgument(stack.size() >= nbElements, nbElements); Deque<SymbolicValue> newStack = new LinkedList<>(stack); List<SymbolicValue> result = Lists.newArrayList(); for (int i = 0; i < nbElements; i++) { result.add(newStack.pop()); } return new Pop(new ProgramState(this, newStack), result); }
public ProgramState visitedPoint(ProgramPoint programPoint, int nbOfVisit) { return new ProgramState(values, valuesByIndex, references, constraints, visitedPoints.put(programPoint, nbOfVisit), stack, exitSymbolicValue); }
public ProgramState visitedPoint(ExplodedGraph.ProgramPoint programPoint, int nbOfVisit) { return new ProgramState(values, references, constraints, visitedPoints.put(programPoint, nbOfVisit), stack); }
@VisibleForTesting public ProgramState put(int index, SymbolicValue value) { SymbolicValue sv = valuesByIndex.get(index); if(sv == null || sv != value) { return new ProgramState(values, valuesByIndex.put(index, value), references, constraints, visitedPoints, stack, exitSymbolicValue); } return this; }
@VisibleForTesting public ProgramState put(int index, SymbolicValue value) { SymbolicValue sv = valuesByIndex.get(index); if(sv == null || sv != value) { return new ProgramState(values, valuesByIndex.put(index, value), references, constraints, visitedPoints, stack, exitSymbolicValue); } return this; }
ProgramState clearStack() { return stack.isEmpty() ? this : new ProgramState(this, PCollections.emptyStack()); }
public Pop unstackValue(int nbElements) { if (nbElements == 0 || stack.isEmpty()) { return new Pop(this, Collections.emptyList()); } // FIXME can be made more efficient by reusing sub collection of PStack instead of copying to the new list PStack<SymbolicValueSymbol> newStack = stack; List<SymbolicValueSymbol> result = Lists.newArrayList(); for (int i = 0; i < nbElements && !newStack.isEmpty(); i++) { result.add(newStack.peek()); newStack = newStack.pop(); } return new Pop(new ProgramState(this, newStack), result); }
public Pop unstackValue(int nbElements) { if (nbElements == 0 || stack.isEmpty()) { return new Pop(this, Collections.emptyList()); } // FIXME can be made more efficient by reusing sub collection of PStack instead of copying to the new list PStack<SymbolicValueSymbol> newStack = stack; List<SymbolicValueSymbol> result = Lists.newArrayList(); for (int i = 0; i < nbElements && !newStack.isEmpty(); i++) { result.add(newStack.peek()); newStack = newStack.pop(); } return new Pop(new ProgramState(this, newStack), result); }
ProgramState clearStack() { return stack.isEmpty() ? this : new ProgramState(this, PCollections.emptyStack()); }
public ProgramState stackValue(SymbolicValue sv, @Nullable Symbol symbol) { return new ProgramState(this, stack.push(new SymbolicValueSymbol(sv, symbol))); }
public ProgramState stackValue(SymbolicValue sv, @Nullable Symbol symbol) { return new ProgramState(this, stack.push(new SymbolicValueSymbol(sv, symbol))); }
public ProgramState stackValue(SymbolicValue sv) { return new ProgramState(this, stack.push(new SymbolicValueSymbol(sv, null))); }
public ProgramState stackValue(SymbolicValue sv) { return new ProgramState(this, stack.push(new SymbolicValueSymbol(sv, null))); }
public ProgramState removeConstraintsOnDomain(SymbolicValue sv, Class<? extends Constraint> domain) { ConstraintsByDomain svConstraint = constraints.get(sv); if(svConstraint == null) { return this; } ConstraintsByDomain newConstraintForSv = svConstraint.remove(domain); if(newConstraintForSv.isEmpty()) { return new ProgramState(this, constraints.remove(sv)); } return addConstraints(sv, newConstraintForSv); }
@VisibleForTesting public ProgramState put(Symbol symbol, SymbolicValue value) { if (symbol.isUnknown() || isVolatileField(symbol)) { return this; } SymbolicValue oldValue = values.get(symbol); if (oldValue == null || oldValue != value) { PMap<SymbolicValue, Integer> newReferences = references; if (oldValue != null) { newReferences = decreaseReference(newReferences, oldValue); } newReferences = increaseReference(newReferences, value); PMap<Symbol, SymbolicValue> newValues = values.put(symbol, value); return new ProgramState(newValues, newReferences, constraints, visitedPoints, stack, exitSymbolicValue); } return this; }
public ProgramState removeConstraintsOnDomain(SymbolicValue sv, Class<? extends Constraint> domain) { ConstraintsByDomain svConstraint = constraints.get(sv); if(svConstraint == null) { return this; } ConstraintsByDomain newConstraintForSv = svConstraint.remove(domain); if(newConstraintForSv.isEmpty()) { return new ProgramState(this, constraints.remove(sv)); } return addConstraints(sv, newConstraintForSv); }