Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/PassVisitor.h

    r6ca154b r5dd0704  
    2525// | WithStmtsToAdd       - provides the ability to insert statements before or after the current statement by adding new statements into
    2626//                          stmtsToAddBefore or stmtsToAddAfter respectively.
    27 // | WithShortCircuiting  - provides the ability to skip visiting child nodes; set visit_children to false in pre{visit,mutate} to skip visiting children
     27// | WithShortCircuiting  - provides the ability to skip visiting child nodes; set skip_children to true if pre{visit,mutate} to skip visiting children
    2828// | WithScopes           - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable
    2929//                          will automatically be restored to its previous value after the corresponding postvisit/postmutate teminates.
     
    3737        PassVisitor(Args &&... args)
    3838                : pass( std::forward<Args>( args )... )
    39         {
    40                 typedef PassVisitor<pass_type> this_t;
    41                 this_t * const * visitor = visitor_impl(pass, 0);
    42                 if(visitor) {
    43                         *const_cast<this_t **>( visitor ) = this;
    44                 }
    45         }
     39        {}
    4640
    4741        virtual ~PassVisitor() = default;
     
    220214
    221215private:
    222         template<typename pass_t> friend void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor );
    223         template<typename pass_t> friend void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor );
    224 
    225216        template<typename node_type> void call_previsit ( node_type * node ) { previsit_impl ( pass, node, 0 ); }
    226217        template<typename node_type> void call_postvisit( node_type * node ) { postvisit_impl( pass, node, 0 ); }
     
    234225        void set_env( TypeSubstitution * env ) { set_env_impl( pass, env, 0); }
    235226
    236         template< typename func_t >
    237         void handleStatementList( std::list< Statement * > & statements, func_t func );
    238         void visitStatementList ( std::list< Statement* > &statements );
     227        void visitStatementList( std::list< Statement* > &statements );
    239228        void mutateStatementList( std::list< Statement* > &statements );
    240229
    241         template< typename func_t >
    242         Statement * handleStatement( Statement * stmt, func_t func );
    243         Statement * visitStatement ( Statement * stmt );
     230        Statement * visitStatement( Statement * stmt );
    244231        Statement * mutateStatement( Statement * stmt );
    245232
    246         template< typename func_t >
    247         Expression * handleExpression( Expression * expr, func_t func );
    248         Expression * visitExpression ( Expression * expr );
     233        void visitExpression( Expression * expr );
    249234        Expression * mutateExpression( Expression * expr );
    250235
     
    253238        std::list< Statement* > *       get_beforeStmts() { return stmtsToAddBefore_impl( pass, 0); }
    254239        std::list< Statement* > *       get_afterStmts () { return stmtsToAddAfter_impl ( pass, 0); }
    255         std::list< Declaration* > *     get_beforeDecls() { return declsToAddBefore_impl( pass, 0); }
    256         std::list< Declaration* > *     get_afterDecls () { return declsToAddAfter_impl ( pass, 0); }
    257 
    258         void set_visit_children( bool& ref ) { bool_ref * ptr = visit_children_impl(pass, 0); if(ptr) ptr->set( ref ); }
     240        bool visit_children() { bool* skip = skip_children_impl(pass, 0); return ! (skip && *skip); }
     241        void reset_visit() { bool* skip = skip_children_impl(pass, 0); if(skip) *skip = false; }
    259242
    260243        guard_value_impl init_guard() {
     
    295278        std::list< Statement* > stmtsToAddAfter;
    296279};
     280
    297281class WithShortCircuiting {
    298282protected:
     
    301285
    302286public:
    303         bool_ref visit_children;
     287        bool skip_children;
    304288};
    305289
     
    318302                }, static_cast< void * >( & val ) );
    319303        }
    320 };
    321 
    322 template<typename pass_type>
    323 class WithVisitorRef {
    324 protected:
    325         WithVisitorRef() = default;
    326         ~WithVisitorRef() = default;
    327 
    328 public:
    329         PassVisitor<pass_type> * const visitor;
    330 };
     304
     305        template< typename Func >
     306        void GuardAction( Func&& func ) {
     307                at_cleanup( std::forward<Func>( func ) );
     308        }
     309};
     310
    331311
    332312#include "PassVisitor.impl.h"
Note: See TracChangeset for help on using the changeset viewer.