Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/MLEMutator.h

    r720a007 ra16764a6  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar  8 16:42:32 2018
    13 // Update Count     : 41
     12// Last Modified On : Sat Jul 22 09:19:59 2017
     13// Update Count     : 35
    1414//
    1515
     
    1919#include <map>                     // for map
    2020#include <string>                  // for string
    21 #include <set>                     // for unordered_set
    2221
    2322#include "Common/PassVisitor.h"
     
    3029        class LabelGenerator;
    3130
    32         class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting, public WithGuards {
     31        class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting {
     32                class Entry;
     33
    3334          public:
    34                 class Entry;
    3535                MLEMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) : targetTable( t ), breakLabel(std::string("")), generator( gen ) {}
    3636                ~MLEMutator();
     
    5252                Label &get_breakLabel() { return breakLabel; }
    5353                void set_breakLabel( Label newValue ) { breakLabel = newValue; }
    54 
     54          private:
    5555                class Entry {
    5656                  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 ) {}
     57                        explicit Entry( Statement *_loop, Label _breakExit, Label _contExit = Label("") ) :
     58                                loop( _loop ), breakExit( _breakExit ), contExit( _contExit ), breakUsed(false), contUsed(false) {}
    6059
    61                         explicit Entry( WhileStmt *stmt, Label breakExit, Label contExit ) :
    62                                 stmt( stmt ), breakExit( breakExit ), contExit( contExit ) {}
     60                        bool operator==( const Statement *stmt ) { return loop == stmt; }
     61                        bool operator!=( const Statement *stmt ) { return loop != stmt; }
    6362
    64                         explicit Entry( CompoundStmt *stmt, Label breakExit ) :
    65                                 stmt( stmt ), breakExit( breakExit ) {}
     63                        bool operator==( const Entry &other ) { return loop == other.get_controlStructure(); }
    6664
    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; }
     65                        Statement *get_controlStructure() const { return loop; }
    8266
    8367                        Label useContExit() { contUsed = true; return contExit; }
    8468                        Label useBreakExit() { breakUsed = true; return breakExit; }
    85                         Label useFallExit() { fallUsed = true; return fallExit; }
    86                         Label useFallDefaultExit() { fallDefaultUsed = true; return fallDefaultExit; }
    8769
    8870                        bool isContUsed() const { return contUsed; }
    8971                        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; }
    9472                  private:
    95                         Statement *stmt;
    96                         Label breakExit, contExit, fallExit, fallDefaultExit;
    97                         bool breakUsed = false, contUsed = false, fallUsed = false, fallDefaultUsed = false;
    98                         bool fallDefaultValid = true;
     73                        Statement *loop;
     74                        Label breakExit, contExit;
     75                        bool breakUsed, contUsed;
    9976                };
    10077
    101           private:
    10278                std::map< Label, Statement * > *targetTable;
    103                 std::set< Label > fallthroughLabels;
    10479                std::list< Entry > enclosingControlStructures;
    10580                Label breakLabel;
     
    11287                Statement * posthandleLoopStmt( LoopClass * loopStmt );
    11388
    114                 void fixBlock( std::list< Statement * > &kids, bool caseClause = false );
     89                void fixBlock( std::list< Statement * > &kids );
    11590        };
    11691} // namespace ControlStruct
Note: See TracChangeset for help on using the changeset viewer.