unsigned Index, ExplodedNode *Pred);
void HandleCallExit(const CallExit &L, ExplodedNode *Pred);
- /// Get the initial state from the subengine.
- const GRState* getInitialState(const LocationContext *InitLoc) {
- return SubEng.getInitialState(InitLoc);
- }
-
- void processEndOfFunction(EndOfFunctionNodeBuilder& Builder) {
- SubEng.processEndOfFunction(Builder);
- }
-
- void processCFGElement(const CFGElement E, StmtNodeBuilder& Builder) {
- SubEng.processCFGElement(E, Builder);
- }
-
- bool processCFGBlockEntrance(const CFGBlock* Blk, const ExplodedNode *Pred,
- BlockCounter BC) {
- return SubEng.processCFGBlockEntrance(Blk, Pred, BC);
- }
-
-
- void processBranch(const Stmt* Condition, const Stmt* Terminator,
- BranchNodeBuilder& Builder) {
- SubEng.processBranch(Condition, Terminator, Builder);
- }
-
-
- void processIndirectGoto(IndirectGotoNodeBuilder& Builder) {
- SubEng.processIndirectGoto(Builder);
- }
-
-
- void processSwitch(SwitchNodeBuilder& Builder) {
- SubEng.processSwitch(Builder);
- }
-
- void processCallEnter(CallEnterNodeBuilder &Builder) {
- SubEng.processCallEnter(Builder);
- }
-
- void processCallExit(CallExitNodeBuilder &Builder) {
- SubEng.processCallExit(Builder);
- }
-
private:
CoreEngine(const CoreEngine&); // Do not implement.
CoreEngine& operator=(const CoreEngine&);
if (!InitState)
// Generate the root.
- generateNode(StartLoc, getInitialState(L), 0);
+ generateNode(StartLoc, SubEng.getInitialState(L), 0);
else
generateNode(StartLoc, InitState, 0);
}
unsigned Index, ExplodedNode *Pred) {
CallEnterNodeBuilder Builder(*this, Pred, L.getCallExpr(),
L.getCalleeContext(), Block, Index);
- processCallEnter(Builder);
+ SubEng.processCallEnter(Builder);
}
void CoreEngine::HandleCallExit(const CallExit &L, ExplodedNode *Pred) {
CallExitNodeBuilder Builder(*this, Pred);
- processCallExit(Builder);
+ SubEng.processCallExit(Builder);
}
void CoreEngine::HandleBlockEdge(const BlockEdge& L, ExplodedNode* Pred) {
// Process the final state transition.
EndOfFunctionNodeBuilder Builder(Blk, Pred, this);
- processEndOfFunction(Builder);
+ SubEng.processEndOfFunction(Builder);
// This path is done. Don't enqueue any more nodes.
return;
// FIXME: Should we allow processCFGBlockEntrance to also manipulate state?
- if (processCFGBlockEntrance(Blk, Pred, WList->getBlockCounter()))
+ if (SubEng.processCFGBlockEntrance(Blk, Pred, WList->getBlockCounter()))
generateNode(BlockEntrance(Blk, Pred->getLocationContext()),
Pred->State, Pred);
else {
if (CFGElement E = L.getFirstElement()) {
StmtNodeBuilder Builder(L.getBlock(), 0, Pred, this,
SubEng.getStateManager());
- processCFGElement(E, Builder);
+ SubEng.processCFGElement(E, Builder);
}
else
HandleBlockExit(L.getBlock(), Pred);
builder(Pred, B, cast<IndirectGotoStmt>(Term)->getTarget(),
*(B->succ_begin()), this);
- processIndirectGoto(builder);
+ SubEng.processIndirectGoto(builder);
return;
}
SwitchNodeBuilder builder(Pred, B, cast<SwitchStmt>(Term)->getCond(),
this);
- processSwitch(builder);
+ SubEng.processSwitch(builder);
return;
}
void CoreEngine::HandleBranch(const Stmt* Cond, const Stmt* Term,
const CFGBlock * B, ExplodedNode* Pred) {
- assert (B->succ_size() == 2);
-
+ assert(B->succ_size() == 2);
BranchNodeBuilder Builder(B, *(B->succ_begin()), *(B->succ_begin()+1),
- Pred, this);
-
- processBranch(Cond, Term, Builder);
+ Pred, this);
+ SubEng.processBranch(Cond, Term, Builder);
}
void CoreEngine::HandlePostStmt(const CFGBlock* B, unsigned StmtIdx,
else {
StmtNodeBuilder Builder(B, StmtIdx, Pred, this,
SubEng.getStateManager());
- processCFGElement((*B)[StmtIdx], Builder);
+ SubEng.processCFGElement((*B)[StmtIdx], Builder);
}
}