Changes in src/AST/Pass.impl.hpp [2d0f918:fac05b3]
- File:
-
- 1 edited
-
src/AST/Pass.impl.hpp (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.impl.hpp
r2d0f918 rfac05b3 22 22 #include "AST/TranslationUnit.hpp" 23 23 #include "AST/TypeSubstitution.hpp" 24 #include "Common/Iterate.hpp" 24 25 25 26 #define VISIT_START( node ) \ … … 126 127 } 127 128 129 template< typename node_t > 130 template< typename object_t, typename super_t, typename field_t > 131 void __pass::result1< node_t >::apply( object_t * object, field_t super_t::* field ) { 132 object->*field = value; 133 } 134 128 135 template< typename core_t > 129 136 template< typename node_t > … … 227 234 228 235 return {true, compound}; 236 } 237 238 template< template <class...> class container_t > 239 template< typename object_t, typename super_t, typename field_t > 240 void __pass::resultNstmt<container_t>::apply(object_t * object, field_t super_t::* field) { 241 auto & container = object->*field; 242 __pedantic_pass_assert( container.size() <= values.size() ); 243 244 auto cit = enumerate(container).begin(); 245 246 container_t<ptr<Stmt>> nvals; 247 for (delta & d : values) { 248 if ( d.is_old ) { 249 __pedantic_pass_assert( cit.idx <= d.old_idx ); 250 std::advance( cit, d.old_idx - cit.idx ); 251 nvals.push_back( std::move( (*cit).val) ); 252 } else { 253 nvals.push_back( std::move(d.new_val) ); 254 } 255 } 256 257 container = std::move(nvals); 258 } 259 260 template< template <class...> class container_t > 261 template< template <class...> class incontainer_t > 262 void __pass::resultNstmt< container_t >::take_all( incontainer_t<ptr<Stmt>> * stmts ) { 263 if (!stmts || stmts->empty()) return; 264 265 std::transform(stmts->begin(), stmts->end(), std::back_inserter( values ), 266 [](ast::ptr<ast::Stmt>& stmt) -> delta { 267 return delta( stmt.release(), -1, false ); 268 }); 269 stmts->clear(); 270 differs = true; 271 } 272 273 template< template<class...> class container_t > 274 template< template<class...> class incontainer_t > 275 void __pass::resultNstmt< container_t >::take_all( incontainer_t<ptr<Decl>> * decls ) { 276 if (!decls || decls->empty()) return; 277 278 std::transform(decls->begin(), decls->end(), std::back_inserter( values ), 279 [](ast::ptr<ast::Decl>& decl) -> delta { 280 auto loc = decl->location; 281 auto stmt = new DeclStmt( loc, decl.release() ); 282 return delta( stmt, -1, false ); 283 }); 284 decls->clear(); 285 differs = true; 229 286 } 230 287 … … 296 353 297 354 return new_kids; 355 } 356 357 template< template <class...> class container_t, typename node_t > 358 template< typename object_t, typename super_t, typename field_t > 359 void __pass::resultN<container_t, node_t>::apply(object_t * object, field_t super_t::* field) { 360 auto & container = object->*field; 361 __pedantic_pass_assert( container.size() == values.size() ); 362 363 for(size_t i = 0; i < container.size(); i++) { 364 // Take all the elements that are different in 'values' 365 // and swap them into 'container' 366 if( values[i] != nullptr ) swap(container[i], values[i]); 367 } 368 369 // Now the original containers should still have the unchanged values 370 // but also contain the new values 298 371 } 299 372 … … 993 1066 994 1067 //-------------------------------------------------------------------------- 995 // WhenClause996 template< typename core_t >997 const ast::WhenClause * ast::Pass< core_t >::visit( const ast::WhenClause * node ) {998 VISIT_START( node );999 1000 if ( __visit_children() ) {1001 maybe_accept( node, &WhenClause::target );1002 maybe_accept( node, &WhenClause::stmt );1003 maybe_accept( node, &WhenClause::when_cond );1004 }1005 1006 VISIT_END( WhenClause, node );1007 }1008 1009 //--------------------------------------------------------------------------1010 1068 // WaitForStmt 1011 1069 template< typename core_t > … … 1032 1090 1033 1091 if ( __visit_children() ) { 1034 maybe_accept( node, &WaitForClause::target );1092 maybe_accept( node, &WaitForClause::target_func ); 1035 1093 maybe_accept( node, &WaitForClause::target_args ); 1036 1094 maybe_accept( node, &WaitForClause::stmt ); 1037 maybe_accept( node, &WaitForClause:: when_cond );1095 maybe_accept( node, &WaitForClause::cond ); 1038 1096 } 1039 1097 1040 1098 VISIT_END( WaitForClause, node ); 1041 }1042 1043 //--------------------------------------------------------------------------1044 // WaitUntilStmt1045 template< typename core_t >1046 const ast::Stmt * ast::Pass< core_t >::visit( const ast::WaitUntilStmt * node ) {1047 VISIT_START( node );1048 1049 if ( __visit_children() ) {1050 maybe_accept( node, &WaitUntilStmt::clauses );1051 maybe_accept( node, &WaitUntilStmt::timeout_time );1052 maybe_accept( node, &WaitUntilStmt::timeout_stmt );1053 maybe_accept( node, &WaitUntilStmt::timeout_cond );1054 maybe_accept( node, &WaitUntilStmt::else_stmt );1055 maybe_accept( node, &WaitUntilStmt::else_cond );1056 }1057 1058 VISIT_END( Stmt, node );1059 1099 } 1060 1100 … … 2163 2203 } 2164 2204 2165 #undef __pedantic_pass_assertf2166 #undef __pedantic_pass_assert2167 2205 #undef VISIT_START 2168 2206 #undef VISIT_END
Note:
See TracChangeset
for help on using the changeset viewer.