Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/MLEMutator.h

    r720a007 rd180746  
    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
    23 #include "Common/PassVisitor.h"
    2422#include "Common/SemanticError.h"  // for SemanticError
    2523#include "SynTree/Label.h"         // for Label
     
    2826
    2927namespace ControlStruct {
    30         class LabelGenerator;
     28class LabelGenerator;
    3129
    32         class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting, public WithGuards {
     30        class MLEMutator : public Mutator {
     31                class Entry;
     32
     33                typedef Mutator Parent;
    3334          public:
    34                 class Entry;
    3535                MLEMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) : targetTable( t ), breakLabel(std::string("")), generator( gen ) {}
    3636                ~MLEMutator();
    3737
    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;
    4945
    5046                Statement *mutateLoop( Statement *bodyLoop, Entry &e );
     
    5248                Label &get_breakLabel() { return breakLabel; }
    5349                void set_breakLabel( Label newValue ) { breakLabel = newValue; }
    54 
     50          private:
    5551                class Entry {
    5652                  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) {}
    6055
    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 ); }
    6358
    64                         explicit Entry( CompoundStmt *stmt, Label breakExit ) :
    65                                 stmt( stmt ), breakExit( breakExit ) {}
     59                        bool operator==( const Entry &other ) { return ( loop == other.get_controlStructure() ); }
    6660
    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; }
    8262
    8363                        Label useContExit() { contUsed = true; return contExit; }
    8464                        Label useBreakExit() { breakUsed = true; return breakExit; }
    85                         Label useFallExit() { fallUsed = true; return fallExit; }
    86                         Label useFallDefaultExit() { fallDefaultUsed = true; return fallDefaultExit; }
    8765
    8866                        bool isContUsed() const { return contUsed; }
    8967                        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; }
    9468                  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;
    9972                };
    10073
    101           private:
    10274                std::map< Label, Statement * > *targetTable;
    103                 std::set< Label > fallthroughLabels;
    10475                std::list< Entry > enclosingControlStructures;
    10576                Label breakLabel;
     
    10778
    10879                template< typename LoopClass >
    109                 void prehandleLoopStmt( LoopClass * loopStmt );
     80                Statement *handleLoopStmt( LoopClass *loopStmt );
    11081
    111                 template< typename LoopClass >
    112                 Statement * posthandleLoopStmt( LoopClass * loopStmt );
     82                template< typename IfClass >
     83                Statement *handleIfStmt( IfClass *switchStmt );
    11384
    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 );
    11589        };
    11690} // namespace ControlStruct
Note: See TracChangeset for help on using the changeset viewer.