Changes in src/AST/Pass.impl.hpp [4ec9513:eb211bf]
- File:
-
- 1 edited
-
src/AST/Pass.impl.hpp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.impl.hpp
r4ec9513 reb211bf 354 354 // Take all the elements that are different in 'values' 355 355 // and swap them into 'container' 356 if( values[i] != nullptr ) s wap(container[i], values[i]);356 if( values[i] != nullptr ) std::swap(container[i], values[i]); 357 357 } 358 358 … … 399 399 400 400 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> 402 402 void ast::Pass< core_t >::maybe_accept( 403 403 const node_t * & parent, 404 field_t super_t::*field404 child_t parent_t::*child 405 405 ) { 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); 410 410 411 411 static_assert( !std::is_same<const ast::Node * &, decltype(old_val)>::value, "ERROR"); … … 417 417 if( new_val.differs ) { 418 418 auto new_parent = __pass::mutate<core_t>(parent); 419 new_val.apply(new_parent, field);419 new_val.apply(new_parent, child); 420 420 parent = new_parent; 421 421 } … … 423 423 424 424 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> 426 426 void ast::Pass< core_t >::maybe_accept_as_compound( 427 427 const node_t * & parent, 428 field_t super_t::*child428 child_t parent_t::*child 429 429 ) { 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" ); 431 431 432 432 if(__pass::skip(parent->*child)) return; … … 575 575 __pass::symtab::addId( core, 0, func ); 576 576 if ( __visit_children() ) { 577 // parameter declarations 578 maybe_accept( node, &FunctionDecl::params ); 579 maybe_accept( node, &FunctionDecl::returns ); 580 // type params and assertions 577 581 maybe_accept( node, &FunctionDecl::type_params ); 578 582 maybe_accept( node, &FunctionDecl::assertions ); 579 maybe_accept( node, &FunctionDecl::params );580 maybe_accept( node, &FunctionDecl::returns );581 maybe_accept( node, &FunctionDecl::type );582 583 // First remember that we are now within a function. 583 584 ValueGuard< bool > oldInFunction( inFunction ); … … 892 893 if ( __visit_children() ) { 893 894 maybe_accept( node, &SwitchStmt::cond ); 894 maybe_accept( node, &SwitchStmt:: cases );895 maybe_accept( node, &SwitchStmt::stmts ); 895 896 } 896 897 … … 899 900 900 901 //-------------------------------------------------------------------------- 901 // Case Clause902 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, &Case Clause::cond );908 maybe_accept( node, &Case Clause::stmts );909 } 910 911 VISIT_END( CaseClause, node );902 // CaseStmt 903 template< typename core_t > 904 const 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 ); 912 913 } 913 914 … … 963 964 964 965 //-------------------------------------------------------------------------- 965 // Catch Clause966 template< typename core_t > 967 const ast:: CatchClause * ast::Pass< core_t >::visit( const ast::CatchClause* node ) {966 // CatchStmt 967 template< typename core_t > 968 const ast::Stmt * ast::Pass< core_t >::visit( const ast::CatchStmt * node ) { 968 969 VISIT_START( node ); 969 970 … … 971 972 // catch statements introduce a level of scope (for the caught exception) 972 973 guard_symtab guard { *this }; 973 maybe_accept( node, &Catch Clause::decl );974 maybe_accept( node, &Catch Clause::cond );975 maybe_accept_as_compound( node, &Catch Clause::body );976 } 977 978 VISIT_END( CatchClause, node );979 } 980 981 //-------------------------------------------------------------------------- 982 // Finally Clause983 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, &Finally Clause::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 984 template< typename core_t > 985 const 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 ); 992 993 } 993 994 … … 1053 1054 auto n = __pass::mutate<core_t>(node); 1054 1055 for(size_t i = 0; i < new_clauses.size(); i++) { 1055 if(new_clauses.at(i).target.func != nullptr) s wap(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); 1056 1057 1057 1058 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) s wap(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)); 1059 1060 } 1060 1061 1061 if(new_clauses.at(i).stmt != nullptr) s wap(n->clauses.at(i).stmt, new_clauses.at(i).stmt);1062 if(new_clauses.at(i).cond != nullptr) s wap(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); 1063 1064 } 1064 1065 node = n; … … 1515 1516 } 1516 1517 maybe_accept( node, &TypeExpr::type ); 1517 }1518 1519 VISIT_END( Expr, node );1520 }1521 1522 //--------------------------------------------------------------------------1523 // DimensionExpr1524 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 );1531 1518 } 1532 1519 … … 1872 1859 1873 1860 if ( __visit_children() ) { 1874 maybe_accept( node, &PointerType::dimension );1861 // xxx - should PointerType visit/mutate dimension? 1875 1862 maybe_accept( node, &PointerType::base ); 1876 1863 } … … 2164 2151 2165 2152 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 } 2178 2167 } 2179 2168 }
Note:
See TracChangeset
for help on using the changeset viewer.