Ignore:
Timestamp:
Jun 2, 2017, 11:23:13 AM (7 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
acd738aa
Parents:
676cc8c
Message:

PassVisitor? now supports adding statements and using the environment when visiting as well as mutating

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/PassVisitor.impl.h

    r676cc8c r9c1600c  
    11#pragma once
     2
     3#define VISIT_START( node )  \
     4        call_previsit( node ); \
     5
     6#define VISIT_END( node )                \
     7        return call_postvisit( node ); \
    28
    39#define MUTATE_START( node )  \
    410        call_premutate( node ); \
    511
    6 
    712#define MUTATE_END( type, node )                \
    813        return call_postmutate< type * >( node ); \
     
    1015
    1116#define VISIT_BODY( node )    \
    12         call_previsit( node );  \
     17        VISIT_START( node );  \
    1318        Visitor::visit( node ); \
    14         call_postvisit( node ); \
     19        VISIT_END( node ); \
    1520
    1621
     
    3944                if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
    4045                try {
    41                         *i = (*i)->accept( *this );
     46                        (*i)->accept( *this );
    4247                } catch ( SemanticError &e ) {
    4348                        errors.append( e );
     
    7883        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
    7984
    80         Statement *newStmt = maybeVisit( stmt, *this );
     85        maybeAccept( stmt, *this );
    8186
    8287        StmtList_t* beforeStmts = get_beforeStmts();
    8388        StmtList_t* afterStmts  = get_afterStmts();
    8489
    85         if( empty(beforeStmts) && empty(afterStmts) ) { return newStmt; }
     90        if( empty(beforeStmts) && empty(afterStmts) ) { return stmt; }
    8691
    8792        CompoundStmt *compound = new CompoundStmt( noLabels );
    8893        if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
    89         compound->get_kids().push_back( newStmt );
     94        compound->get_kids().push_back( stmt );
    9095        if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
    9196        return compound;
     
    187192}
    188193
     194//--------------------------------------------------------------------------
     195// CompoundStmt
    189196template< typename pass_type >
    190197void PassVisitor< pass_type >::visit( CompoundStmt * node ) {
    191         VISIT_BODY( node );
     198        VISIT_START( node );
     199        call_beginScope();
     200
     201        visitStatementList( node->get_kids() );
     202
     203        call_endScope();
     204        VISIT_END( node );
    192205}
    193206
     
    203216}
    204217
     218//--------------------------------------------------------------------------
     219// ExprStmt
    205220template< typename pass_type >
    206221void PassVisitor< pass_type >::visit( ExprStmt * node ) {
    207         VISIT_BODY( node );
     222        VISIT_START( node );
     223        call_beginScope();
     224
     225        visitExpression( node->get_expr() );
     226
     227        call_endScope();
     228        VISIT_END( node );
    208229}
    209230
     
    222243}
    223244
     245//--------------------------------------------------------------------------
     246// IfStmt
    224247template< typename pass_type >
    225248void PassVisitor< pass_type >::visit( IfStmt * node ) {
    226         VISIT_BODY( node );
     249        VISIT_START( node );
     250
     251        visitExpression( node->get_condition() );
     252        node->set_thenPart ( visitStatement( node->get_thenPart() ) );
     253        node->set_elsePart ( visitStatement( node->get_elsePart() ) );
     254
     255        VISIT_END( node );
    227256}
    228257
     
    238267}
    239268
     269//--------------------------------------------------------------------------
     270// WhileStmt
    240271template< typename pass_type >
    241272void PassVisitor< pass_type >::visit( WhileStmt * node ) {
    242         VISIT_BODY( node );
     273        VISIT_START( node );
     274
     275        visitExpression( node->get_condition() );
     276        node->set_body( visitStatement( node->get_body() ) );
     277
     278        VISIT_END( node );
    243279}
    244280
     
    253289}
    254290
    255 
     291//--------------------------------------------------------------------------
     292// WhileStmt
    256293template< typename pass_type >
    257294void PassVisitor< pass_type >::visit( ForStmt * node ) {
    258         VISIT_BODY( node );
     295        VISIT_START( node );
     296
     297        acceptAll( node->get_initialization(), *this );
     298        visitExpression( node->get_condition() );
     299        visitExpression( node->get_increment() );
     300        node->set_body( visitStatement( node->get_body() ) );
     301
     302        VISIT_END( node );
    259303}
    260304
     
    264308
    265309        mutateAll( node->get_initialization(), *this );
    266         node->set_condition(  mutateExpression( node->get_condition() ) );
    267         node->set_increment(  mutateExpression( node->get_increment() ) );
    268         node->set_body(  mutateStatement( node->get_body() ) );
     310        node->set_condition( mutateExpression( node->get_condition() ) );
     311        node->set_increment( mutateExpression( node->get_increment() ) );
     312        node->set_body( mutateStatement( node->get_body() ) );
    269313
    270314        MUTATE_END( Statement, node );
    271315}
    272316
     317//--------------------------------------------------------------------------
     318// SwitchStmt
    273319template< typename pass_type >
    274320void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
    275         VISIT_BODY( node );
     321        VISIT_START( node );
     322
     323        visitExpression( node->get_condition() );
     324        visitStatementList( node->get_statements() );
     325
     326        VISIT_END( node );
    276327}
    277328
     
    286337}
    287338
     339//--------------------------------------------------------------------------
     340// SwitchStmt
    288341template< typename pass_type >
    289342void PassVisitor< pass_type >::visit( CaseStmt * node ) {
    290         VISIT_BODY( node );
     343        VISIT_START( node );
     344       
     345        visitExpression( node->get_condition() );
     346        visitStatementList( node->get_statements() );
     347       
     348        VISIT_END( node );
    291349}
    292350
     
    306364}
    307365
     366//--------------------------------------------------------------------------
     367// ReturnStmt
    308368template< typename pass_type >
    309369void PassVisitor< pass_type >::visit( ReturnStmt * node ) {
    310         VISIT_BODY( node );
     370        VISIT_START( node );
     371
     372        visitExpression( node->get_expr() );
     373
     374        VISIT_END( node );
    311375}
    312376
     
    320384}
    321385
     386//--------------------------------------------------------------------------
     387// TryStmt
    322388template< typename pass_type >
    323389void PassVisitor< pass_type >::visit( TryStmt * node ) {
    324         VISIT_BODY( node );
     390        VISIT_START( node );
     391
     392        maybeAccept( node->get_block(), *this );
     393        acceptAll( node->get_catchers(), *this );
     394
     395        VISIT_END( node );
    325396}
    326397
     
    335406}
    336407
     408//--------------------------------------------------------------------------
     409// CatchStmt
    337410template< typename pass_type >
    338411void PassVisitor< pass_type >::visit( CatchStmt * node ) {
    339         VISIT_BODY( node );
     412        VISIT_START( node );
     413
     414        node->set_body( visitStatement( node->get_body() ) );
     415        maybeAccept( node->get_decl(), *this );
     416
     417        VISIT_END( node );
    340418}
    341419
     
    375453}
    376454
     455//--------------------------------------------------------------------------
     456// UntypedExpr
    377457template< typename pass_type >
    378458void PassVisitor< pass_type >::visit( UntypedExpr * node ) {
    379         VISIT_BODY( node );
     459        VISIT_START( node );
     460
     461        for ( auto expr : node->get_args() ) {
     462                visitExpression( expr );
     463        }
     464
     465        VISIT_END( node );
    380466}
    381467
     
    536622}
    537623
     624//--------------------------------------------------------------------------
     625// UntypedExpr
    538626template< typename pass_type >
    539627void PassVisitor< pass_type >::visit( StmtExpr * node ) {
    540         VISIT_BODY( node );
     628        VISIT_START( node );
     629
     630        // don't want statements from outer CompoundStmts to be added to this StmtExpr
     631        ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
     632        ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
     633        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
     634
     635        Visitor::visit( node );
     636
     637        VISIT_END( node );
    541638}
    542639
     
    640737}
    641738
     739//--------------------------------------------------------------------------
     740// UntypedExpr
    642741template< typename pass_type >
    643742void PassVisitor< pass_type >::visit( SingleInit * node ) {
    644         VISIT_BODY( node );
     743        VISIT_START( node );
     744
     745        visitExpression( node->get_value() );
     746
     747        VISIT_END( node );
    645748}
    646749
Note: See TracChangeset for help on using the changeset viewer.