import gov.nasa.jpf.vm.choice.IntChoiceFromSet;
import gov.nasa.jpf.vm.choice.IntIntervalGenerator;
+import java.awt.*;
import java.io.PrintWriter;
import java.util.*;
}
}
// Record state ID and choice/event as backtrack point
- backtrackPointList.add(new BacktrackPoint(icsCG, vm.getStateId(), refChoices[choiceIndex]));
+ int stateId = vm.getStateId();
+ backtrackPointList.add(new BacktrackPoint(icsCG, stateId, refChoices[choiceIndex]));
+ // Store restorable state object for this state (always store the latest)
+ RestorableVMState restorableState = vm.getRestorableState();
+ restorableStateMap.put(stateId, restorableState);
}
private Integer[] copyChoices(Integer[] choicesToCopy) {
stateToEventMap.put(stateId, eventSet);
}
justVisitedStates.add(stateId);
- // Store restorable state object for this state (always store the latest)
- RestorableVMState restorableState = search.getVM().getRestorableState();
- restorableStateMap.put(stateId, restorableState);
}
// --- Functions related to Read/Write access analysis on shared fields
// If current choice is not the same, then this is caused by the firing of IntIntervalGenerator
// for certain method calls in the infrastructure, e.g., eventSince()
int currChoiceInd = currentChoice % refChoices.length;
- int currChoiceFromCG = 0;
+ int currChoiceFromCG = currChoiceInd;
ChoiceGenerator<?> currentCG = vm.getChoiceGenerator();
// This is the main event CG
- if (currentCG instanceof IntChoiceFromSet) {
- currChoiceFromCG = currChoiceInd;
- } else {
+ if (currentCG instanceof IntIntervalGenerator) {
// This is the interval CG used in device handlers
ChoiceGenerator<?> parentCG = ((IntIntervalGenerator) currentCG).getPreviousChoiceGenerator();
- currChoiceFromCG = ((IntChoiceFromSet) parentCG).getNextChoiceIndex();
+ int actualEvtNum = ((IntChoiceFromSet) parentCG).getNextChoice();
+ // Find the index of the event/choice in refChoices
+ for (int i = 0; i<refChoices.length; i++) {
+ if (actualEvtNum == refChoices[i]) {
+ currChoiceFromCG = i;
+ break;
+ }
+ }
}
if (currChoiceInd != currChoiceFromCG) {
currentChoice = (currentChoice - currChoiceInd) + currChoiceFromCG;
if (isTraceConstructed(newChoiceList, stateId)) {
return;
}
- //BacktrackPoint backtrackPoint = new BacktrackPoint(backtrackCG, newChoiceList);
addNewBacktrackPoint(stateId, newChoiceList);
}