- File:
-
- 1 edited
-
src/ControlStruct/MLEMutator.cc (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/MLEMutator.cc
r9d6317f r397c101a 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Jan 22 11:50:00 202013 // Update Count : 22 311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Oct 22 17:22:44 2019 13 // Update Count : 220 14 14 // 15 15 … … 33 33 34 34 namespace ControlStruct { 35 M ultiLevelExitMutator::~MultiLevelExitMutator() {35 MLEMutator::~MLEMutator() { 36 36 delete targetTable; 37 37 targetTable = 0; 38 38 } 39 39 namespace { 40 bool isLoop( const MultiLevelExitMutator::Entry & e ) { 41 return dynamic_cast< WhileStmt * >( e.get_controlStructure() ) 42 || dynamic_cast< ForStmt * >( e.get_controlStructure() ); 43 } 44 bool isSwitch( const MultiLevelExitMutator::Entry & e ) { 45 return dynamic_cast< SwitchStmt *>( e.get_controlStructure() ); 46 } 47 48 bool isBreakTarget( const MultiLevelExitMutator::Entry & e ) { 49 return isLoop( e ) || isSwitch( e ) 50 || dynamic_cast< CompoundStmt *>( e.get_controlStructure() ); 51 } 52 bool isContinueTarget( const MultiLevelExitMutator::Entry & e ) { 53 return isLoop( e ); 54 } 55 bool isFallthroughTarget( const MultiLevelExitMutator::Entry & e ) { 56 return dynamic_cast< CaseStmt *>( e.get_controlStructure() ); 57 } 58 bool isFallthroughDefaultTarget( const MultiLevelExitMutator::Entry & e ) { 59 return isSwitch( e ); 60 } 40 bool isLoop( const MLEMutator::Entry & e ) { return dynamic_cast< WhileStmt * >( e.get_controlStructure() ) || dynamic_cast< ForStmt * >( e.get_controlStructure() ); } 41 bool isSwitch( const MLEMutator::Entry & e ) { return dynamic_cast< SwitchStmt *>( e.get_controlStructure() ); } 42 43 bool isBreakTarget( const MLEMutator::Entry & e ) { return isLoop( e ) || isSwitch( e ) || dynamic_cast< CompoundStmt *>( e.get_controlStructure() ); } 44 bool isContinueTarget( const MLEMutator::Entry & e ) { return isLoop( e ); } 45 bool isFallthroughTarget( const MLEMutator::Entry & e ) { return dynamic_cast< CaseStmt *>( e.get_controlStructure() );; } 46 bool isFallthroughDefaultTarget( const MLEMutator::Entry & e ) { return isSwitch( e ); } 61 47 } // namespace 62 63 void MultiLevelExitMutator::premutate( FunctionDecl * ) {64 visit_children = false;65 }66 48 67 49 // break labels have to come after the statement they break out of, so mutate a statement, then if they inform us 68 50 // through the breakLabel field tha they need a place to jump to on a break statement, add the break label to the 69 51 // body of statements 70 void M ultiLevelExitMutator::fixBlock( std::list< Statement * > &kids, bool caseClause ) {52 void MLEMutator::fixBlock( std::list< Statement * > &kids, bool caseClause ) { 71 53 SemanticErrorException errors; 72 54 … … 99 81 } 100 82 101 void M ultiLevelExitMutator::premutate( CompoundStmt *cmpndStmt ) {83 void MLEMutator::premutate( CompoundStmt *cmpndStmt ) { 102 84 visit_children = false; 103 85 bool labeledBlock = !(cmpndStmt->labels.empty()); … … 136 118 } 137 119 } 138 assertf( false, "Could not find label '%s' on statement %s", 139 originalTarget.get_name().c_str(), toString( stmt ).c_str() ); 140 } 141 142 143 Statement *MultiLevelExitMutator::postmutate( BranchStmt *branchStmt ) 144 throw ( SemanticErrorException ) { 120 assertf( false, "Could not find label '%s' on statement %s", originalTarget.get_name().c_str(), toString( stmt ).c_str() ); 121 } 122 123 124 Statement *MLEMutator::postmutate( BranchStmt *branchStmt ) throw ( SemanticErrorException ) { 145 125 std::string originalTarget = branchStmt->originalTarget; 146 126 … … 250 230 } 251 231 252 Statement *M ultiLevelExitMutator::mutateLoop( Statement *bodyLoop, Entry &e ) {232 Statement *MLEMutator::mutateLoop( Statement *bodyLoop, Entry &e ) { 253 233 // only generate these when needed 254 234 if( !e.isContUsed() && !e.isBreakUsed() ) return bodyLoop; … … 273 253 274 254 template< typename LoopClass > 275 void M ultiLevelExitMutator::prehandleLoopStmt( LoopClass * loopStmt ) {255 void MLEMutator::prehandleLoopStmt( LoopClass * loopStmt ) { 276 256 // remember this as the most recent enclosing loop, then mutate the body of the loop -- this will determine 277 257 // whether brkLabel and contLabel are used with branch statements and will recursively do the same to nested … … 284 264 285 265 template< typename LoopClass > 286 Statement * M ultiLevelExitMutator::posthandleLoopStmt( LoopClass * loopStmt ) {266 Statement * MLEMutator::posthandleLoopStmt( LoopClass * loopStmt ) { 287 267 assert( ! enclosingControlStructures.empty() ); 288 268 Entry &e = enclosingControlStructures.back(); … … 295 275 } 296 276 297 void M ultiLevelExitMutator::premutate( WhileStmt * whileStmt ) {277 void MLEMutator::premutate( WhileStmt * whileStmt ) { 298 278 return prehandleLoopStmt( whileStmt ); 299 279 } 300 280 301 void M ultiLevelExitMutator::premutate( ForStmt * forStmt ) {281 void MLEMutator::premutate( ForStmt * forStmt ) { 302 282 return prehandleLoopStmt( forStmt ); 303 283 } 304 284 305 Statement * M ultiLevelExitMutator::postmutate( WhileStmt * whileStmt ) {285 Statement * MLEMutator::postmutate( WhileStmt * whileStmt ) { 306 286 return posthandleLoopStmt( whileStmt ); 307 287 } 308 288 309 Statement * M ultiLevelExitMutator::postmutate( ForStmt * forStmt ) {289 Statement * MLEMutator::postmutate( ForStmt * forStmt ) { 310 290 return posthandleLoopStmt( forStmt ); 311 291 } 312 292 313 void M ultiLevelExitMutator::premutate( IfStmt * ifStmt ) {293 void MLEMutator::premutate( IfStmt * ifStmt ) { 314 294 // generate a label for breaking out of a labeled if 315 295 bool labeledBlock = !(ifStmt->get_labels().empty()); … … 321 301 } 322 302 323 Statement * M ultiLevelExitMutator::postmutate( IfStmt * ifStmt ) {303 Statement * MLEMutator::postmutate( IfStmt * ifStmt ) { 324 304 bool labeledBlock = !(ifStmt->get_labels().empty()); 325 305 if ( labeledBlock ) { … … 331 311 } 332 312 333 void M ultiLevelExitMutator::premutate( TryStmt * tryStmt ) {313 void MLEMutator::premutate( TryStmt * tryStmt ) { 334 314 // generate a label for breaking out of a labeled if 335 315 bool labeledBlock = !(tryStmt->get_labels().empty()); … … 341 321 } 342 322 343 Statement * M ultiLevelExitMutator::postmutate( TryStmt * tryStmt ) {323 Statement * MLEMutator::postmutate( TryStmt * tryStmt ) { 344 324 bool labeledBlock = !(tryStmt->get_labels().empty()); 345 325 if ( labeledBlock ) { … … 351 331 } 352 332 353 void MultiLevelExitMutator::premutate( FinallyStmt * ) { 354 GuardAction([this, old = std::move(enclosingControlStructures)]() { 355 enclosingControlStructures = std::move(old); 356 }); 357 enclosingControlStructures = std::list<Entry>(); 358 GuardValue( inFinally ); 359 inFinally = true; 360 } 361 362 void MultiLevelExitMutator::premutate( ReturnStmt *returnStmt ) { 363 if ( inFinally ) { 364 SemanticError( returnStmt->location, "'return' may not appear in a finally clause" ); 365 } 366 } 367 368 void MultiLevelExitMutator::premutate( CaseStmt *caseStmt ) { 333 void MLEMutator::premutate( CaseStmt *caseStmt ) { 369 334 visit_children = false; 370 335 … … 405 370 } 406 371 407 void M ultiLevelExitMutator::premutate( SwitchStmt *switchStmt ) {372 void MLEMutator::premutate( SwitchStmt *switchStmt ) { 408 373 // generate a label for breaking out of a labeled switch 409 374 Label brkLabel = generator->newLabel("switchBreak", switchStmt); … … 431 396 } 432 397 433 Statement * M ultiLevelExitMutator::postmutate( SwitchStmt * switchStmt ) {398 Statement * MLEMutator::postmutate( SwitchStmt * switchStmt ) { 434 399 Entry &e = enclosingControlStructures.back(); 435 400 assert ( e == switchStmt );
Note:
See TracChangeset
for help on using the changeset viewer.