Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Pass.impl.hpp

    r4ec9513 reb211bf  
    354354                        // Take all the elements that are different in 'values'
    355355                        // and swap them into 'container'
    356                         if( values[i] != nullptr ) swap(container[i], values[i]);
     356                        if( values[i] != nullptr ) std::swap(container[i], values[i]);
    357357                }
    358358
     
    399399
    400400        template< typename core_t >
    401         template<typename node_t, typename super_t, typename field_t>
     401        template<typename node_t, typename parent_t, typename child_t>
    402402        void ast::Pass< core_t >::maybe_accept(
    403403                const node_t * & parent,
    404                 field_t super_t::*field
     404                child_t parent_t::*child
    405405        ) {
    406                 static_assert( std::is_base_of<super_t, node_t>::value, "Error deducing member object" );
    407 
    408                 if(__pass::skip(parent->*field)) return;
    409                 const auto & old_val = __pass::get(parent->*field, 0);
     406                static_assert( std::is_base_of<parent_t, node_t>::value, "Error deducing member object" );
     407
     408                if(__pass::skip(parent->*child)) return;
     409                const auto & old_val = __pass::get(parent->*child, 0);
    410410
    411411                static_assert( !std::is_same<const ast::Node * &, decltype(old_val)>::value, "ERROR");
     
    417417                if( new_val.differs ) {
    418418                        auto new_parent = __pass::mutate<core_t>(parent);
    419                         new_val.apply(new_parent, field);
     419                        new_val.apply(new_parent, child);
    420420                        parent = new_parent;
    421421                }
     
    423423
    424424        template< typename core_t >
    425         template<typename node_t, typename super_t, typename field_t>
     425        template<typename node_t, typename parent_t, typename child_t>
    426426        void ast::Pass< core_t >::maybe_accept_as_compound(
    427427                const node_t * & parent,
    428                 field_t super_t::*child
     428                child_t parent_t::*child
    429429        ) {
    430                 static_assert( std::is_base_of<super_t, node_t>::value, "Error deducing member object" );
     430                static_assert( std::is_base_of<parent_t, node_t>::value, "Error deducing member object" );
    431431
    432432                if(__pass::skip(parent->*child)) return;
     
    575575                        __pass::symtab::addId( core, 0, func );
    576576                        if ( __visit_children() ) {
     577                                // parameter declarations
     578                                maybe_accept( node, &FunctionDecl::params );
     579                                maybe_accept( node, &FunctionDecl::returns );
     580                                // type params and assertions
    577581                                maybe_accept( node, &FunctionDecl::type_params );
    578582                                maybe_accept( node, &FunctionDecl::assertions );
    579                                 maybe_accept( node, &FunctionDecl::params );
    580                                 maybe_accept( node, &FunctionDecl::returns );
    581                                 maybe_accept( node, &FunctionDecl::type );
    582583                                // First remember that we are now within a function.
    583584                                ValueGuard< bool > oldInFunction( inFunction );
     
    892893        if ( __visit_children() ) {
    893894                maybe_accept( node, &SwitchStmt::cond  );
    894                 maybe_accept( node, &SwitchStmt::cases );
     895                maybe_accept( node, &SwitchStmt::stmts );
    895896        }
    896897
     
    899900
    900901//--------------------------------------------------------------------------
    901 // CaseClause
    902 template< typename core_t >
    903 const ast::CaseClause * ast::Pass< core_t >::visit( const ast::CaseClause * node ) {
    904         VISIT_START( node );
    905 
    906         if ( __visit_children() ) {
    907                 maybe_accept( node, &CaseClause::cond  );
    908                 maybe_accept( node, &CaseClause::stmts );
    909         }
    910 
    911         VISIT_END( CaseClause, node );
     902// CaseStmt
     903template< typename core_t >
     904const ast::Stmt * ast::Pass< core_t >::visit( const ast::CaseStmt * node ) {
     905        VISIT_START( node );
     906
     907        if ( __visit_children() ) {
     908                maybe_accept( node, &CaseStmt::cond  );
     909                maybe_accept( node, &CaseStmt::stmts );
     910        }
     911
     912        VISIT_END( Stmt, node );
    912913}
    913914
     
    963964
    964965//--------------------------------------------------------------------------
    965 // CatchClause
    966 template< typename core_t >
    967 const ast::CatchClause * ast::Pass< core_t >::visit( const ast::CatchClause * node ) {
     966// CatchStmt
     967template< typename core_t >
     968const ast::Stmt * ast::Pass< core_t >::visit( const ast::CatchStmt * node ) {
    968969        VISIT_START( node );
    969970
     
    971972                // catch statements introduce a level of scope (for the caught exception)
    972973                guard_symtab guard { *this };
    973                 maybe_accept( node, &CatchClause::decl );
    974                 maybe_accept( node, &CatchClause::cond );
    975                 maybe_accept_as_compound( node, &CatchClause::body );
    976         }
    977 
    978         VISIT_END( CatchClause, node );
    979 }
    980 
    981 //--------------------------------------------------------------------------
    982 // FinallyClause
    983 template< typename core_t >
    984 const ast::FinallyClause * ast::Pass< core_t >::visit( const ast::FinallyClause * node ) {
    985         VISIT_START( node );
    986 
    987         if ( __visit_children() ) {
    988                 maybe_accept( node, &FinallyClause::body );
    989         }
    990 
    991         VISIT_END( FinallyClause, node );
     974                maybe_accept( node, &CatchStmt::decl );
     975                maybe_accept( node, &CatchStmt::cond );
     976                maybe_accept_as_compound( node, &CatchStmt::body );
     977        }
     978
     979        VISIT_END( Stmt, node );
     980}
     981
     982//--------------------------------------------------------------------------
     983// FinallyStmt
     984template< typename core_t >
     985const ast::Stmt * ast::Pass< core_t >::visit( const ast::FinallyStmt * node ) {
     986        VISIT_START( node );
     987
     988        if ( __visit_children() ) {
     989                maybe_accept( node, &FinallyStmt::body );
     990        }
     991
     992        VISIT_END( Stmt, node );
    992993}
    993994
     
    10531054                        auto n = __pass::mutate<core_t>(node);
    10541055                        for(size_t i = 0; i < new_clauses.size(); i++) {
    1055                                 if(new_clauses.at(i).target.func != nullptr) swap(n->clauses.at(i).target.func, new_clauses.at(i).target.func);
     1056                                if(new_clauses.at(i).target.func != nullptr) std::swap(n->clauses.at(i).target.func, new_clauses.at(i).target.func);
    10561057
    10571058                                for(size_t j = 0; j < new_clauses.at(i).target.args.size(); j++) {
    1058                                         if(new_clauses.at(i).target.args.at(j) != nullptr) swap(n->clauses.at(i).target.args.at(j), new_clauses.at(i).target.args.at(j));
     1059                                        if(new_clauses.at(i).target.args.at(j) != nullptr) std::swap(n->clauses.at(i).target.args.at(j), new_clauses.at(i).target.args.at(j));
    10591060                                }
    10601061
    1061                                 if(new_clauses.at(i).stmt != nullptr) swap(n->clauses.at(i).stmt, new_clauses.at(i).stmt);
    1062                                 if(new_clauses.at(i).cond != nullptr) swap(n->clauses.at(i).cond, new_clauses.at(i).cond);
     1062                                if(new_clauses.at(i).stmt != nullptr) std::swap(n->clauses.at(i).stmt, new_clauses.at(i).stmt);
     1063                                if(new_clauses.at(i).cond != nullptr) std::swap(n->clauses.at(i).cond, new_clauses.at(i).cond);
    10631064                        }
    10641065                        node = n;
     
    15151516                }
    15161517                maybe_accept( node, &TypeExpr::type );
    1517         }
    1518 
    1519         VISIT_END( Expr, node );
    1520 }
    1521 
    1522 //--------------------------------------------------------------------------
    1523 // DimensionExpr
    1524 template< typename core_t >
    1525 const ast::Expr * ast::Pass< core_t >::visit( const ast::DimensionExpr * node ) {
    1526         VISIT_START( node );
    1527 
    1528         if ( __visit_children() ) {
    1529                 guard_symtab guard { *this };
    1530                 maybe_accept( node, &DimensionExpr::result );
    15311518        }
    15321519
     
    18721859
    18731860        if ( __visit_children() ) {
    1874                 maybe_accept( node, &PointerType::dimension );
     1861                // xxx - should PointerType visit/mutate dimension?
    18751862                maybe_accept( node, &PointerType::base );
    18761863        }
     
    21642151
    21652152        if ( __visit_children() ) {
    2166                 bool mutated = false;
    2167                 std::unordered_map< ast::TypeInstType::TypeEnvKey, ast::ptr< ast::Type > > new_map;
    2168                 for ( const auto & p : node->typeEnv ) {
    2169                         guard_symtab guard { *this };
    2170                         auto new_node = p.second->accept( *this );
    2171                         if (new_node != p.second) mutated = true;
    2172                         new_map.insert({ p.first, new_node });
    2173                 }
    2174                 if (mutated) {
    2175                         auto new_node = __pass::mutate<core_t>( node );
    2176                         new_node->typeEnv.swap( new_map );
    2177                         node = new_node;
     2153                {
     2154                        bool mutated = false;
     2155                        std::unordered_map< ast::TypeInstType::TypeEnvKey, ast::ptr< ast::Type > > new_map;
     2156                        for ( const auto & p : node->typeEnv ) {
     2157                                guard_symtab guard { *this };
     2158                                auto new_node = p.second->accept( *this );
     2159                                if (new_node != p.second) mutated = true;
     2160                                new_map.insert({ p.first, new_node });
     2161                        }
     2162                        if (mutated) {
     2163                                auto new_node = __pass::mutate<core_t>( node );
     2164                                new_node->typeEnv.swap( new_map );
     2165                                node = new_node;
     2166                        }
    21782167                }
    21792168        }
Note: See TracChangeset for help on using the changeset viewer.