Changes in / [30763fd:d4f1521]
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.hfa
r30763fd rd4f1521 20 20 #include "invoke.h" 21 21 #include "time_t.hfa" 22 #include "coroutine.hfa" 22 23 23 24 extern "C" { -
libcfa/src/concurrency/monitor.hfa
r30763fd rd4f1521 38 38 dtor_node = NULL; 39 39 } 40 41 static inline void ^?{}(monitor_desc & ) {} 40 42 41 43 struct monitor_guard_t { -
src/Concurrency/Keywords.cc
r30763fd rd4f1521 59 59 60 60 Declaration * postmutate( StructDecl * decl ); 61 DeclarationWithType * postmutate( FunctionDecl * decl ); 61 62 62 63 void handle( StructDecl * ); … … 77 78 KeywordCastExpr::Target cast_target; 78 79 79 StructDecl* type_decl = nullptr; 80 StructDecl * type_decl = nullptr; 81 FunctionDecl * dtor_decl = nullptr; 80 82 }; 81 83 … … 97 99 "__thrd", 98 100 "get_thread", 99 "thread keyword requires threads to be in scope, add #include <thread.hfa> ",101 "thread keyword requires threads to be in scope, add #include <thread.hfa>\n", 100 102 true, 101 103 KeywordCastExpr::Thread … … 129 131 "__cor", 130 132 "get_coroutine", 131 "coroutine keyword requires coroutines to be in scope, add #include <coroutine.hfa> ",133 "coroutine keyword requires coroutines to be in scope, add #include <coroutine.hfa>\n", 132 134 true, 133 135 KeywordCastExpr::Coroutine … … 161 163 "__mon", 162 164 "get_monitor", 163 "monitor keyword requires monitors to be in scope, add #include <monitor.hfa> ",165 "monitor keyword requires monitors to be in scope, add #include <monitor.hfa>\n", 164 166 false, 165 167 KeywordCastExpr::Monitor … … 284 286 } 285 287 288 DeclarationWithType * ConcurrentSueKeyword::postmutate( FunctionDecl * decl ) { 289 if( !type_decl ) return decl; 290 if( !CodeGen::isDestructor( decl->name ) ) return decl; 291 292 auto params = decl->type->parameters; 293 if( params.size() != 1 ) return decl; 294 295 auto type = dynamic_cast<ReferenceType*>( params.front()->get_type() ); 296 if( !type ) return decl; 297 298 auto stype = dynamic_cast<StructInstType*>( type->base ); 299 if( !stype ) return decl; 300 if( stype->baseStruct != type_decl ) return decl; 301 302 if( !dtor_decl ) dtor_decl = decl; 303 return decl; 304 } 305 286 306 Expression * ConcurrentSueKeyword::postmutate( KeywordCastExpr * cast ) { 287 307 if ( cast_target == cast->target ) { 288 308 // convert (thread &)t to (thread_desc &)*get_thread(t), etc. 289 309 if( !type_decl ) SemanticError( cast, context_error ); 310 if( !dtor_decl ) SemanticError( cast, context_error ); 290 311 Expression * arg = cast->arg; 291 312 cast->arg = nullptr; … … 308 329 309 330 if( !type_decl ) SemanticError( decl, context_error ); 331 if( !dtor_decl ) SemanticError( decl, context_error ); 310 332 311 333 FunctionDecl * func = forwardDeclare( decl ); -
src/ControlStruct/MLEMutator.cc
r30763fd rd4f1521 231 231 232 232 Statement *MLEMutator::mutateLoop( Statement *bodyLoop, Entry &e ) { 233 // only generate these when needed 234 if( !e.isContUsed() && !e.isBreakUsed() ) return bodyLoop; 235 233 236 // ensure loop body is a block 234 CompoundStmt *newBody; 235 if ( ! (newBody = dynamic_cast<CompoundStmt *>( bodyLoop )) ) { 236 newBody = new CompoundStmt(); 237 newBody->get_kids().push_back( bodyLoop ); 238 } // if 239 240 // only generate these when needed 237 CompoundStmt * newBody = new CompoundStmt(); 238 newBody->get_kids().push_back( bodyLoop ); 241 239 242 240 if ( e.isContUsed() ) { -
tests/raii/dtor-early-exit.cfa
r30763fd rd4f1521 217 217 } 218 218 219 void i() { 220 // potential loop 221 for() { 222 if(true) continue; 223 int t = 0; 224 } 225 } 226 219 227 // TODO: implement __label__ and uncomment these lines 220 228 void computedGoto() {
Note: See TracChangeset
for help on using the changeset viewer.