Changes in src/Common/PassVisitor.h [5dd0704:6ca154b]
- File:
-
- 1 edited
-
src/Common/PassVisitor.h (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.h
r5dd0704 r6ca154b 25 25 // | WithStmtsToAdd - provides the ability to insert statements before or after the current statement by adding new statements into 26 26 // stmtsToAddBefore or stmtsToAddAfter respectively. 27 // | WithShortCircuiting - provides the ability to skip visiting child nodes; set skip_children to true ifpre{visit,mutate} to skip visiting children27 // | WithShortCircuiting - provides the ability to skip visiting child nodes; set visit_children to false in pre{visit,mutate} to skip visiting children 28 28 // | WithScopes - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable 29 29 // will automatically be restored to its previous value after the corresponding postvisit/postmutate teminates. … … 37 37 PassVisitor(Args &&... args) 38 38 : pass( std::forward<Args>( args )... ) 39 {} 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 } 40 46 41 47 virtual ~PassVisitor() = default; … … 214 220 215 221 private: 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 216 225 template<typename node_type> void call_previsit ( node_type * node ) { previsit_impl ( pass, node, 0 ); } 217 226 template<typename node_type> void call_postvisit( node_type * node ) { postvisit_impl( pass, node, 0 ); } … … 225 234 void set_env( TypeSubstitution * env ) { set_env_impl( pass, env, 0); } 226 235 227 void visitStatementList( std::list< Statement* > &statements ); 236 template< typename func_t > 237 void handleStatementList( std::list< Statement * > & statements, func_t func ); 238 void visitStatementList ( std::list< Statement* > &statements ); 228 239 void mutateStatementList( std::list< Statement* > &statements ); 229 240 230 Statement * visitStatement( Statement * stmt ); 241 template< typename func_t > 242 Statement * handleStatement( Statement * stmt, func_t func ); 243 Statement * visitStatement ( Statement * stmt ); 231 244 Statement * mutateStatement( Statement * stmt ); 232 245 233 void visitExpression( Expression * expr ); 246 template< typename func_t > 247 Expression * handleExpression( Expression * expr, func_t func ); 248 Expression * visitExpression ( Expression * expr ); 234 249 Expression * mutateExpression( Expression * expr ); 235 250 … … 238 253 std::list< Statement* > * get_beforeStmts() { return stmtsToAddBefore_impl( pass, 0); } 239 254 std::list< Statement* > * get_afterStmts () { return stmtsToAddAfter_impl ( pass, 0); } 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; } 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 ); } 242 259 243 260 guard_value_impl init_guard() { … … 278 295 std::list< Statement* > stmtsToAddAfter; 279 296 }; 280 281 297 class WithShortCircuiting { 282 298 protected: … … 285 301 286 302 public: 287 bool skip_children;303 bool_ref visit_children; 288 304 }; 289 305 … … 302 318 }, static_cast< void * >( & val ) ); 303 319 } 304 305 template< typename Func > 306 void GuardAction( Func&& func ) { 307 at_cleanup( std::forward<Func>( func ) ); 308 } 309 }; 310 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 }; 311 331 312 332 #include "PassVisitor.impl.h"
Note:
See TracChangeset
for help on using the changeset viewer.