source: src/Common/PassVisitor.impl.h@ d82daa1

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since d82daa1 was a5f0529, checked in by Andrew Beach <ajbeach@…>, 8 years ago

Virtual casts have been added. They still require a lot of hand coded support to work but for simple cases it should be enough.

  • Property mode set to 100644
File size: 32.8 KB
RevLine 
[13932f14]1#pragma once
[3268a58]2// IWYU pragma: private, include "PassVisitor.h"
[13932f14]3
[6e09f211]4#define VISIT_START( node ) \
5 __attribute__((unused)) \
[62423350]6 guard_value_impl guard( at_cleanup_impl(pass, 0) ); \
[b73bd70]7 bool visit_children = true; \
8 set_visit_children( visit_children ); \
[6e09f211]9 call_previsit( node ); \
[b73bd70]10 if( visit_children ) { \
[6e09f211]11
12#define VISIT_END( node ) \
13 } \
14 call_postvisit( node ); \
[9c1600c]15
[6e09f211]16#define MUTATE_START( node ) \
17 __attribute__((unused)) \
[62423350]18 guard_value_impl guard( at_cleanup_impl(pass, 0) ); \
[b73bd70]19 bool visit_children = true; \
20 set_visit_children( visit_children ); \
[6e09f211]21 call_premutate( node ); \
[b73bd70]22 if( visit_children ) { \
[296b2be]23
24#define MUTATE_END( type, node ) \
[7b13aeb]25 } \
[296b2be]26 return call_postmutate< type * >( node ); \
27
28
[6e09f211]29#define VISIT_BODY( node ) \
30 VISIT_START( node ); \
31 Visitor::visit( node ); \
32 VISIT_END( node ); \
[13932f14]33
[ab904dc]34
[296b2be]35#define MUTATE_BODY( type, node ) \
36 MUTATE_START( node ); \
37 Mutator::mutate( node ); \
38 MUTATE_END( type, node ); \
39
[134322e]40
41
42template<typename T>
43static inline bool empty( T * ptr ) {
44 return !ptr || ptr->empty();
45}
46
[6ca154b]47typedef std::list< Statement * > StmtList_t;
48typedef std::list< Declaration * > DeclList_t;
49
50template<typename iterator_t>
51static inline void splice( iterator_t it, DeclList_t * decls ) {
52 std::transform(
53 decls->begin(),
54 decls->end(),
55 it,
56 [](Declaration * decl) -> auto {
57 return new DeclStmt( noLabels, decl );
58 }
59 );
60 decls->clear();
61}
[134322e]62
63template< typename pass_type >
[6ca154b]64static inline void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& visitor ) {
[134322e]65
[6ca154b]66 DeclList_t* beforeDecls = visitor.get_beforeDecls();
67 DeclList_t* afterDecls = visitor.get_afterDecls();
[134322e]68
[6ca154b]69 for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
70 // splice in new declarations after previous decl
[d24d4e1]71 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
[6ca154b]72
73 if ( i == decls.end() ) break;
74
75 // run mutator on declaration
76 maybeAccept( *i, visitor );
77
78 // splice in new declarations before current decl
79 if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); }
[134322e]80 }
[6ca154b]81}
[134322e]82
[6ca154b]83template< typename pass_type >
84static inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) {
85
86 DeclList_t* beforeDecls = mutator.get_beforeDecls();
87 DeclList_t* afterDecls = mutator.get_afterDecls();
88
89 for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
90 // splice in new declarations after previous decl
[d24d4e1]91 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
[6ca154b]92
93 if ( i == decls.end() ) break;
94
95 // run mutator on declaration
96 *i = maybeMutate( *i, mutator );
97
98 // splice in new declarations before current decl
99 if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); }
100 }
[134322e]101}
102
[296b2be]103template< typename pass_type >
[6ca154b]104template< typename func_t >
105void PassVisitor< pass_type >::handleStatementList( std::list< Statement * > & statements, func_t func ) {
[296b2be]106 SemanticError errors;
107
[2a7b3ca]108 // don't want statements from outer CompoundStmts to be added to this CompoundStmt
109 ValueGuardPtr< StmtList_t > oldBeforeStmts( get_beforeStmts() );
110 ValueGuardPtr< StmtList_t > oldAfterStmts ( get_afterStmts () );
111 ValueGuardPtr< DeclList_t > oldBeforeDecls( get_beforeDecls() );
112 ValueGuardPtr< DeclList_t > oldAfterDecls ( get_afterDecls () );
113
[134322e]114 StmtList_t* beforeStmts = get_beforeStmts();
115 StmtList_t* afterStmts = get_afterStmts();
[6ca154b]116 DeclList_t* beforeDecls = get_beforeDecls();
117 DeclList_t* afterDecls = get_afterDecls();
[134322e]118
[296b2be]119 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
[6ca154b]120
121 if ( !empty( afterDecls ) ) { splice( std::inserter( statements, i ), afterDecls ); }
[134322e]122 if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
[6ca154b]123
[296b2be]124 try {
[6ca154b]125 func( *i );
126 assert(( empty( beforeStmts ) && empty( afterStmts ))
127 || ( empty( beforeDecls ) && empty( afterDecls )) );
128
[296b2be]129 } catch ( SemanticError &e ) {
130 errors.append( e );
[134322e]131 }
[6ca154b]132
133 if ( !empty( beforeDecls ) ) { splice( std::inserter( statements, i ), beforeDecls ); }
[134322e]134 if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); }
[296b2be]135 }
[134322e]136
[6ca154b]137 if ( !empty( afterDecls ) ) { splice( std::back_inserter( statements ), afterDecls); }
[134322e]138 if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); }
139 if ( !errors.isEmpty() ) { throw errors; }
[296b2be]140}
141
142template< typename pass_type >
[6ca154b]143void PassVisitor< pass_type >::visitStatementList( std::list< Statement * > & statements ) {
144 handleStatementList( statements, [this]( Statement * stmt) {
145 stmt->accept( *this );
146 });
147}
[134322e]148
[6ca154b]149template< typename pass_type >
150void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) {
151 handleStatementList( statements, [this]( Statement *& stmt) {
152 stmt = stmt->acceptMutator( *this );
153 });
[134322e]154}
155
[6ca154b]156
[134322e]157template< typename pass_type >
[6ca154b]158template< typename func_t >
159Statement * PassVisitor< pass_type >::handleStatement( Statement * stmt, func_t func ) {
[134322e]160 // don't want statements from outer CompoundStmts to be added to this CompoundStmt
[6ca154b]161 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr () );
162 ValueGuardPtr< DeclList_t > oldBeforeDecls( get_beforeDecls() );
163 ValueGuardPtr< DeclList_t > oldAfterDecls ( get_afterDecls () );
164 ValueGuardPtr< StmtList_t > oldBeforeStmts( get_beforeStmts() );
165 ValueGuardPtr< StmtList_t > oldAfterStmts ( get_afterStmts () );
[296b2be]166
[6ca154b]167 Statement *newStmt = func( stmt );
[134322e]168
169 StmtList_t* beforeStmts = get_beforeStmts();
170 StmtList_t* afterStmts = get_afterStmts();
[6ca154b]171 DeclList_t* beforeDecls = get_beforeDecls();
172 DeclList_t* afterDecls = get_afterDecls();
[134322e]173
[6ca154b]174 if( empty(beforeStmts) && empty(afterStmts) && empty(beforeDecls) && empty(afterDecls) ) { return newStmt; }
175 assert(( empty( beforeStmts ) && empty( afterStmts ))
176 || ( empty( beforeDecls ) && empty( afterDecls )) );
[134322e]177
178 CompoundStmt *compound = new CompoundStmt( noLabels );
[6ca154b]179 if( !empty(beforeDecls) ) { splice( std::back_inserter( compound->get_kids() ), beforeDecls ); }
[134322e]180 if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
181 compound->get_kids().push_back( newStmt );
[6ca154b]182 if( !empty(afterDecls) ) { splice( std::back_inserter( compound->get_kids() ), afterDecls ); }
[134322e]183 if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
184 return compound;
185}
186
187template< typename pass_type >
[6ca154b]188Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) {
189 return handleStatement( stmt, [this]( Statement * stmt ) {
[d24d4e1]190 maybeAccept( stmt, *this );
[6ca154b]191 return stmt;
192 });
193}
[134322e]194
[6ca154b]195template< typename pass_type >
196Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) {
197 return handleStatement( stmt, [this]( Statement * stmt ) {
198 return maybeMutate( stmt, *this );
199 });
[296b2be]200}
201
202template< typename pass_type >
[6ca154b]203template< typename func_t >
204Expression * PassVisitor< pass_type >::handleExpression( Expression * expr, func_t func ) {
[296b2be]205 if( !expr ) return nullptr;
206
[134322e]207 auto env_ptr = get_env_ptr();
208 if ( env_ptr && expr->get_env() ) {
209 *env_ptr = expr->get_env();
[296b2be]210 }
[6ca154b]211
212 // should env be cloned (or moved) onto the result of the mutate?
213 return func( expr );
214}
215
216template< typename pass_type >
217Expression * PassVisitor< pass_type >::visitExpression( Expression * expr ) {
218 return handleExpression(expr, [this]( Expression * expr ) {
219 expr->accept( *this );
220 return expr;
[d24d4e1]221 });
[296b2be]222}
[ab904dc]223
[6ca154b]224template< typename pass_type >
225Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) {
226 return handleExpression(expr, [this]( Expression * expr ) {
227 return expr->acceptMutator( *this );
228 });
229}
[ab904dc]230
[296b2be]231//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[13932f14]232
233template< typename pass_type >
[ab904dc]234void PassVisitor< pass_type >::visit( ObjectDecl * node ) {
[4551a6e]235 VISIT_BODY( node );
[13932f14]236}
237
238template< typename pass_type >
[ab904dc]239void PassVisitor< pass_type >::visit( FunctionDecl * node ) {
[4551a6e]240 VISIT_BODY( node );
[13932f14]241}
242
243template< typename pass_type >
[ab904dc]244void PassVisitor< pass_type >::visit( StructDecl * node ) {
[4551a6e]245 VISIT_BODY( node );
[13932f14]246}
247
248template< typename pass_type >
[ab904dc]249void PassVisitor< pass_type >::visit( UnionDecl * node ) {
[4551a6e]250 VISIT_BODY( node );
[13932f14]251}
252
253template< typename pass_type >
[ab904dc]254void PassVisitor< pass_type >::visit( EnumDecl * node ) {
[4551a6e]255 VISIT_BODY( node );
[13932f14]256}
257
258template< typename pass_type >
[ab904dc]259void PassVisitor< pass_type >::visit( TraitDecl * node ) {
[4551a6e]260 VISIT_BODY( node );
[13932f14]261}
262
263template< typename pass_type >
[ab904dc]264void PassVisitor< pass_type >::visit( TypeDecl * node ) {
[4551a6e]265 VISIT_BODY( node );
[13932f14]266}
267
268template< typename pass_type >
[ab904dc]269void PassVisitor< pass_type >::visit( TypedefDecl * node ) {
[4551a6e]270 VISIT_BODY( node );
[13932f14]271}
272
273template< typename pass_type >
[ab904dc]274void PassVisitor< pass_type >::visit( AsmDecl * node ) {
[4551a6e]275 VISIT_BODY( node );
[13932f14]276}
277
[9c1600c]278//--------------------------------------------------------------------------
279// CompoundStmt
[13932f14]280template< typename pass_type >
[ab904dc]281void PassVisitor< pass_type >::visit( CompoundStmt * node ) {
[9c1600c]282 VISIT_START( node );
283 call_beginScope();
284
285 visitStatementList( node->get_kids() );
286
287 call_endScope();
288 VISIT_END( node );
[13932f14]289}
290
[296b2be]291template< typename pass_type >
292CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) {
293 MUTATE_START( node );
294 call_beginScope();
295
296 mutateStatementList( node->get_kids() );
297
298 call_endScope();
299 MUTATE_END( CompoundStmt, node );
300}
301
[9c1600c]302//--------------------------------------------------------------------------
303// ExprStmt
[13932f14]304template< typename pass_type >
[ab904dc]305void PassVisitor< pass_type >::visit( ExprStmt * node ) {
[9c1600c]306 VISIT_START( node );
307
308 visitExpression( node->get_expr() );
309
310 VISIT_END( node );
[13932f14]311}
312
[296b2be]313template< typename pass_type >
314Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) {
315 MUTATE_START( node );
316
317 node->set_expr( mutateExpression( node->get_expr() ) );
318
319 MUTATE_END( Statement, node );
320}
321
[6ca154b]322//--------------------------------------------------------------------------
323// AsmStmt
[13932f14]324template< typename pass_type >
[ab904dc]325void PassVisitor< pass_type >::visit( AsmStmt * node ) {
[4551a6e]326 VISIT_BODY( node );
[13932f14]327}
328
[6ca154b]329template< typename pass_type >
330Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) {
331 MUTATE_BODY( Statement, node );
332}
333
[9c1600c]334//--------------------------------------------------------------------------
335// IfStmt
[13932f14]336template< typename pass_type >
[ab904dc]337void PassVisitor< pass_type >::visit( IfStmt * node ) {
[4551a6e]338 VISIT_START( node );
[9c1600c]339
340 visitExpression( node->get_condition() );
341 node->set_thenPart ( visitStatement( node->get_thenPart() ) );
342 node->set_elsePart ( visitStatement( node->get_elsePart() ) );
343
344 VISIT_END( node );
[13932f14]345}
346
[296b2be]347template< typename pass_type >
348Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) {
[4551a6e]349 MUTATE_START( node );
[296b2be]350
351 node->set_condition( mutateExpression( node->get_condition() ) );
352 node->set_thenPart ( mutateStatement ( node->get_thenPart() ) );
353 node->set_elsePart ( mutateStatement ( node->get_elsePart() ) );
354
355 MUTATE_END( Statement, node );
356}
357
[9c1600c]358//--------------------------------------------------------------------------
359// WhileStmt
[13932f14]360template< typename pass_type >
[ab904dc]361void PassVisitor< pass_type >::visit( WhileStmt * node ) {
[4551a6e]362 VISIT_START( node );
[9c1600c]363
364 visitExpression( node->get_condition() );
365 node->set_body( visitStatement( node->get_body() ) );
366
367 VISIT_END( node );
[13932f14]368}
369
[296b2be]370template< typename pass_type >
371Statement * PassVisitor< pass_type >::mutate( WhileStmt * node ) {
[4551a6e]372 MUTATE_START( node );
[296b2be]373
374 node->set_condition( mutateExpression( node->get_condition() ) );
375 node->set_body( mutateStatement( node->get_body() ) );
376
377 MUTATE_END( Statement, node );
378}
379
[9c1600c]380//--------------------------------------------------------------------------
[6ca154b]381// ForStmt
[13932f14]382template< typename pass_type >
[ab904dc]383void PassVisitor< pass_type >::visit( ForStmt * node ) {
[4551a6e]384 VISIT_START( node );
[9c1600c]385
386 acceptAll( node->get_initialization(), *this );
387 visitExpression( node->get_condition() );
388 visitExpression( node->get_increment() );
389 node->set_body( visitStatement( node->get_body() ) );
390
391 VISIT_END( node );
[13932f14]392}
393
[296b2be]394template< typename pass_type >
395Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) {
[4551a6e]396 MUTATE_START( node );
[296b2be]397
398 mutateAll( node->get_initialization(), *this );
[9c1600c]399 node->set_condition( mutateExpression( node->get_condition() ) );
400 node->set_increment( mutateExpression( node->get_increment() ) );
401 node->set_body( mutateStatement( node->get_body() ) );
[296b2be]402
403 MUTATE_END( Statement, node );
404}
405
[9c1600c]406//--------------------------------------------------------------------------
407// SwitchStmt
[13932f14]408template< typename pass_type >
[ab904dc]409void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
[4551a6e]410 VISIT_START( node );
[9c1600c]411
412 visitExpression( node->get_condition() );
413 visitStatementList( node->get_statements() );
414
415 VISIT_END( node );
[13932f14]416}
417
[296b2be]418template< typename pass_type >
419Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) {
[4551a6e]420 MUTATE_START( node );
421
[296b2be]422 node->set_condition( mutateExpression( node->get_condition() ) );
423 mutateStatementList( node->get_statements() );
[4551a6e]424
[296b2be]425 MUTATE_END( Statement, node );
426}
427
[9c1600c]428//--------------------------------------------------------------------------
[35df560]429// CaseStmt
[13932f14]430template< typename pass_type >
[ab904dc]431void PassVisitor< pass_type >::visit( CaseStmt * node ) {
[4551a6e]432 VISIT_START( node );
433
[9c1600c]434 visitExpression( node->get_condition() );
435 visitStatementList( node->get_statements() );
[4551a6e]436
[9c1600c]437 VISIT_END( node );
[13932f14]438}
439
[296b2be]440template< typename pass_type >
441Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) {
[4551a6e]442 MUTATE_START( node );
443
[296b2be]444 node->set_condition( mutateExpression( node->get_condition() ) );
445 mutateStatementList( node->get_statements() );
[4551a6e]446
[296b2be]447 MUTATE_END( Statement, node );
448}
449
[6ca154b]450//--------------------------------------------------------------------------
451// BranchStmt
[13932f14]452template< typename pass_type >
[ab904dc]453void PassVisitor< pass_type >::visit( BranchStmt * node ) {
[4551a6e]454 VISIT_BODY( node );
[13932f14]455}
456
[6ca154b]457template< typename pass_type >
458Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) {
459 MUTATE_BODY( Statement, node );
460}
461
[9c1600c]462//--------------------------------------------------------------------------
463// ReturnStmt
[13932f14]464template< typename pass_type >
[ab904dc]465void PassVisitor< pass_type >::visit( ReturnStmt * node ) {
[9c1600c]466 VISIT_START( node );
467
468 visitExpression( node->get_expr() );
469
470 VISIT_END( node );
[13932f14]471}
472
[296b2be]473template< typename pass_type >
474Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) {
475 MUTATE_START( node );
476
477 node->set_expr( mutateExpression( node->get_expr() ) );
478
479 MUTATE_END( Statement, node );
480}
481
[6e09f211]482//--------------------------------------------------------------------------
483// ThrowStmt
484
485template< typename pass_type >
486void PassVisitor< pass_type >::visit( ThrowStmt * node ) {
487 VISIT_BODY( node );
488}
489
490template< typename pass_type >
491Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) {
492 MUTATE_BODY( Statement, node );
493}
494
[9c1600c]495//--------------------------------------------------------------------------
496// TryStmt
[13932f14]497template< typename pass_type >
[ab904dc]498void PassVisitor< pass_type >::visit( TryStmt * node ) {
[9c1600c]499 VISIT_START( node );
500
501 maybeAccept( node->get_block(), *this );
502 acceptAll( node->get_catchers(), *this );
[6ca154b]503 maybeAccept( node->get_finally(), *this );
[9c1600c]504
505 VISIT_END( node );
[13932f14]506}
507
[296b2be]508template< typename pass_type >
509Statement * PassVisitor< pass_type >::mutate( TryStmt * node ) {
510 MUTATE_START( node );
511
512 node->set_block( maybeMutate( node->get_block(), *this ) );
513 mutateAll( node->get_catchers(), *this );
[6ca154b]514 node->set_finally( maybeMutate( node->get_finally(), *this ) );
[4551a6e]515
[296b2be]516 MUTATE_END( Statement, node );
517}
518
[9c1600c]519//--------------------------------------------------------------------------
520// CatchStmt
[13932f14]521template< typename pass_type >
[ab904dc]522void PassVisitor< pass_type >::visit( CatchStmt * node ) {
[9c1600c]523 VISIT_START( node );
524
525 maybeAccept( node->get_decl(), *this );
[6ca154b]526 node->set_cond( visitExpression( node->get_cond() ) );
527 node->set_body( visitStatement( node->get_body() ) );
[9c1600c]528
529 VISIT_END( node );
[13932f14]530}
531
[296b2be]532template< typename pass_type >
533Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) {
534 MUTATE_START( node );
[4551a6e]535
[6ca154b]536 node->set_decl( maybeMutate( node->get_decl(), *this ) );
537 node->set_cond( mutateExpression( node->get_cond() ) );
538 node->set_body( mutateStatement( node->get_body() ) );
[4551a6e]539
[296b2be]540 MUTATE_END( Statement, node );
541}
542
[13932f14]543template< typename pass_type >
[ab904dc]544void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
[4551a6e]545 VISIT_BODY( node );
[13932f14]546}
547
548template< typename pass_type >
[ab904dc]549void PassVisitor< pass_type >::visit( NullStmt * node ) {
[4551a6e]550 VISIT_BODY( node );
[13932f14]551}
552
553template< typename pass_type >
[ab904dc]554void PassVisitor< pass_type >::visit( DeclStmt * node ) {
[4551a6e]555 VISIT_BODY( node );
[13932f14]556}
557
558template< typename pass_type >
[ab904dc]559void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) {
[4551a6e]560 VISIT_BODY( node );
[13932f14]561}
562
563template< typename pass_type >
[ab904dc]564void PassVisitor< pass_type >::visit( ApplicationExpr * node ) {
[4551a6e]565 VISIT_BODY( node );
[13932f14]566}
567
[9c1600c]568//--------------------------------------------------------------------------
569// UntypedExpr
[13932f14]570template< typename pass_type >
[ab904dc]571void PassVisitor< pass_type >::visit( UntypedExpr * node ) {
[9c1600c]572 VISIT_START( node );
573
[2a7b3ca]574 // maybeAccept( node->get_env(), *this );
575 maybeAccept( node->get_result(), *this );
576
[9c1600c]577 for ( auto expr : node->get_args() ) {
578 visitExpression( expr );
579 }
580
581 VISIT_END( node );
[13932f14]582}
583
[296b2be]584template< typename pass_type >
585Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) {
586 MUTATE_START( node );
587
[2a7b3ca]588 node->set_env( maybeMutate( node->get_env(), *this ) );
589 node->set_result( maybeMutate( node->get_result(), *this ) );
590
[296b2be]591 for ( auto& expr : node->get_args() ) {
592 expr = mutateExpression( expr );
593 }
594
595 MUTATE_END( Expression, node );
596}
597
[13932f14]598template< typename pass_type >
[ab904dc]599void PassVisitor< pass_type >::visit( NameExpr * node ) {
[4551a6e]600 VISIT_BODY( node );
[13932f14]601}
602
603template< typename pass_type >
[ab904dc]604void PassVisitor< pass_type >::visit( CastExpr * node ) {
[4551a6e]605 VISIT_BODY( node );
[13932f14]606}
607
[a5f0529]608template< typename pass_type >
609void PassVisitor< pass_type >::visit( VirtualCastExpr * node ) {
610 VISIT_BODY( node );
611}
612
[13932f14]613template< typename pass_type >
[ab904dc]614void PassVisitor< pass_type >::visit( AddressExpr * node ) {
[4551a6e]615 VISIT_BODY( node );
[13932f14]616}
617
618template< typename pass_type >
[ab904dc]619void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) {
[4551a6e]620 VISIT_BODY( node );
[13932f14]621}
622
623template< typename pass_type >
[ab904dc]624void PassVisitor< pass_type >::visit( UntypedMemberExpr * node ) {
[4551a6e]625 VISIT_BODY( node );
[13932f14]626}
627
628template< typename pass_type >
[ab904dc]629void PassVisitor< pass_type >::visit( MemberExpr * node ) {
[4551a6e]630 VISIT_BODY( node );
[13932f14]631}
632
633template< typename pass_type >
[ab904dc]634void PassVisitor< pass_type >::visit( VariableExpr * node ) {
[4551a6e]635 VISIT_BODY( node );
[13932f14]636}
637
638template< typename pass_type >
[ab904dc]639void PassVisitor< pass_type >::visit( ConstantExpr * node ) {
[4551a6e]640 VISIT_BODY( node );
[13932f14]641}
642
643template< typename pass_type >
[ab904dc]644void PassVisitor< pass_type >::visit( SizeofExpr * node ) {
[4551a6e]645 VISIT_BODY( node );
[13932f14]646}
647
648template< typename pass_type >
[ab904dc]649void PassVisitor< pass_type >::visit( AlignofExpr * node ) {
[4551a6e]650 VISIT_BODY( node );
[13932f14]651}
652
653template< typename pass_type >
[ab904dc]654void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) {
[4551a6e]655 VISIT_BODY( node );
[13932f14]656}
657
658template< typename pass_type >
[ab904dc]659void PassVisitor< pass_type >::visit( OffsetofExpr * node ) {
[4551a6e]660 VISIT_BODY( node );
[13932f14]661}
662
663template< typename pass_type >
[ab904dc]664void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) {
[4551a6e]665 VISIT_BODY( node );
[13932f14]666}
667
668template< typename pass_type >
[ab904dc]669void PassVisitor< pass_type >::visit( AttrExpr * node ) {
[4551a6e]670 VISIT_BODY( node );
[13932f14]671}
672
673template< typename pass_type >
[ab904dc]674void PassVisitor< pass_type >::visit( LogicalExpr * node ) {
[4551a6e]675 VISIT_BODY( node );
[13932f14]676}
677
678template< typename pass_type >
[ab904dc]679void PassVisitor< pass_type >::visit( ConditionalExpr * node ) {
[4551a6e]680 VISIT_BODY( node );
[13932f14]681}
682
683template< typename pass_type >
[ab904dc]684void PassVisitor< pass_type >::visit( CommaExpr * node ) {
[4551a6e]685 VISIT_BODY( node );
[13932f14]686}
687
688template< typename pass_type >
[ab904dc]689void PassVisitor< pass_type >::visit( TypeExpr * node ) {
[4551a6e]690 VISIT_BODY( node );
[13932f14]691}
692
693template< typename pass_type >
[ab904dc]694void PassVisitor< pass_type >::visit( AsmExpr * node ) {
[4551a6e]695 VISIT_BODY( node );
[13932f14]696}
697
698template< typename pass_type >
[ab904dc]699void PassVisitor< pass_type >::visit( ImplicitCopyCtorExpr * node ) {
[4551a6e]700 VISIT_BODY( node );
[13932f14]701}
702
703template< typename pass_type >
[ab904dc]704void PassVisitor< pass_type >::visit( ConstructorExpr * node ) {
[4551a6e]705 VISIT_BODY( node );
[13932f14]706}
707
708template< typename pass_type >
[ab904dc]709void PassVisitor< pass_type >::visit( CompoundLiteralExpr * node ) {
[af5c204a]710 VISIT_BODY( node );
[13932f14]711}
712
713template< typename pass_type >
[ab904dc]714void PassVisitor< pass_type >::visit( RangeExpr * node ) {
[4551a6e]715 VISIT_BODY( node );
[13932f14]716}
717
718template< typename pass_type >
[ab904dc]719void PassVisitor< pass_type >::visit( UntypedTupleExpr * node ) {
[4551a6e]720 VISIT_BODY( node );
[13932f14]721}
722
723template< typename pass_type >
[ab904dc]724void PassVisitor< pass_type >::visit( TupleExpr * node ) {
[4551a6e]725 VISIT_BODY( node );
[13932f14]726}
727
728template< typename pass_type >
[ab904dc]729void PassVisitor< pass_type >::visit( TupleIndexExpr * node ) {
[4551a6e]730 VISIT_BODY( node );
[13932f14]731}
732
733template< typename pass_type >
[ab904dc]734void PassVisitor< pass_type >::visit( TupleAssignExpr * node ) {
[4551a6e]735 VISIT_BODY( node );
[13932f14]736}
737
[9c1600c]738//--------------------------------------------------------------------------
739// UntypedExpr
[13932f14]740template< typename pass_type >
[ab904dc]741void PassVisitor< pass_type >::visit( StmtExpr * node ) {
[9c1600c]742 VISIT_START( node );
743
744 // don't want statements from outer CompoundStmts to be added to this StmtExpr
745 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() );
746 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
747 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
748
749 Visitor::visit( node );
750
751 VISIT_END( node );
[13932f14]752}
753
[296b2be]754template< typename pass_type >
755Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) {
756 MUTATE_START( node );
[4551a6e]757
[296b2be]758 // don't want statements from outer CompoundStmts to be added to this StmtExpr
[134322e]759 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() );
760 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
761 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[296b2be]762
763 Mutator::mutate( node );
764
765 MUTATE_END( Expression, node );
766}
767
[13932f14]768template< typename pass_type >
[ab904dc]769void PassVisitor< pass_type >::visit( UniqueExpr * node ) {
[4551a6e]770 VISIT_BODY( node );
[13932f14]771}
772
773template< typename pass_type >
[ab904dc]774void PassVisitor< pass_type >::visit( VoidType * node ) {
[4551a6e]775 VISIT_BODY( node );
[13932f14]776}
777
778template< typename pass_type >
[ab904dc]779void PassVisitor< pass_type >::visit( BasicType * node ) {
[4551a6e]780 VISIT_BODY( node );
[13932f14]781}
782
783template< typename pass_type >
[ab904dc]784void PassVisitor< pass_type >::visit( PointerType * node ) {
[4551a6e]785 VISIT_BODY( node );
[13932f14]786}
787
788template< typename pass_type >
[ab904dc]789void PassVisitor< pass_type >::visit( ArrayType * node ) {
[4551a6e]790 VISIT_BODY( node );
[13932f14]791}
792
793template< typename pass_type >
[ab904dc]794void PassVisitor< pass_type >::visit( FunctionType * node ) {
[4551a6e]795 VISIT_BODY( node );
[13932f14]796}
797
798template< typename pass_type >
[ab904dc]799void PassVisitor< pass_type >::visit( StructInstType * node ) {
[4551a6e]800 VISIT_BODY( node );
[13932f14]801}
802
803template< typename pass_type >
[ab904dc]804void PassVisitor< pass_type >::visit( UnionInstType * node ) {
[4551a6e]805 VISIT_BODY( node );
[13932f14]806}
807
808template< typename pass_type >
[ab904dc]809void PassVisitor< pass_type >::visit( EnumInstType * node ) {
[4551a6e]810 VISIT_BODY( node );
[13932f14]811}
812
813template< typename pass_type >
[ab904dc]814void PassVisitor< pass_type >::visit( TraitInstType * node ) {
[4551a6e]815 VISIT_BODY( node );
[13932f14]816}
817
818template< typename pass_type >
[ab904dc]819void PassVisitor< pass_type >::visit( TypeInstType * node ) {
[4551a6e]820 VISIT_BODY( node );
[13932f14]821}
822
823template< typename pass_type >
[ab904dc]824void PassVisitor< pass_type >::visit( TupleType * node ) {
[4551a6e]825 VISIT_BODY( node );
[13932f14]826}
827
828template< typename pass_type >
[ab904dc]829void PassVisitor< pass_type >::visit( TypeofType * node ) {
[4551a6e]830 VISIT_BODY( node );
[13932f14]831}
832
833template< typename pass_type >
[ab904dc]834void PassVisitor< pass_type >::visit( AttrType * node ) {
[4551a6e]835 VISIT_BODY( node );
[13932f14]836}
837
838template< typename pass_type >
[ab904dc]839void PassVisitor< pass_type >::visit( VarArgsType * node ) {
[4551a6e]840 VISIT_BODY( node );
[13932f14]841}
842
843template< typename pass_type >
[ab904dc]844void PassVisitor< pass_type >::visit( ZeroType * node ) {
[4551a6e]845 VISIT_BODY( node );
[13932f14]846}
847
848template< typename pass_type >
[ab904dc]849void PassVisitor< pass_type >::visit( OneType * node ) {
[4551a6e]850 VISIT_BODY( node );
[13932f14]851}
852
[9c1600c]853//--------------------------------------------------------------------------
854// UntypedExpr
[13932f14]855template< typename pass_type >
[ab904dc]856void PassVisitor< pass_type >::visit( SingleInit * node ) {
[9c1600c]857 VISIT_START( node );
858
859 visitExpression( node->get_value() );
860
861 VISIT_END( node );
[13932f14]862}
863
[296b2be]864template< typename pass_type >
865Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) {
866 MUTATE_START( node );
867
868 node->set_value( mutateExpression( node->get_value() ) );
869
870 MUTATE_END( Initializer, node );
871}
872
[13932f14]873template< typename pass_type >
[ab904dc]874void PassVisitor< pass_type >::visit( ListInit * node ) {
[4551a6e]875 VISIT_BODY( node );
[13932f14]876}
877
878template< typename pass_type >
[ab904dc]879void PassVisitor< pass_type >::visit( ConstructorInit * node ) {
[4551a6e]880 VISIT_BODY( node );
[13932f14]881}
882
883template< typename pass_type >
[ab904dc]884void PassVisitor< pass_type >::visit( Subrange * node ) {
[4551a6e]885 VISIT_BODY( node );
[13932f14]886}
887
888template< typename pass_type >
[ab904dc]889void PassVisitor< pass_type >::visit( Constant * node ) {
[4551a6e]890 VISIT_BODY( node );
[13932f14]891}
[ab904dc]892
893//---------------------------------------------------------------------------------------------------------------
894
895template< typename pass_type >
896DeclarationWithType * PassVisitor< pass_type >::mutate( ObjectDecl * node ) {
897 MUTATE_BODY( DeclarationWithType, node );
898}
899
900template< typename pass_type >
901DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) {
902 MUTATE_BODY( DeclarationWithType, node );
903}
904
905template< typename pass_type >
906Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) {
907 MUTATE_BODY( Declaration, node );
908}
909
910template< typename pass_type >
911Declaration * PassVisitor< pass_type >::mutate( UnionDecl * node ) {
912 MUTATE_BODY( Declaration, node );
913}
914
915template< typename pass_type >
916Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) {
917 MUTATE_BODY( Declaration, node );
918}
919
920template< typename pass_type >
921Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) {
922 MUTATE_BODY( Declaration, node );
923}
924
925template< typename pass_type >
926TypeDecl * PassVisitor< pass_type >::mutate( TypeDecl * node ) {
927 MUTATE_BODY( TypeDecl, node );
928}
929
930template< typename pass_type >
931Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) {
932 MUTATE_BODY( Declaration, node );
933}
934
935template< typename pass_type >
936AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) {
937 MUTATE_BODY( AsmDecl, node );
938}
939
940template< typename pass_type >
941Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
942 MUTATE_BODY( Statement, node );
943}
944
945template< typename pass_type >
946NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) {
947 MUTATE_BODY( NullStmt, node );
948}
949
950template< typename pass_type >
951Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) {
952 MUTATE_BODY( Statement, node );
953}
954
955template< typename pass_type >
956Statement * PassVisitor< pass_type >::mutate( ImplicitCtorDtorStmt * node ) {
957 MUTATE_BODY( Statement, node );
958}
959
960template< typename pass_type >
961Expression * PassVisitor< pass_type >::mutate( ApplicationExpr * node ) {
962 MUTATE_BODY( Expression, node );
963}
964
965template< typename pass_type >
966Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) {
967 MUTATE_BODY( Expression, node );
968}
969
970template< typename pass_type >
971Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) {
972 MUTATE_BODY( Expression, node );
973}
974
975template< typename pass_type >
976Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) {
977 MUTATE_BODY( Expression, node );
978}
979
980template< typename pass_type >
981Expression * PassVisitor< pass_type >::mutate( CastExpr * node ) {
982 MUTATE_BODY( Expression, node );
983}
984
[a5f0529]985template< typename pass_type >
986Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) {
987 MUTATE_BODY( Expression, node );
988}
989
[ab904dc]990template< typename pass_type >
991Expression * PassVisitor< pass_type >::mutate( UntypedMemberExpr * node ) {
992 MUTATE_BODY( Expression, node );
993}
994
995template< typename pass_type >
996Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) {
997 MUTATE_BODY( Expression, node );
998}
999
1000template< typename pass_type >
1001Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) {
1002 MUTATE_BODY( Expression, node );
1003}
1004
1005template< typename pass_type >
1006Expression * PassVisitor< pass_type >::mutate( ConstantExpr * node ) {
1007 MUTATE_BODY( Expression, node );
1008}
1009
1010template< typename pass_type >
1011Expression * PassVisitor< pass_type >::mutate( SizeofExpr * node ) {
1012 MUTATE_BODY( Expression, node );
1013}
1014
1015template< typename pass_type >
1016Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) {
1017 MUTATE_BODY( Expression, node );
1018}
1019
1020template< typename pass_type >
1021Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) {
1022 MUTATE_BODY( Expression, node );
1023}
1024
1025template< typename pass_type >
1026Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) {
1027 MUTATE_BODY( Expression, node );
1028}
1029
1030template< typename pass_type >
1031Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) {
1032 MUTATE_BODY( Expression, node );
1033}
1034
1035template< typename pass_type >
1036Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) {
1037 MUTATE_BODY( Expression, node );
1038}
1039
1040template< typename pass_type >
1041Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) {
1042 MUTATE_BODY( Expression, node );
1043}
1044
1045template< typename pass_type >
1046Expression * PassVisitor< pass_type >::mutate( ConditionalExpr * node ) {
1047 MUTATE_BODY( Expression, node );
1048}
1049
1050template< typename pass_type >
1051Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) {
1052 MUTATE_BODY( Expression, node );
1053}
1054
1055template< typename pass_type >
1056Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) {
1057 MUTATE_BODY( Expression, node );
1058}
1059
1060template< typename pass_type >
1061Expression * PassVisitor< pass_type >::mutate( AsmExpr * node ) {
1062 MUTATE_BODY( Expression, node );
1063}
1064
1065template< typename pass_type >
1066Expression * PassVisitor< pass_type >::mutate( ImplicitCopyCtorExpr * node ) {
1067 MUTATE_BODY( Expression, node );
1068}
1069
1070template< typename pass_type >
1071Expression * PassVisitor< pass_type >::mutate( ConstructorExpr * node ) {
1072 MUTATE_BODY( Expression, node );
1073}
1074
1075template< typename pass_type >
1076Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) {
1077 MUTATE_BODY( Expression, node );
1078}
1079
1080template< typename pass_type >
1081Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) {
1082 MUTATE_BODY( Expression, node );
1083}
1084
1085template< typename pass_type >
1086Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) {
1087 MUTATE_BODY( Expression, node );
1088}
1089
1090template< typename pass_type >
1091Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) {
1092 MUTATE_BODY( Expression, node );
1093}
1094
1095template< typename pass_type >
1096Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) {
1097 MUTATE_BODY( Expression, node );
1098}
1099
1100template< typename pass_type >
1101Expression * PassVisitor< pass_type >::mutate( TupleAssignExpr * node ) {
1102 MUTATE_BODY( Expression, node );
1103}
1104
1105template< typename pass_type >
1106Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) {
1107 MUTATE_BODY( Expression, node );
1108}
1109
1110template< typename pass_type >
1111Type * PassVisitor< pass_type >::mutate( VoidType * node ) {
1112 MUTATE_BODY( Type, node );
1113}
1114
1115template< typename pass_type >
1116Type * PassVisitor< pass_type >::mutate( BasicType * node ) {
1117 MUTATE_BODY( Type, node );
1118}
1119
1120template< typename pass_type >
1121Type * PassVisitor< pass_type >::mutate( PointerType * node ) {
1122 MUTATE_BODY( Type, node );
1123}
1124
1125template< typename pass_type >
1126Type * PassVisitor< pass_type >::mutate( ArrayType * node ) {
1127 MUTATE_BODY( Type, node );
1128}
1129
1130template< typename pass_type >
1131Type * PassVisitor< pass_type >::mutate( FunctionType * node ) {
1132 MUTATE_BODY( Type, node );
1133}
1134
1135template< typename pass_type >
1136Type * PassVisitor< pass_type >::mutate( StructInstType * node ) {
1137 MUTATE_BODY( Type, node );
1138}
1139
1140template< typename pass_type >
1141Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) {
1142 MUTATE_BODY( Type, node );
1143}
1144
1145template< typename pass_type >
1146Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) {
1147 MUTATE_BODY( Type, node );
1148}
1149
1150template< typename pass_type >
1151Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) {
1152 MUTATE_BODY( Type, node );
1153}
1154
1155template< typename pass_type >
1156Type * PassVisitor< pass_type >::mutate( TypeInstType * node ) {
1157 MUTATE_BODY( Type, node );
1158}
1159
1160template< typename pass_type >
1161Type * PassVisitor< pass_type >::mutate( TupleType * node ) {
1162 MUTATE_BODY( Type, node );
1163}
1164
1165template< typename pass_type >
1166Type * PassVisitor< pass_type >::mutate( TypeofType * node ) {
1167 MUTATE_BODY( Type, node );
1168}
1169
1170template< typename pass_type >
1171Type * PassVisitor< pass_type >::mutate( AttrType * node ) {
1172 MUTATE_BODY( Type, node );
1173}
1174
1175template< typename pass_type >
1176Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) {
1177 MUTATE_BODY( Type, node );
1178}
1179
1180template< typename pass_type >
1181Type * PassVisitor< pass_type >::mutate( ZeroType * node ) {
1182 MUTATE_BODY( Type, node );
1183}
1184
1185template< typename pass_type >
1186Type * PassVisitor< pass_type >::mutate( OneType * node ) {
1187 MUTATE_BODY( Type, node );
1188}
1189
1190template< typename pass_type >
1191Initializer * PassVisitor< pass_type >::mutate( ListInit * node ) {
1192 MUTATE_BODY( Initializer, node );
1193}
1194
1195template< typename pass_type >
1196Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) {
1197 MUTATE_BODY( Initializer, node );
1198}
1199
1200template< typename pass_type >
1201Subrange * PassVisitor< pass_type >::mutate( Subrange * node ) {
1202 MUTATE_BODY( Subrange, node );
1203}
1204
1205template< typename pass_type >
1206Constant * PassVisitor< pass_type >::mutate( Constant * node ) {
1207 MUTATE_BODY( Constant, node );
[4551a6e]1208}
Note: See TracBrowser for help on using the repository browser.