Changes in src/AST/Pass.proto.hpp [5bf685f:7a36848]
- File:
-
- 1 edited
-
src/AST/Pass.proto.hpp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.proto.hpp
r5bf685f r7a36848 154 154 bool is_old; 155 155 156 delta(const Stmt * s, ssize_t i, bool old) :157 new_val(s), old_idx(i), is_old(old) {}156 explicit delta(const Stmt * s) : new_val(s), old_idx(-1), is_old(false) {} 157 explicit delta(ssize_t i) : new_val(nullptr), old_idx(i), is_old(true) {} 158 158 }; 159 159 … … 188 188 std::transform( stmts->begin(), stmts->end(), std::back_inserter( values ), 189 189 [](ast::ptr<ast::Stmt>& stmt) -> delta { 190 return delta( stmt.release() , -1, false);190 return delta( stmt.release() ); 191 191 }); 192 192 stmts->clear(); … … 201 201 [](ast::ptr<ast::Decl>& decl) -> delta { 202 202 ast::Decl const * d = decl.release(); 203 return delta( new DeclStmt( d->location, d ) , -1, false);203 return delta( new DeclStmt( d->location, d ) ); 204 204 }); 205 205 decls->clear(); … … 226 226 // Now the original containers should still have the unchanged values 227 227 // but also contain the new values. 228 }229 };230 231 /// Used by previsit implementation232 /// We need to reassign the result to 'node', unless the function233 /// returns void, then we just leave 'node' unchanged234 template<bool is_void>235 struct __assign;236 237 template<>238 struct __assign<true> {239 template<typename core_t, typename node_t>240 static inline void result( core_t & core, const node_t * & node ) {241 core.previsit( node );242 }243 };244 245 template<>246 struct __assign<false> {247 template<typename core_t, typename node_t>248 static inline void result( core_t & core, const node_t * & node ) {249 node = core.previsit( node );250 assertf(node, "Previsit must not return NULL");251 }252 };253 254 /// Used by postvisit implementation255 /// We need to return the result unless the function256 /// returns void, then we just return the original node257 template<bool is_void>258 struct __return;259 260 template<>261 struct __return<true> {262 template<typename core_t, typename node_t>263 static inline const node_t * result( core_t & core, const node_t * & node ) {264 core.postvisit( node );265 return node;266 }267 };268 269 template<>270 struct __return<false> {271 template<typename core_t, typename node_t>272 static inline auto result( core_t & core, const node_t * & node ) {273 return core.postvisit( node );274 228 } 275 229 }; … … 297 251 ); 298 252 299 __assign< 300 std::is_void< 301 decltype( core.previsit( node ) ) 302 >::value 303 >::result( core, node ); 253 // We need to reassign the result to 'node', unless the function 254 // returns void, then we just leave 'node' unchanged 255 if constexpr ( std::is_void_v<decltype( core.previsit( node ) )> ) { 256 core.previsit( node ); 257 } else { 258 node = core.previsit( node ); 259 assertf( node, "Previsit must not return nullptr." ); 260 } 304 261 } 305 262 … … 312 269 decltype( core.postvisit( node ), node->accept( *(Visitor*)nullptr ) ) 313 270 { 314 return __return< 315 std::is_void< 316 decltype( core.postvisit( node ) ) 317 >::value 318 >::result( core, node ); 271 // We need to return the result unless the function 272 // returns void, then we just return the original node 273 if constexpr ( std::is_void_v<decltype( core.postvisit( node ) )> ) { 274 core.postvisit( node ); 275 return node; 276 } else { 277 return core.postvisit( node ); 278 } 319 279 } 320 280 … … 350 310 FIELD_PTR( at_cleanup, __pass::at_cleanup_t ) 351 311 FIELD_PTR( visitor, ast::Pass<core_t> * const ) 312 FIELD_PTR( translationUnit, const TranslationUnit * ) 352 313 353 314 // Remove the macro to make sure we don't clash … … 546 507 } // namespace forall 547 508 548 // For passes that need access to the global context. Searches `translationUnit`549 namespace translation_unit {550 template<typename core_t>551 static inline auto get_cptr( core_t & core, int )552 -> decltype( &core.translationUnit ) {553 return &core.translationUnit;554 }555 556 template<typename core_t>557 static inline const TranslationUnit ** get_cptr( core_t &, long ) {558 return nullptr;559 }560 }561 562 509 // For passes, usually utility passes, that have a result. 563 510 namespace result {
Note:
See TracChangeset
for help on using the changeset viewer.