Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/PassVisitor.h

    r033ff37 r3ed994e  
    44
    55#include <stack>
    6 #include <type_traits>
    7 
    8 #include "Common/Stats.h"
     6
    97#include "Common/utility.h"
    108
     
    6058
    6159        virtual void visit( ObjectDecl * objectDecl ) override final;
    62         virtual void visit( const ObjectDecl * objectDecl ) override final;
    6360        virtual void visit( FunctionDecl * functionDecl ) override final;
    64         virtual void visit( const FunctionDecl * functionDecl ) override final;
    6561        virtual void visit( StructDecl * aggregateDecl ) override final;
    66         virtual void visit( const StructDecl * aggregateDecl ) override final;
    6762        virtual void visit( UnionDecl * aggregateDecl ) override final;
    68         virtual void visit( const UnionDecl * aggregateDecl ) override final;
    6963        virtual void visit( EnumDecl * aggregateDecl ) override final;
    70         virtual void visit( const EnumDecl * aggregateDecl ) override final;
    7164        virtual void visit( TraitDecl * aggregateDecl ) override final;
    72         virtual void visit( const TraitDecl * aggregateDecl ) override final;
    7365        virtual void visit( TypeDecl * typeDecl ) override final;
    74         virtual void visit( const TypeDecl * typeDecl ) override final;
    7566        virtual void visit( TypedefDecl * typeDecl ) override final;
    76         virtual void visit( const TypedefDecl * typeDecl ) override final;
    7767        virtual void visit( AsmDecl * asmDecl ) override final;
    78         virtual void visit( const AsmDecl * asmDecl ) override final;
    7968        virtual void visit( StaticAssertDecl * assertDecl ) override final;
    80         virtual void visit( const StaticAssertDecl * assertDecl ) override final;
    8169
    8270        virtual void visit( CompoundStmt * compoundStmt ) override final;
    83         virtual void visit( const CompoundStmt * compoundStmt ) override final;
    8471        virtual void visit( ExprStmt * exprStmt ) override final;
    85         virtual void visit( const ExprStmt * exprStmt ) override final;
    8672        virtual void visit( AsmStmt * asmStmt ) override final;
    87         virtual void visit( const AsmStmt * asmStmt ) override final;
    8873        virtual void visit( DirectiveStmt * dirStmt ) override final;
    89         virtual void visit( const DirectiveStmt * dirStmt ) override final;
    9074        virtual void visit( IfStmt * ifStmt ) override final;
    91         virtual void visit( const IfStmt * ifStmt ) override final;
    9275        virtual void visit( WhileStmt * whileStmt ) override final;
    93         virtual void visit( const WhileStmt * whileStmt ) override final;
    9476        virtual void visit( ForStmt * forStmt ) override final;
    95         virtual void visit( const ForStmt * forStmt ) override final;
    9677        virtual void visit( SwitchStmt * switchStmt ) override final;
    97         virtual void visit( const SwitchStmt * switchStmt ) override final;
    9878        virtual void visit( CaseStmt * caseStmt ) override final;
    99         virtual void visit( const CaseStmt * caseStmt ) override final;
    10079        virtual void visit( BranchStmt * branchStmt ) override final;
    101         virtual void visit( const BranchStmt * branchStmt ) override final;
    10280        virtual void visit( ReturnStmt * returnStmt ) override final;
    103         virtual void visit( const ReturnStmt * returnStmt ) override final;
    10481        virtual void visit( ThrowStmt * throwStmt ) override final;
    105         virtual void visit( const ThrowStmt * throwStmt ) override final;
    10682        virtual void visit( TryStmt * tryStmt ) override final;
    107         virtual void visit( const TryStmt * tryStmt ) override final;
    10883        virtual void visit( CatchStmt * catchStmt ) override final;
    109         virtual void visit( const CatchStmt * catchStmt ) override final;
    11084        virtual void visit( FinallyStmt * finallyStmt ) override final;
    111         virtual void visit( const FinallyStmt * finallyStmt ) override final;
    11285        virtual void visit( WaitForStmt * waitforStmt ) override final;
    113         virtual void visit( const WaitForStmt * waitforStmt ) override final;
    11486        virtual void visit( WithStmt * withStmt ) override final;
    115         virtual void visit( const WithStmt * withStmt ) override final;
    11687        virtual void visit( NullStmt * nullStmt ) override final;
    117         virtual void visit( const NullStmt * nullStmt ) override final;
    11888        virtual void visit( DeclStmt * declStmt ) override final;
    119         virtual void visit( const DeclStmt * declStmt ) override final;
    12089        virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) override final;
    121         virtual void visit( const ImplicitCtorDtorStmt * impCtorDtorStmt ) override final;
    12290
    12391        virtual void visit( ApplicationExpr * applicationExpr ) override final;
    124         virtual void visit( const ApplicationExpr * applicationExpr ) override final;
    12592        virtual void visit( UntypedExpr * untypedExpr ) override final;
    126         virtual void visit( const UntypedExpr * untypedExpr ) override final;
    12793        virtual void visit( NameExpr * nameExpr ) override final;
    128         virtual void visit( const NameExpr * nameExpr ) override final;
    12994        virtual void visit( CastExpr * castExpr ) override final;
    130         virtual void visit( const CastExpr * castExpr ) override final;
    13195        virtual void visit( KeywordCastExpr * castExpr ) override final;
    132         virtual void visit( const KeywordCastExpr * castExpr ) override final;
    13396        virtual void visit( VirtualCastExpr * castExpr ) override final;
    134         virtual void visit( const VirtualCastExpr * castExpr ) override final;
    13597        virtual void visit( AddressExpr * addressExpr ) override final;
    136         virtual void visit( const AddressExpr * addressExpr ) override final;
    13798        virtual void visit( LabelAddressExpr * labAddressExpr ) override final;
    138         virtual void visit( const LabelAddressExpr * labAddressExpr ) override final;
    13999        virtual void visit( UntypedMemberExpr * memberExpr ) override final;
    140         virtual void visit( const UntypedMemberExpr * memberExpr ) override final;
    141100        virtual void visit( MemberExpr * memberExpr ) override final;
    142         virtual void visit( const MemberExpr * memberExpr ) override final;
    143101        virtual void visit( VariableExpr * variableExpr ) override final;
    144         virtual void visit( const VariableExpr * variableExpr ) override final;
    145102        virtual void visit( ConstantExpr * constantExpr ) override final;
    146         virtual void visit( const ConstantExpr * constantExpr ) override final;
    147103        virtual void visit( SizeofExpr * sizeofExpr ) override final;
    148         virtual void visit( const SizeofExpr * sizeofExpr ) override final;
    149104        virtual void visit( AlignofExpr * alignofExpr ) override final;
    150         virtual void visit( const AlignofExpr * alignofExpr ) override final;
    151105        virtual void visit( UntypedOffsetofExpr * offsetofExpr ) override final;
    152         virtual void visit( const UntypedOffsetofExpr * offsetofExpr ) override final;
    153106        virtual void visit( OffsetofExpr * offsetofExpr ) override final;
    154         virtual void visit( const OffsetofExpr * offsetofExpr ) override final;
    155107        virtual void visit( OffsetPackExpr * offsetPackExpr ) override final;
    156         virtual void visit( const OffsetPackExpr * offsetPackExpr ) override final;
     108        virtual void visit( AttrExpr * attrExpr ) override final;
    157109        virtual void visit( LogicalExpr * logicalExpr ) override final;
    158         virtual void visit( const LogicalExpr * logicalExpr ) override final;
    159110        virtual void visit( ConditionalExpr * conditionalExpr ) override final;
    160         virtual void visit( const ConditionalExpr * conditionalExpr ) override final;
    161111        virtual void visit( CommaExpr * commaExpr ) override final;
    162         virtual void visit( const CommaExpr * commaExpr ) override final;
    163112        virtual void visit( TypeExpr * typeExpr ) override final;
    164         virtual void visit( const TypeExpr * typeExpr ) override final;
    165113        virtual void visit( AsmExpr * asmExpr ) override final;
    166         virtual void visit( const AsmExpr * asmExpr ) override final;
    167114        virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override final;
    168         virtual void visit( const ImplicitCopyCtorExpr * impCpCtorExpr ) override final;
    169115        virtual void visit( ConstructorExpr *  ctorExpr ) override final;
    170         virtual void visit( const ConstructorExpr *  ctorExpr ) override final;
    171116        virtual void visit( CompoundLiteralExpr * compLitExpr ) override final;
    172         virtual void visit( const CompoundLiteralExpr * compLitExpr ) override final;
    173117        virtual void visit( RangeExpr * rangeExpr ) override final;
    174         virtual void visit( const RangeExpr * rangeExpr ) override final;
    175118        virtual void visit( UntypedTupleExpr * tupleExpr ) override final;
    176         virtual void visit( const UntypedTupleExpr * tupleExpr ) override final;
    177119        virtual void visit( TupleExpr * tupleExpr ) override final;
    178         virtual void visit( const TupleExpr * tupleExpr ) override final;
    179120        virtual void visit( TupleIndexExpr * tupleExpr ) override final;
    180         virtual void visit( const TupleIndexExpr * tupleExpr ) override final;
    181121        virtual void visit( TupleAssignExpr * assignExpr ) override final;
    182         virtual void visit( const TupleAssignExpr * assignExpr ) override final;
    183122        virtual void visit( StmtExpr *  stmtExpr ) override final;
    184         virtual void visit( const StmtExpr *  stmtExpr ) override final;
    185123        virtual void visit( UniqueExpr *  uniqueExpr ) override final;
    186         virtual void visit( const UniqueExpr *  uniqueExpr ) override final;
    187124        virtual void visit( UntypedInitExpr *  initExpr ) override final;
    188         virtual void visit( const UntypedInitExpr *  initExpr ) override final;
    189125        virtual void visit( InitExpr *  initExpr ) override final;
    190         virtual void visit( const InitExpr *  initExpr ) override final;
    191126        virtual void visit( DeletedExpr *  delExpr ) override final;
    192         virtual void visit( const DeletedExpr *  delExpr ) override final;
    193         virtual void visit( DefaultArgExpr * argExpr ) override final;
    194         virtual void visit( const DefaultArgExpr * argExpr ) override final;
    195127        virtual void visit( GenericExpr * genExpr ) override final;
    196         virtual void visit( const GenericExpr * genExpr ) override final;
    197128
    198129        virtual void visit( VoidType * basicType ) override final;
    199         virtual void visit( const VoidType * basicType ) override final;
    200130        virtual void visit( BasicType * basicType ) override final;
    201         virtual void visit( const BasicType * basicType ) override final;
    202131        virtual void visit( PointerType * pointerType ) override final;
    203         virtual void visit( const PointerType * pointerType ) override final;
    204132        virtual void visit( ArrayType * arrayType ) override final;
    205         virtual void visit( const ArrayType * arrayType ) override final;
    206133        virtual void visit( ReferenceType * referenceType ) override final;
    207         virtual void visit( const ReferenceType * referenceType ) override final;
    208         virtual void visit( QualifiedType * qualType ) override final;
    209         virtual void visit( const QualifiedType * qualType ) override final;
    210134        virtual void visit( FunctionType * functionType ) override final;
    211         virtual void visit( const FunctionType * functionType ) override final;
    212135        virtual void visit( StructInstType * aggregateUseType ) override final;
    213         virtual void visit( const StructInstType * aggregateUseType ) override final;
    214136        virtual void visit( UnionInstType * aggregateUseType ) override final;
    215         virtual void visit( const UnionInstType * aggregateUseType ) override final;
    216137        virtual void visit( EnumInstType * aggregateUseType ) override final;
    217         virtual void visit( const EnumInstType * aggregateUseType ) override final;
    218138        virtual void visit( TraitInstType * aggregateUseType ) override final;
    219         virtual void visit( const TraitInstType * aggregateUseType ) override final;
    220139        virtual void visit( TypeInstType * aggregateUseType ) override final;
    221         virtual void visit( const TypeInstType * aggregateUseType ) override final;
    222140        virtual void visit( TupleType * tupleType ) override final;
    223         virtual void visit( const TupleType * tupleType ) override final;
    224141        virtual void visit( TypeofType * typeofType ) override final;
    225         virtual void visit( const TypeofType * typeofType ) override final;
    226142        virtual void visit( AttrType * attrType ) override final;
    227         virtual void visit( const AttrType * attrType ) override final;
    228143        virtual void visit( VarArgsType * varArgsType ) override final;
    229         virtual void visit( const VarArgsType * varArgsType ) override final;
    230144        virtual void visit( ZeroType * zeroType ) override final;
    231         virtual void visit( const ZeroType * zeroType ) override final;
    232145        virtual void visit( OneType * oneType ) override final;
    233         virtual void visit( const OneType * oneType ) override final;
    234         virtual void visit( GlobalScopeType * globalType ) override final;
    235         virtual void visit( const GlobalScopeType * globalType ) override final;
    236146
    237147        virtual void visit( Designation * designation ) override final;
    238         virtual void visit( const Designation * designation ) override final;
    239148        virtual void visit( SingleInit * singleInit ) override final;
    240         virtual void visit( const SingleInit * singleInit ) override final;
    241149        virtual void visit( ListInit * listInit ) override final;
    242         virtual void visit( const ListInit * listInit ) override final;
    243150        virtual void visit( ConstructorInit * ctorInit ) override final;
    244         virtual void visit( const ConstructorInit * ctorInit ) override final;
     151
     152        virtual void visit( Subrange * subrange ) override final;
    245153
    246154        virtual void visit( Constant * constant ) override final;
    247         virtual void visit( const Constant * constant ) override final;
    248155
    249156        virtual void visit( Attribute * attribute ) override final;
    250         virtual void visit( const Attribute * attribute ) override final;
    251157
    252158        virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override final;
     
    277183        virtual Statement * mutate( FinallyStmt * finallyStmt ) override final;
    278184        virtual Statement * mutate( WaitForStmt * waitforStmt ) override final;
    279         virtual Declaration * mutate( WithStmt * withStmt ) override final;
     185        virtual Statement * mutate( WithStmt * withStmt ) override final;
    280186        virtual NullStmt * mutate( NullStmt * nullStmt ) override final;
    281187        virtual Statement * mutate( DeclStmt * declStmt ) override final;
     
    299205        virtual Expression * mutate( OffsetofExpr * offsetofExpr ) override final;
    300206        virtual Expression * mutate( OffsetPackExpr * offsetPackExpr ) override final;
     207        virtual Expression * mutate( AttrExpr * attrExpr ) override final;
    301208        virtual Expression * mutate( LogicalExpr * logicalExpr ) override final;
    302209        virtual Expression * mutate( ConditionalExpr * conditionalExpr ) override final;
     
    317224        virtual Expression * mutate( InitExpr *  initExpr ) override final;
    318225        virtual Expression * mutate( DeletedExpr *  delExpr ) override final;
    319         virtual Expression * mutate( DefaultArgExpr * argExpr ) override final;
    320226        virtual Expression * mutate( GenericExpr * genExpr ) override final;
    321227
     
    325231        virtual Type * mutate( ArrayType * arrayType ) override final;
    326232        virtual Type * mutate( ReferenceType * referenceType ) override final;
    327         virtual Type * mutate( QualifiedType * qualType ) override final;
    328233        virtual Type * mutate( FunctionType * functionType ) override final;
    329234        virtual Type * mutate( StructInstType * aggregateUseType ) override final;
     
    338243        virtual Type * mutate( ZeroType * zeroType ) override final;
    339244        virtual Type * mutate( OneType * oneType ) override final;
    340         virtual Type * mutate( GlobalScopeType * globalType ) override final;
    341245
    342246        virtual Designation * mutate( Designation * designation ) override final;
     
    345249        virtual Initializer * mutate( ConstructorInit * ctorInit ) override final;
    346250
     251        virtual Subrange * mutate( Subrange * subrange ) override final;
     252
    347253        virtual Constant * mutate( Constant * constant ) override final;
    348254
     
    352258
    353259private:
    354         bool inFunction = false;
    355 
    356260        template<typename pass_t> friend void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor );
    357         template<typename pass_t> friend void acceptAll( const std::list< const Declaration * > &decls, PassVisitor< pass_t >& visitor );
    358261        template<typename pass_t> friend void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor );
    359262        template< typename TreeType, typename pass_t > friend void maybeAccept_impl( TreeType * tree, PassVisitor< pass_t > & visitor );
    360         template< typename TreeType, typename pass_t > friend void maybeAccept_impl( const TreeType * tree, PassVisitor< pass_t > & visitor );
    361263        template< typename TreeType, typename pass_t > friend void maybeMutate_impl( TreeType *& tree, PassVisitor< pass_t > & mutator );
    362264        template< typename Container, typename pass_t > friend void maybeAccept_impl( Container & container, PassVisitor< pass_t > & visitor );
    363         template< typename Container, typename pass_t > friend void maybeAccept_impl( const Container & container, PassVisitor< pass_t > & visitor );
    364265        template< typename Container, typename pass_t > friend void maybeMutate_impl( Container & container, PassVisitor< pass_t > & mutator );
    365266
    366267        template<typename node_type> void call_previsit ( node_type * node ) { previsit_impl ( pass, node, 0 ); }
    367         template<typename node_type> void call_previsit ( const node_type * node ) { previsit_impl ( pass, node, 0 ); }
    368268        template<typename node_type> void call_postvisit( node_type * node ) { postvisit_impl( pass, node, 0 ); }
    369         template<typename node_type> void call_postvisit( const node_type * node ) { postvisit_impl( pass, node, 0 ); }
    370269
    371270        template<typename node_type> void call_premutate ( node_type * node ) { premutate_impl( pass, node, 0 ); }
     
    381280        void visitStatementList ( std::list< Statement* > &statements );
    382281        void mutateStatementList( std::list< Statement* > &statements );
    383         void visitStatementList ( const std::list< Statement * > & statements );
    384282
    385283        template< typename func_t >
     
    387285        Statement * visitStatement ( Statement * stmt );
    388286        Statement * mutateStatement( Statement * stmt );
    389         void visitStatement ( const Statement * stmt );
    390287
    391288        template< typename func_t >
     
    393290        Expression * visitExpression ( Expression * expr );
    394291        Expression * mutateExpression( Expression * expr );
    395         void visitExpression ( const Expression * expr );
    396 
    397 
    398         auto                                    get_env_ptr    () -> decltype(env_impl( pass, 0)) { return env_impl( pass, 0); }
     292
     293
     294        TypeSubstitution **             get_env_ptr    () { return env_impl             ( pass, 0); }
    399295        std::list< Statement* > *       get_beforeStmts() { return stmtsToAddBefore_impl( pass, 0); }
    400296        std::list< Statement* > *       get_afterStmts () { return stmtsToAddAfter_impl ( pass, 0); }
     
    407303        void indexerScopeEnter  ()                                    { indexer_impl_enterScope  ( pass, 0       ); }
    408304        void indexerScopeLeave  ()                                    { indexer_impl_leaveScope  ( pass, 0       ); }
    409         void indexerAddId       ( const DeclarationWithType * node  ) { indexer_impl_addId       ( pass, 0, node ); }
    410         void indexerAddType     ( const NamedTypeDecl       * node  ) { indexer_impl_addType     ( pass, 0, node ); }
     305        void indexerAddId       ( DeclarationWithType      * node  ) { indexer_impl_addId       ( pass, 0, node ); }
     306        void indexerAddType     ( NamedTypeDecl             * node  ) { indexer_impl_addType     ( pass, 0, node ); }
    411307        void indexerAddStruct   ( const std::string         & id    ) { indexer_impl_addStruct   ( pass, 0, id   ); }
    412         void indexerAddStruct   ( const StructDecl          * node  ) { indexer_impl_addStruct   ( pass, 0, node ); }
    413         void indexerAddStructFwd( const StructDecl          * node  ) { indexer_impl_addStructFwd( pass, 0, node ); }
    414         void indexerAddEnum     ( const EnumDecl            * node  ) { indexer_impl_addEnum     ( pass, 0, node ); }
     308        void indexerAddStruct   ( StructDecl                * node  ) { indexer_impl_addStruct   ( pass, 0, node ); }
     309        void indexerAddStructFwd( StructDecl                * node  ) { indexer_impl_addStructFwd( pass, 0, node ); }
     310        void indexerAddEnum     ( EnumDecl                  * node  ) { indexer_impl_addEnum     ( pass, 0, node ); }
    415311        void indexerAddUnion    ( const std::string         & id    ) { indexer_impl_addUnion    ( pass, 0, id   ); }
    416         void indexerAddUnion    ( const UnionDecl           * node  ) { indexer_impl_addUnion    ( pass, 0, node ); }
    417         void indexerAddUnionFwd ( const UnionDecl           * node  ) { indexer_impl_addUnionFwd ( pass, 0, node ); }
    418         void indexerAddTrait    ( const TraitDecl           * node  ) { indexer_impl_addTrait    ( pass, 0, node ); }
    419         void indexerAddWith     ( const std::list< Expression * > & exprs, const Declaration * withStmt ) { indexer_impl_addWith( pass, 0, exprs, withStmt ); }
     312        void indexerAddUnion    ( UnionDecl                 * node  ) { indexer_impl_addUnion    ( pass, 0, node ); }
     313        void indexerAddUnionFwd ( UnionDecl                 * node  ) { indexer_impl_addUnionFwd ( pass, 0, node ); }
     314        void indexerAddTrait    ( TraitDecl                 * node  ) { indexer_impl_addTrait    ( pass, 0, node ); }
     315        void indexerAddWith     ( std::list< Expression * > & exprs, BaseSyntaxNode * withStmt ) { indexer_impl_addWith( pass, 0, exprs, withStmt ); }
    420316
    421317
    422318        template< typename TreeType, typename VisitorType >
    423         friend inline void indexerScopedAccept( TreeType * tree, VisitorType & visitor );
     319        friend inline void indexerScopedAccept( TreeType * tree, VisitorType &visitor );
    424320
    425321        template< typename TreeType, typename VisitorType >
    426         friend inline void indexerScopedAccept( const TreeType * tree, VisitorType & visitor );
    427 
    428         template< typename TreeType, typename VisitorType >
    429         friend inline void indexerScopedMutate( TreeType *& tree, VisitorType & visitor );
     322        friend inline void indexerScopedMutate( TreeType *& tree, VisitorType &visitor );
    430323};
    431324
     
    444337public:
    445338        TypeSubstitution * env = nullptr;
    446 };
    447 
    448 class WithConstTypeSubstitution {
    449 protected:
    450         WithConstTypeSubstitution() = default;
    451         ~WithConstTypeSubstitution() = default;
    452 
    453 public:
    454         const TypeSubstitution * env = nullptr;
    455339};
    456340
     
    534418};
    535419
    536 #include "Common/Stats.h"
    537 
    538 extern struct PassVisitorStats {
    539         size_t depth = 0;
    540         Stats::Counters::MaxCounter<double> * max = nullptr;
    541         Stats::Counters::AverageCounter<double> * avg = nullptr;
    542 } pass_visitor_stats;
    543 
    544420#include "SynTree/TypeSubstitution.h"
    545421#include "PassVisitor.impl.h"
Note: See TracChangeset for help on using the changeset viewer.