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

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since b0f7a43 was 62423350, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Big push on designations and initialization: works with generic types, tuples, arrays, tests pass.
Refactor guard_value_impl.
Add list of declarations to TupleType?.

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