Changes in src/ControlStruct/MLEMutator.h [720a007:d180746]
- File:
-
- 1 edited
-
src/ControlStruct/MLEMutator.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/MLEMutator.h
r720a007 rd180746 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 8 16:42:32 201813 // Update Count : 4112 // Last Modified On : Sat Jul 22 09:19:59 2017 13 // Update Count : 35 14 14 // 15 15 … … 19 19 #include <map> // for map 20 20 #include <string> // for string 21 #include <set> // for unordered_set22 21 23 #include "Common/PassVisitor.h"24 22 #include "Common/SemanticError.h" // for SemanticError 25 23 #include "SynTree/Label.h" // for Label … … 28 26 29 27 namespace ControlStruct { 30 class LabelGenerator;28 class LabelGenerator; 31 29 32 class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting, public WithGuards { 30 class MLEMutator : public Mutator { 31 class Entry; 32 33 typedef Mutator Parent; 33 34 public: 34 class Entry;35 35 MLEMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) : targetTable( t ), breakLabel(std::string("")), generator( gen ) {} 36 36 ~MLEMutator(); 37 37 38 void premutate( CompoundStmt *cmpndStmt ); 39 Statement * postmutate( BranchStmt *branchStmt ) throw ( SemanticErrorException ); 40 void premutate( WhileStmt *whileStmt ); 41 Statement * postmutate( WhileStmt *whileStmt ); 42 void premutate( ForStmt *forStmt ); 43 Statement * postmutate( ForStmt *forStmt ); 44 void premutate( CaseStmt *caseStmt ); 45 void premutate( IfStmt *ifStmt ); 46 Statement * postmutate( IfStmt *ifStmt ); 47 void premutate( SwitchStmt *switchStmt ); 48 Statement * postmutate( SwitchStmt *switchStmt ); 38 virtual CompoundStmt *mutate( CompoundStmt *cmpndStmt ) override; 39 virtual Statement *mutate( WhileStmt *whileStmt ) override; 40 virtual Statement *mutate( ForStmt *forStmt ) override; 41 virtual Statement *mutate( BranchStmt *branchStmt ) throw ( SemanticError ) override; 42 virtual Statement *mutate( CaseStmt *caseStmt ) override; 43 virtual Statement *mutate( IfStmt *ifStmt ) override; 44 virtual Statement *mutate( SwitchStmt *switchStmt ) override; 49 45 50 46 Statement *mutateLoop( Statement *bodyLoop, Entry &e ); … … 52 48 Label &get_breakLabel() { return breakLabel; } 53 49 void set_breakLabel( Label newValue ) { breakLabel = newValue; } 54 50 private: 55 51 class Entry { 56 52 public: 57 // specialized constructors for each combination of statement with labelled break/continue/fallthrough that is valid to cleanup the use cases 58 explicit Entry( ForStmt *stmt, Label breakExit, Label contExit ) : 59 stmt( stmt ), breakExit( breakExit ), contExit( contExit ) {} 53 explicit Entry( Statement *_loop, Label _breakExit, Label _contExit = Label("") ) : 54 loop( _loop ), breakExit( _breakExit ), contExit( _contExit ), breakUsed(false), contUsed(false) {} 60 55 61 explicit Entry( WhileStmt *stmt, Label breakExit, Label contExit ) :62 stmt( stmt ), breakExit( breakExit ), contExit( contExit ) {}56 bool operator==( const Statement *stmt ) { return ( loop == stmt ); } 57 bool operator!=( const Statement *stmt ) { return ( loop != stmt ); } 63 58 64 explicit Entry( CompoundStmt *stmt, Label breakExit ) : 65 stmt( stmt ), breakExit( breakExit ) {} 59 bool operator==( const Entry &other ) { return ( loop == other.get_controlStructure() ); } 66 60 67 explicit Entry( IfStmt *stmt, Label breakExit ) : 68 stmt( stmt ), breakExit( breakExit ) {} 69 70 explicit Entry( CaseStmt *stmt, Label fallExit ) : 71 stmt( stmt ), fallExit( fallExit ) {} 72 73 explicit Entry( SwitchStmt *stmt, Label breakExit, Label fallDefaultExit ) : 74 stmt( stmt ), breakExit( breakExit ), fallDefaultExit( fallDefaultExit ) {} 75 76 bool operator==( const Statement *other ) { return stmt == other; } 77 bool operator!=( const Statement *other ) { return stmt != other; } 78 79 bool operator==( const Entry &other ) { return stmt == other.get_controlStructure(); } 80 81 Statement *get_controlStructure() const { return stmt; } 61 Statement *get_controlStructure() const { return loop; } 82 62 83 63 Label useContExit() { contUsed = true; return contExit; } 84 64 Label useBreakExit() { breakUsed = true; return breakExit; } 85 Label useFallExit() { fallUsed = true; return fallExit; }86 Label useFallDefaultExit() { fallDefaultUsed = true; return fallDefaultExit; }87 65 88 66 bool isContUsed() const { return contUsed; } 89 67 bool isBreakUsed() const { return breakUsed; } 90 bool isFallUsed() const { return fallUsed; }91 bool isFallDefaultUsed() const { return fallDefaultUsed; }92 void seenDefault() { fallDefaultValid = false; }93 bool isFallDefaultValid() const { return fallDefaultValid; }94 68 private: 95 Statement *stmt; 96 Label breakExit, contExit, fallExit, fallDefaultExit; 97 bool breakUsed = false, contUsed = false, fallUsed = false, fallDefaultUsed = false; 98 bool fallDefaultValid = true; 69 Statement *loop; 70 Label breakExit, contExit; 71 bool breakUsed, contUsed; 99 72 }; 100 73 101 private:102 74 std::map< Label, Statement * > *targetTable; 103 std::set< Label > fallthroughLabels;104 75 std::list< Entry > enclosingControlStructures; 105 76 Label breakLabel; … … 107 78 108 79 template< typename LoopClass > 109 void prehandleLoopStmt( LoopClass *loopStmt );80 Statement *handleLoopStmt( LoopClass *loopStmt ); 110 81 111 template< typename LoopClass >112 Statement * posthandleLoopStmt( LoopClass * loopStmt );82 template< typename IfClass > 83 Statement *handleIfStmt( IfClass *switchStmt ); 113 84 114 void fixBlock( std::list< Statement * > &kids, bool caseClause = false ); 85 template< typename SwitchClass > 86 Statement *handleSwitchStmt( SwitchClass *switchStmt ); 87 88 void fixBlock( std::list< Statement * > &kids ); 115 89 }; 116 90 } // namespace ControlStruct
Note:
See TracChangeset
for help on using the changeset viewer.