Changes in / [9bae71f:7453a68]
- Location:
- src
- Files:
-
- 1 added
- 32 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r9bae71f r7453a68 885 885 886 886 void CodeGenerator::postvisit( CaseStmt * caseStmt ) { 887 updateLocation( caseStmt ); 888 output << indent; 887 889 if ( caseStmt->isDefault()) { 888 890 output << "default"; … … 1026 1028 } // namespace CodeGen 1027 1029 1030 std::ostream & operator<<( std::ostream & out, const BaseSyntaxNode * node ) { 1031 if ( node ) { 1032 node->print( out ); 1033 } else { 1034 out << "nullptr"; 1035 } 1036 return out; 1037 } 1038 1028 1039 // Local Variables: // 1029 1040 // tab-width: 4 // -
src/Concurrency/Waitfor.cc
r9bae71f r7453a68 27 27 #include "InitTweak/InitTweak.h" // for getPointerBase 28 28 #include "Parser/LinkageSpec.h" // for Cforall 29 #include " SymTab/AddVisit.h" // for acceptAndAdd29 #include "ResolvExpr/Resolver.h" // for findVoidExpression 30 30 #include "SynTree/Constant.h" // for Constant 31 31 #include "SynTree/Declaration.h" // for StructDecl, FunctionDecl, ObjectDecl … … 112 112 //============================================================================================= 113 113 114 class GenerateWaitForPass final : public With StmtsToAdd{114 class GenerateWaitForPass final : public WithIndexer { 115 115 public: 116 116 … … 126 126 127 127 ObjectDecl * declare( unsigned long count, CompoundStmt * stmt ); 128 ObjectDecl * declareFlag( CompoundStmt * stmt ); 129 Statement * makeSetter( ObjectDecl * flag ); 128 130 ObjectDecl * declMon( WaitForStmt::Clause & clause, CompoundStmt * stmt ); 129 void init( ObjectDecl * acceptables, int index, WaitForStmt::Clause & clause, CompoundStmt * stmt );130 Expression * init_timeout( Expression *& time, Expression *& time_cond, bool has_else, Expression *& else_cond, CompoundStmt * stmt );131 Expression * call( );132 void choose();131 void init( ObjectDecl * acceptables, int index, WaitForStmt::Clause & clause, Statement * settter, CompoundStmt * stmt ); 132 Expression * init_timeout( Expression *& time, Expression *& time_cond, bool has_else, Expression *& else_cond, Statement * settter, CompoundStmt * stmt ); 133 Expression * call(size_t count, ObjectDecl * acceptables, Expression * timeout, CompoundStmt * stmt); 134 void choose( WaitForStmt * waitfor, Expression * result, CompoundStmt * stmt ); 133 135 134 136 static void implement( std::list< Declaration * > & translationUnit ) { … … 140 142 private: 141 143 FunctionDecl * decl_waitfor = nullptr; 144 StructDecl * decl_mask = nullptr; 142 145 StructDecl * decl_acceptable = nullptr; 143 146 StructDecl * decl_monitor = nullptr; 144 DeclarationWithType * decl_m_func = nullptr;145 DeclarationWithType * decl_m_count = nullptr;146 DeclarationWithType * decl_m_monitors = nullptr;147 DeclarationWithType * decl_m_isdtor = nullptr;148 147 149 148 static std::unique_ptr< Type > generic_func; 150 149 150 UniqueName namer_acc = "__acceptables_"s; 151 UniqueName namer_idx = "__index_"s; 152 UniqueName namer_flg = "__do_run_"s; 153 UniqueName namer_msk = "__mask_"s; 151 154 UniqueName namer_mon = "__monitors_"s; 152 UniqueName namer_acc = "__acceptables_"s;153 155 UniqueName namer_tim = "__timeout_"s; 154 156 }; … … 167 169 namespace { 168 170 Expression * makeOpIndex( DeclarationWithType * array, unsigned long index ) { 169 return new ApplicationExpr(171 return new UntypedExpr( 170 172 new NameExpr( "?[?]" ), 171 173 { … … 177 179 178 180 Expression * makeOpAssign( Expression * lhs, Expression * rhs ) { 179 return new ApplicationExpr(181 return new UntypedExpr( 180 182 new NameExpr( "?=?" ), 181 183 { lhs, rhs } … … 183 185 } 184 186 185 Expression * makeOpMember( Expression * sue, DeclarationWithType * mem ) { 186 return new MemberExpr( mem, sue ); 187 } 188 189 Statement * makeAccStatement( DeclarationWithType * object, unsigned long index, DeclarationWithType * member, Expression * value ) { 190 return new ExprStmt( 191 noLabels, 192 makeOpAssign( 193 makeOpMember( 194 makeOpIndex( 195 object, 196 index 197 ), 198 member 187 Expression * makeOpMember( Expression * sue, const std::string & mem ) { 188 return new UntypedMemberExpr( new NameExpr( mem ), sue ); 189 } 190 191 Statement * makeAccStatement( DeclarationWithType * object, unsigned long index, const std::string & member, Expression * value, const SymTab::Indexer & indexer ) { 192 std::unique_ptr< Expression > expr( makeOpAssign( 193 makeOpMember( 194 makeOpIndex( 195 object, 196 index 199 197 ), 200 value 201 ) 202 ); 198 member 199 ), 200 value 201 ) ); 202 203 return new ExprStmt( noLabels, ResolvExpr::findVoidExpression( expr.get(), indexer ) ); 203 204 } 204 205 … … 208 209 return new ConstantExpr( Constant::from_bool( ifnull ) ); 209 210 } 211 212 VariableExpr * extractVariable( Expression * func ) { 213 if( VariableExpr * var = dynamic_cast< VariableExpr * >( func ) ) { 214 return var; 215 } 216 217 CastExpr * cast = strict_dynamic_cast< CastExpr * >( func ); 218 return strict_dynamic_cast< VariableExpr * >( cast->arg ); 219 } 220 221 Expression * detectIsDtor( Expression * func ) { 222 VariableExpr * typed_func = extractVariable( func ); 223 bool is_dtor = InitTweak::isDestructor( typed_func->var ); 224 return new ConstantExpr( Constant::from_bool( is_dtor ) ); 225 } 210 226 }; 211 227 … … 216 232 217 233 void GenerateWaitForPass::premutate( FunctionDecl * decl) { 218 if( decl->name != "__ accept_internal" ) return;234 if( decl->name != "__waitfor_internal" ) return; 219 235 220 236 decl_waitfor = decl; … … 227 243 assert( !decl_acceptable ); 228 244 decl_acceptable = decl; 229 for( Declaration * field : decl_acceptable->members ) { 230 if( field->name == "func" ) decl_m_func = strict_dynamic_cast< DeclarationWithType * >( field ); 231 else if( field->name == "count" ) decl_m_count = strict_dynamic_cast< DeclarationWithType * >( field ); 232 else if( field->name == "monitor" ) decl_m_monitors = strict_dynamic_cast< DeclarationWithType * >( field ); 233 else if( field->name == "is_dtor" ) decl_m_isdtor = strict_dynamic_cast< DeclarationWithType * >( field ); 234 } 235 245 } 246 else if( decl->name == "__waitfor_mask_t" ) { 247 assert( !decl_mask ); 248 decl_mask = decl; 236 249 } 237 250 else if( decl->name == "monitor_desc" ) { … … 242 255 243 256 Statement * GenerateWaitForPass::postmutate( WaitForStmt * waitfor ) { 244 return waitfor; 245 246 if( !decl_monitor || !decl_acceptable ) throw SemanticError( "waitfor keyword requires monitors to be in scope, add #include <monitor>", waitfor ); 257 if( !decl_monitor || !decl_acceptable || !decl_mask ) throw SemanticError( "waitfor keyword requires monitors to be in scope, add #include <monitor>", waitfor ); 247 258 248 259 CompoundStmt * stmt = new CompoundStmt( noLabels ); 249 260 250 261 ObjectDecl * acceptables = declare( waitfor->clauses.size(), stmt ); 262 ObjectDecl * flag = declareFlag( stmt ); 263 Statement * setter = makeSetter( flag ); 251 264 252 265 int index = 0; 253 266 for( auto & clause : waitfor->clauses ) { 254 init( acceptables, index, clause, s tmt );267 init( acceptables, index, clause, setter, stmt ); 255 268 256 269 index++; … … 262 275 waitfor->orelse .statement, 263 276 waitfor->orelse .condition, 277 setter, 264 278 stmt 265 279 ); 266 280 267 // Expression * result = call( acceptables, timeout, orelse, stmt ); 268 269 // choose( waitfor, result ); 281 CompoundStmt * compound = new CompoundStmt( noLabels ); 282 stmt->push_back( new IfStmt( 283 noLabels, 284 safeCond( new VariableExpr( flag ) ), 285 compound, 286 nullptr 287 )); 288 289 Expression * result = call( waitfor->clauses.size(), acceptables, timeout, compound ); 290 291 choose( waitfor, result, compound ); 270 292 271 293 return stmt; … … 274 296 ObjectDecl * GenerateWaitForPass::declare( unsigned long count, CompoundStmt * stmt ) 275 297 { 276 ObjectDecl * acceptables = new ObjectDecl(298 ObjectDecl * acceptables = ObjectDecl::newObject( 277 299 namer_acc.newName(), 278 noStorage,279 LinkageSpec::Cforall,280 nullptr,281 300 new ArrayType( 282 301 noQualifiers, … … 294 313 stmt->push_back( new DeclStmt( noLabels, acceptables) ); 295 314 315 UntypedExpr * set = new UntypedExpr( 316 new NameExpr( "__builtin_memset" ), 317 { 318 new VariableExpr( acceptables ), 319 new ConstantExpr( Constant::from_int( 0 ) ), 320 new SizeofExpr( new VariableExpr( acceptables ) ) 321 } 322 ); 323 324 Expression * resolved_set = ResolvExpr::findVoidExpression( set, indexer ); 325 delete set; 326 327 stmt->push_back( new ExprStmt( noLabels, resolved_set ) ); 328 296 329 return acceptables; 297 330 } 298 331 332 ObjectDecl * GenerateWaitForPass::declareFlag( CompoundStmt * stmt ) { 333 ObjectDecl * flag = ObjectDecl::newObject( 334 namer_flg.newName(), 335 new BasicType( 336 noQualifiers, 337 BasicType::Bool 338 ), 339 new SingleInit( new ConstantExpr( Constant::from_ulong( 0 ) ) ) 340 ); 341 342 stmt->push_back( new DeclStmt( noLabels, flag) ); 343 344 return flag; 345 } 346 347 Statement * GenerateWaitForPass::makeSetter( ObjectDecl * flag ) { 348 Expression * untyped = new UntypedExpr( 349 new NameExpr( "?=?" ), 350 { 351 new VariableExpr( flag ), 352 new ConstantExpr( Constant::from_ulong( 1 ) ) 353 } 354 ); 355 356 Expression * expr = ResolvExpr::findVoidExpression( untyped, indexer ); 357 delete untyped; 358 359 return new ExprStmt( noLabels, expr ); 360 } 361 299 362 ObjectDecl * GenerateWaitForPass::declMon( WaitForStmt::Clause & clause, CompoundStmt * stmt ) { 300 363 301 ObjectDecl * mon = new ObjectDecl(364 ObjectDecl * mon = ObjectDecl::newObject( 302 365 namer_mon.newName(), 303 noStorage,304 LinkageSpec::Cforall,305 nullptr,306 366 new ArrayType( 307 367 noQualifiers, 308 new StructInstType(368 new PointerType( 309 369 noQualifiers, 310 decl_monitor 370 new StructInstType( 371 noQualifiers, 372 decl_monitor 373 ) 311 374 ), 312 375 new ConstantExpr( Constant::from_ulong( clause.target.arguments.size() ) ), … … 316 379 new ListInit( 317 380 map_range < std::list<Initializer*> > ( clause.target.arguments, [this](Expression * expr ){ 318 return new SingleInit( expr ); 381 Expression * untyped = new CastExpr( 382 new UntypedExpr( 383 new NameExpr( "get_monitor" ), 384 { expr } 385 ), 386 new PointerType( 387 noQualifiers, 388 new StructInstType( 389 noQualifiers, 390 decl_monitor 391 ) 392 ) 393 ); 394 395 Expression * init = ResolvExpr::findSingleExpression( untyped, indexer ); 396 delete untyped; 397 return new SingleInit( init ); 319 398 }) 320 399 ) … … 326 405 } 327 406 328 void GenerateWaitForPass::init( ObjectDecl * acceptables, int index, WaitForStmt::Clause & clause, CompoundStmt * stmt ) {407 void GenerateWaitForPass::init( ObjectDecl * acceptables, int index, WaitForStmt::Clause & clause, Statement * setter, CompoundStmt * stmt ) { 329 408 330 409 ObjectDecl * monitors = declMon( clause, stmt ); 331 410 332 CompoundStmt * compound = new CompoundStmt( noLabels ); 333 compound->push_back( makeAccStatement( acceptables, index, decl_m_func , clause.target.function ) ); 334 compound->push_back( makeAccStatement( acceptables, index, decl_m_count , new ConstantExpr( Constant::from_ulong( clause.target.arguments.size() ) ) ) ); 335 compound->push_back( makeAccStatement( acceptables, index, decl_m_monitors, new VariableExpr( monitors ) ) ); 336 compound->push_back( makeAccStatement( acceptables, index, decl_m_isdtor , new ConstantExpr( Constant::from_bool( true ) ) ) ); 411 Type * fptr_t = new PointerType( noQualifiers, new FunctionType( noQualifiers, true ) ); 337 412 338 413 stmt->push_back( new IfStmt( 339 414 noLabels, 340 415 safeCond( clause.condition ), 341 compound, 416 new CompoundStmt({ 417 makeAccStatement( acceptables, index, "is_dtor", detectIsDtor( clause.target.function ) , indexer ), 418 makeAccStatement( acceptables, index, "func" , new CastExpr( clause.target.function, fptr_t ) , indexer ), 419 makeAccStatement( acceptables, index, "list" , new VariableExpr( monitors ) , indexer ), 420 makeAccStatement( acceptables, index, "size" , new ConstantExpr( Constant::from_ulong( clause.target.arguments.size() ) ), indexer ), 421 setter->clone() 422 }), 342 423 nullptr 343 424 )); … … 353 434 bool has_else, 354 435 Expression *& else_cond, 436 Statement * setter, 355 437 CompoundStmt * stmt 356 438 ) { 357 ObjectDecl * timeout = new ObjectDecl(439 ObjectDecl * timeout = ObjectDecl::newObject( 358 440 namer_tim.newName(), 359 noStorage,360 LinkageSpec::Cforall,361 nullptr,362 441 new BasicType( 363 442 noQualifiers, … … 374 453 stmt->push_back( new IfStmt( 375 454 noLabels, 376 safeCond( else_cond ), 377 new ExprStmt( 378 noLabels, 379 makeOpAssign( 380 new VariableExpr( timeout ), 381 time 382 ) 383 ), 455 safeCond( time_cond ), 456 new CompoundStmt({ 457 new ExprStmt( 458 noLabels, 459 makeOpAssign( 460 new VariableExpr( timeout ), 461 time 462 ) 463 ), 464 setter->clone() 465 }), 384 466 nullptr 385 467 )); … … 392 474 noLabels, 393 475 safeCond( else_cond ), 394 new ExprStmt( 395 noLabels, 396 makeOpAssign( 397 new VariableExpr( timeout ), 398 new ConstantExpr( Constant::from_ulong( 0 ) ) 399 ) 400 ), 476 new CompoundStmt({ 477 new ExprStmt( 478 noLabels, 479 makeOpAssign( 480 new VariableExpr( timeout ), 481 new ConstantExpr( Constant::from_ulong( 0 ) ) 482 ) 483 ), 484 setter->clone() 485 }), 401 486 nullptr 402 487 )); … … 405 490 } 406 491 492 delete setter; 493 407 494 return new VariableExpr( timeout ); 495 } 496 497 Expression * GenerateWaitForPass::call( 498 size_t count, 499 ObjectDecl * acceptables, 500 Expression * timeout, 501 CompoundStmt * stmt 502 ) { 503 ObjectDecl * index = ObjectDecl::newObject( 504 namer_idx.newName(), 505 new BasicType( 506 noQualifiers, 507 BasicType::ShortSignedInt 508 ), 509 new SingleInit( 510 new ConstantExpr( Constant::from_int( -1 ) ) 511 ) 512 ); 513 514 stmt->push_back( new DeclStmt( noLabels, index ) ); 515 516 ObjectDecl * mask = ObjectDecl::newObject( 517 namer_msk.newName(), 518 new StructInstType( 519 noQualifiers, 520 decl_mask 521 ), 522 new ListInit({ 523 new SingleInit( new AddressExpr( new VariableExpr( index ) ) ), 524 new SingleInit( new VariableExpr( acceptables ) ), 525 new SingleInit( new ConstantExpr( Constant::from_ulong( count ) ) ) 526 }) 527 ); 528 529 stmt->push_back( new DeclStmt( noLabels, mask ) ); 530 531 stmt->push_back( new ExprStmt( 532 noLabels, 533 new ApplicationExpr( 534 VariableExpr::functionPointer( decl_waitfor ), 535 { 536 new CastExpr( 537 new VariableExpr( mask ), 538 new ReferenceType( 539 noQualifiers, 540 new StructInstType( 541 noQualifiers, 542 decl_mask 543 ) 544 ) 545 ), 546 timeout 547 } 548 ) 549 )); 550 551 return new VariableExpr( index ); 552 } 553 554 void GenerateWaitForPass::choose( 555 WaitForStmt * waitfor, 556 Expression * result, 557 CompoundStmt * stmt 558 ) { 559 SwitchStmt * swtch = new SwitchStmt( 560 noLabels, 561 result, 562 std::list<Statement *>() 563 ); 564 565 unsigned long i = 0; 566 for( auto & clause : waitfor->clauses ) { 567 swtch->statements.push_back( 568 new CaseStmt( 569 noLabels, 570 new ConstantExpr( Constant::from_ulong( i++ ) ), 571 { 572 clause.statement, 573 new BranchStmt( 574 noLabels, 575 "", 576 BranchStmt::Break 577 ) 578 } 579 ) 580 ); 581 } 582 583 if(waitfor->timeout.statement) { 584 swtch->statements.push_back( 585 new CaseStmt( 586 noLabels, 587 new ConstantExpr( Constant::from_int( -2 ) ), 588 { 589 waitfor->timeout.statement, 590 new BranchStmt( 591 noLabels, 592 "", 593 BranchStmt::Break 594 ) 595 } 596 ) 597 ); 598 } 599 600 if(waitfor->orelse.statement) { 601 swtch->statements.push_back( 602 new CaseStmt( 603 noLabels, 604 new ConstantExpr( Constant::from_int( -1 ) ), 605 { 606 waitfor->orelse.statement, 607 new BranchStmt( 608 noLabels, 609 "", 610 BranchStmt::Break 611 ) 612 } 613 ) 614 ); 615 } 616 617 stmt->push_back( swtch ); 408 618 } 409 619 }; -
src/Parser/StatementNode.cc
r9bae71f r7453a68 234 234 target, 235 235 maybeMoveBuild<Statement >( stmt ), 236 maybeMoveBuild<Expression>( when)236 notZeroExpr( maybeMoveBuild<Expression>( when ) ) 237 237 }); 238 238 … … 250 250 delete targetExpr; 251 251 252 node->clauses. push_back(WaitForStmt::Clause{252 node->clauses.insert( node->clauses.begin(), WaitForStmt::Clause{ 253 253 std::move( target ), 254 254 maybeMoveBuild<Statement >( stmt ), 255 maybeMoveBuild<Expression>( when)255 notZeroExpr( maybeMoveBuild<Expression>( when ) ) 256 256 }); 257 257 … … 265 265 node->timeout.time = maybeMoveBuild<Expression>( timeout ); 266 266 node->timeout.statement = maybeMoveBuild<Statement >( stmt ); 267 node->timeout.condition = maybeMoveBuild<Expression>( when);267 node->timeout.condition = notZeroExpr( maybeMoveBuild<Expression>( when ) ); 268 268 } 269 269 else { 270 node->orelse.statement = maybeMoveBuild<Statement >( stmt 271 node->orelse.condition = maybeMoveBuild<Expression>( when);270 node->orelse.statement = maybeMoveBuild<Statement >( stmt ); 271 node->orelse.condition = notZeroExpr( maybeMoveBuild<Expression>( when ) ); 272 272 } 273 273 … … 280 280 node->timeout.time = maybeMoveBuild<Expression>( timeout ); 281 281 node->timeout.statement = maybeMoveBuild<Statement >( stmt ); 282 node->timeout.condition = maybeMoveBuild<Expression>( when);282 node->timeout.condition = notZeroExpr( maybeMoveBuild<Expression>( when ) ); 283 283 284 284 node->orelse.statement = maybeMoveBuild<Statement >( else_stmt ); 285 node->orelse.condition = maybeMoveBuild<Expression>( else_when);285 node->orelse.condition = notZeroExpr( maybeMoveBuild<Expression>( else_when ) ); 286 286 287 287 return node; 288 288 } 289 290 // WaitForStmt::Target build_waitfor( const std::string * name, ExpressionNode * arguments ) {291 // return WaitForStmt::Clause{292 293 // };294 // }295 289 296 290 Statement *build_compound( StatementNode *first ) { -
src/Parser/parserutility.cc
r9bae71f r7453a68 29 29 30 30 Expression *notZeroExpr( Expression *orig ) { 31 if( !orig ) return nullptr; 31 32 UntypedExpr *comparison = new UntypedExpr( new NameExpr( "?!=?" ) ); 32 33 comparison->get_args().push_back( orig ); -
src/ResolvExpr/AlternativeFinder.cc
r9bae71f r7453a68 144 144 expr->get_result()->accept( global_renamer ); 145 145 } 146 147 void referenceToRvalueConversion( Expression *& expr ) {148 if ( dynamic_cast< ReferenceType * >( expr->get_result() ) ) {149 // cast away reference from expr150 expr = new CastExpr( expr, expr->get_result()->stripReferences()->clone() );151 }152 }153 146 } // namespace 147 148 void referenceToRvalueConversion( Expression *& expr ) { 149 if ( dynamic_cast< ReferenceType * >( expr->get_result() ) ) { 150 // cast away reference from expr 151 expr = new CastExpr( expr, expr->get_result()->stripReferences()->clone() ); 152 } 153 } 154 154 155 155 template< typename InputIterator, typename OutputIterator > -
src/ResolvExpr/AlternativeFinder.h
r9bae71f r7453a68 50 50 const SymTab::Indexer &get_indexer() const { return indexer; } 51 51 const TypeEnvironment &get_environ() const { return env; } 52 53 /// Runs a new alternative finder on each element in [begin, end) 54 /// and writes each alternative finder to out. 55 template< typename InputIterator, typename OutputIterator > 56 void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out ); 52 57 private: 53 58 virtual void visit( ApplicationExpr *applicationExpr ); … … 81 86 virtual void visit( StmtExpr *stmtExpr ); 82 87 virtual void visit( UntypedInitExpr *initExpr ); 83 /// Runs a new alternative finder on each element in [begin, end)84 /// and writes each alternative finder to out.85 template< typename InputIterator, typename OutputIterator >86 void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out );87 88 88 89 /// Adds alternatives for anonymous members … … 108 109 109 110 Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env ); 111 void referenceToRvalueConversion( Expression *& expr ); 110 112 111 113 template< typename InputIterator, typename OutputIterator > -
src/ResolvExpr/Resolver.cc
r9bae71f r7453a68 40 40 #include "SynTree/Visitor.h" // for acceptAll, maybeAccept 41 41 #include "typeops.h" // for extractResultType 42 #include "Unify.h" // for unify 42 43 43 44 using namespace std; … … 71 72 void previsit( ThrowStmt *throwStmt ); 72 73 void previsit( CatchStmt *catchStmt ); 74 void previsit( WaitForStmt * stmt ); 73 75 74 76 void previsit( SingleInit *singleInit ); … … 116 118 } 117 119 120 Expression * findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 121 TypeEnvironment env; 122 AlternativeFinder finder( indexer, env ); 123 finder.find( untyped ); 124 #if 0 125 if ( finder.get_alternatives().size() != 1 ) { 126 std::cout << "untyped expr is "; 127 untyped->print( std::cout ); 128 std::cout << std::endl << "alternatives are:"; 129 for ( std::list< Alternative >::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) { 130 i->print( std::cout ); 131 } // for 132 } // if 133 #endif 134 assertf( finder.get_alternatives().size() == 1, "findSingleExpression: must have exactly one alternative at the end." ); 135 Alternative &choice = finder.get_alternatives().front(); 136 Expression *newExpr = choice.expr->clone(); 137 finishExpr( newExpr, choice.env ); 138 return newExpr; 139 } 140 118 141 namespace { 119 Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) {120 TypeEnvironment env;121 AlternativeFinder finder( indexer, env );122 finder.find( untyped );123 #if 0124 if ( finder.get_alternatives().size() != 1 ) {125 std::cout << "untyped expr is ";126 untyped->print( std::cout );127 std::cout << std::endl << "alternatives are:";128 for ( std::list< Alternative >::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) {129 i->print( std::cout );130 } // for131 } // if132 #endif133 assertf( finder.get_alternatives().size() == 1, "findSingleExpression: must have exactly one alternative at the end." );134 Alternative &choice = finder.get_alternatives().front();135 Expression *newExpr = choice.expr->clone();136 finishExpr( newExpr, choice.env );137 return newExpr;138 }139 140 142 bool isIntegralType( Type *type ) { 141 143 if ( dynamic_cast< EnumInstType * >( type ) ) { … … 391 393 } 392 394 395 inline void resolveAsIf( Expression *& expr, SymTab::Indexer & indexer ) { 396 if( !expr ) return; 397 Expression * newExpr = findSingleExpression( expr, indexer ); 398 delete expr; 399 expr = newExpr; 400 } 401 402 inline void resolveAsType( Expression *& expr, Type * type, SymTab::Indexer & indexer ) { 403 if( !expr ) return; 404 Expression * newExpr = findSingleExpression( new CastExpr( expr, type ), indexer ); 405 delete expr; 406 expr = newExpr; 407 } 408 409 template< typename iterator_t > 410 inline bool advance_to_mutex( iterator_t & it, const iterator_t & end ) { 411 while( it != end && !(*it)->get_type()->get_mutex() ) { 412 it++; 413 } 414 415 return it != end; 416 } 417 418 void Resolver::previsit( WaitForStmt * stmt ) { 419 visit_children = false; 420 421 // Resolve all clauses first 422 for( auto& clause : stmt->clauses ) { 423 424 TypeEnvironment env; 425 AlternativeFinder funcFinder( indexer, env ); 426 427 // Find all alternatives for a function in canonical form 428 funcFinder.findWithAdjustment( clause.target.function ); 429 430 if ( funcFinder.get_alternatives().empty() ) { 431 stringstream ss; 432 ss << "Use of undeclared indentifier '"; 433 ss << strict_dynamic_cast<NameExpr*>( clause.target.function )->name; 434 ss << "' in call to waitfor"; 435 throw SemanticError( ss.str() ); 436 } 437 438 // Find all alternatives for all arguments in canonical form 439 std::list< AlternativeFinder > argAlternatives; 440 funcFinder.findSubExprs( clause.target.arguments.begin(), clause.target.arguments.end(), back_inserter( argAlternatives ) ); 441 442 // List all combinations of arguments 443 std::list< AltList > possibilities; 444 combos( argAlternatives.begin(), argAlternatives.end(), back_inserter( possibilities ) ); 445 446 AltList func_candidates; 447 std::vector< AltList > args_candidates; 448 449 // For every possible function : 450 // try matching the arguments to the parameters 451 // not the other way around because we have more arguments than parameters 452 SemanticError errors; 453 for ( Alternative & func : funcFinder.get_alternatives() ) { 454 try { 455 PointerType * pointer = dynamic_cast< PointerType* >( func.expr->get_result()->stripReferences() ); 456 if( !pointer ) { 457 throw SemanticError( "candidate not viable: not a pointer type\n", func.expr->get_result() ); 458 } 459 460 FunctionType * function = dynamic_cast< FunctionType* >( pointer->get_base() ); 461 if( !function ) { 462 throw SemanticError( "candidate not viable: not a function type\n", pointer->get_base() ); 463 } 464 465 466 { 467 auto param = function->parameters.begin(); 468 auto param_end = function->parameters.end(); 469 470 if( !advance_to_mutex( param, param_end ) ) { 471 throw SemanticError("candidate function not viable: no mutex parameters\n", function); 472 } 473 } 474 475 Alternative newFunc( func ); 476 // Strip reference from function 477 referenceToRvalueConversion( newFunc.expr ); 478 479 // For all the set of arguments we have try to match it with the parameter of the current function alternative 480 for ( auto & argsList : possibilities ) { 481 482 try { 483 // Declare data structures need for resolution 484 OpenVarSet openVars; 485 AssertionSet resultNeed, resultHave; 486 TypeEnvironment resultEnv; 487 488 // Load type variables from arguemnts into one shared space 489 simpleCombineEnvironments( argsList.begin(), argsList.end(), resultEnv ); 490 491 // Make sure we don't widen any existing bindings 492 for ( auto & i : resultEnv ) { 493 i.allowWidening = false; 494 } 495 496 // Find any unbound type variables 497 resultEnv.extractOpenVars( openVars ); 498 499 auto param = function->parameters.begin(); 500 auto param_end = function->parameters.end(); 501 502 // For every arguments of its set, check if it matches one of the parameter 503 // The order is important 504 for( auto & arg : argsList ) { 505 506 // Ignore non-mutex arguments 507 if( !advance_to_mutex( param, param_end ) ) { 508 // We ran out of parameters but still have arguments 509 // this function doesn't match 510 throw SemanticError("candidate function not viable: too many mutex arguments\n", function); 511 } 512 513 // Check if the argument matches the parameter type in the current scope 514 if( ! unify( (*param)->get_type(), arg.expr->get_result(), resultEnv, resultNeed, resultHave, openVars, this->indexer ) ) { 515 // Type doesn't match 516 stringstream ss; 517 ss << "candidate function not viable: no known convertion from '"; 518 arg.expr->get_result()->print( ss ); 519 ss << "' to '"; 520 (*param)->get_type()->print( ss ); 521 ss << "'\n"; 522 throw SemanticError(ss.str(), function); 523 } 524 525 param++; 526 } 527 528 // All arguments match ! 529 530 // Check if parameters are missing 531 if( advance_to_mutex( param, param_end ) ) { 532 // We ran out of arguments but still have parameters left 533 // this function doesn't match 534 throw SemanticError("candidate function not viable: too few mutex arguments\n", function); 535 } 536 537 // All parameters match ! 538 539 // Finish the expressions to tie in the proper environments 540 finishExpr( newFunc.expr, resultEnv ); 541 for( Alternative & alt : argsList ) { 542 finishExpr( alt.expr, resultEnv ); 543 } 544 545 // This is a match store it and save it for later 546 func_candidates.push_back( newFunc ); 547 args_candidates.push_back( argsList ); 548 549 } 550 catch( SemanticError &e ) { 551 errors.append( e ); 552 } 553 } 554 } 555 catch( SemanticError &e ) { 556 errors.append( e ); 557 } 558 } 559 560 // Make sure we got the right number of arguments 561 if( func_candidates.empty() ) { SemanticError top( "No alternatives for function in call to waitfor" ); top.append( errors ); throw top; } 562 if( args_candidates.empty() ) { SemanticError top( "No alternatives for arguments in call to waitfor" ); top.append( errors ); throw top; } 563 if( func_candidates.size() > 1 ) { SemanticError top( "Ambiguous function in call to waitfor" ); top.append( errors ); throw top; } 564 if( args_candidates.size() > 1 ) { SemanticError top( "Ambiguous arguments in call to waitfor" ); top.append( errors ); throw top; } 565 566 567 // Swap the results from the alternative with the unresolved values. 568 // Alternatives will handle deletion on destruction 569 std::swap( clause.target.function, func_candidates.front().expr ); 570 for( auto arg_pair : group_iterate( clause.target.arguments, args_candidates.front() ) ) { 571 std::swap ( std::get<0>( arg_pair), std::get<1>( arg_pair).expr ); 572 } 573 574 // Resolve the conditions as if it were an IfStmt 575 // Resolve the statments normally 576 resolveAsIf( clause.condition, this->indexer ); 577 clause.statement->accept( *visitor ); 578 } 579 580 581 if( stmt->timeout.statement ) { 582 // Resolve the timeout as an size_t for now 583 // Resolve the conditions as if it were an IfStmt 584 // Resolve the statments normally 585 resolveAsType( stmt->timeout.time, new BasicType( noQualifiers, BasicType::LongLongUnsignedInt ), this->indexer ); 586 resolveAsIf ( stmt->timeout.condition, this->indexer ); 587 stmt->timeout.statement->accept( *visitor ); 588 } 589 590 if( stmt->orelse.statement ) { 591 // Resolve the conditions as if it were an IfStmt 592 // Resolve the statments normally 593 resolveAsIf( stmt->orelse.condition, this->indexer ); 594 stmt->orelse.statement->accept( *visitor ); 595 } 596 } 597 393 598 template< typename T > 394 599 bool isCharType( T t ) { -
src/ResolvExpr/Resolver.h
r9bae71f r7453a68 29 29 /// Checks types and binds syntactic constructs to typed representations 30 30 void resolve( std::list< Declaration * > translationUnit ); 31 Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer ); 32 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ); 31 Expression * resolveInVoidContext( Expression *expr , const SymTab::Indexer &indexer ); 32 Expression * findVoidExpression ( Expression *untyped, const SymTab::Indexer &indexer ); 33 Expression * findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ); 33 34 void resolveCtorInit( ConstructorInit * ctorInit, const SymTab::Indexer & indexer ); 34 35 void resolveStmtExpr( StmtExpr * stmtExpr, const SymTab::Indexer & indexer ); -
src/SymTab/Mangler.cc
r9bae71f r7453a68 307 307 mangleName << "V"; 308 308 } // if 309 if ( type->get_mutex() ) { 310 mangleName << "M"; 311 } // if 309 312 // Removed due to restrict not affecting function compatibility in GCC 310 313 // if ( type->get_isRestrict() ) { -
src/SynTree/BaseSyntaxNode.h
r9bae71f r7453a68 26 26 27 27 virtual void accept( Visitor & v ) = 0; 28 virtual void print( std::ostream & os, int indent = 0 ) const = 0;28 virtual void print( std::ostream & os, int indent = 0 ) const = 0; 29 29 }; 30 31 std::ostream & operator<<( std::ostream & out, const BaseSyntaxNode * node ); 30 32 31 33 // Local Variables: // -
src/SynTree/CompoundStmt.cc
r9bae71f r7453a68 29 29 30 30 CompoundStmt::CompoundStmt( std::list<Label> labels ) : Statement( labels ) { 31 } 32 33 CompoundStmt::CompoundStmt( std::list<Statement *> stmts ) : Statement( noLabels ), kids( stmts ) { 31 34 } 32 35 -
src/SynTree/Constant.cc
r9bae71f r7453a68 32 32 Constant Constant::from_bool( bool b ) { 33 33 return Constant( new BasicType( Type::Qualifiers(), BasicType::Bool ), b ? "1" : "0" , (unsigned long long int)b ); 34 } 35 36 Constant Constant::from_char( char c ) { 37 return Constant( new BasicType( Type::Qualifiers(), BasicType::Char ), std::to_string( c ), (unsigned long long int)c ); 34 38 } 35 39 -
src/SynTree/Constant.h
r9bae71f r7453a68 40 40 /// generates a boolean constant of the given bool 41 41 static Constant from_bool( bool b ); 42 /// generates a char constant of the given char 43 static Constant from_char( char c ); 42 44 /// generates an integer constant of the given int 43 45 static Constant from_int( int i ); -
src/SynTree/Declaration.cc
r9bae71f r7453a68 59 59 } 60 60 61 std::ostream & operator<<( std::ostream & out, const Declaration * decl ) {62 if ( decl ){63 decl->print( out );64 } else {65 out << "nullptr";66 }67 return out;68 }69 70 61 71 62 AsmDecl::AsmDecl( AsmStmt *stmt ) : Declaration( "", Type::StorageClasses(), LinkageSpec::C ), stmt( stmt ) { -
src/SynTree/Declaration.h
r9bae71f r7453a68 62 62 void fixUniqueId( void ); 63 63 virtual Declaration *clone() const = 0; 64 virtual void accept( Visitor &v ) = 0;64 virtual void accept( Visitor &v ) override = 0; 65 65 virtual Declaration *acceptMutator( Mutator &m ) = 0; 66 virtual void print( std::ostream &os, int indent = 0 ) const = 0;66 virtual void print( std::ostream &os, int indent = 0 ) const override = 0; 67 67 virtual void printShort( std::ostream &os, int indent = 0 ) const = 0; 68 68 … … 106 106 //void set_functionSpecifiers( Type::FuncSpecifiers newValue ) { fs = newValue; } 107 107 108 virtual DeclarationWithType *clone() const = 0;109 virtual DeclarationWithType *acceptMutator( Mutator &m ) = 0;108 virtual DeclarationWithType *clone() const override = 0; 109 virtual DeclarationWithType *acceptMutator( Mutator &m ) override = 0; 110 110 111 111 virtual Type * get_type() const = 0; … … 128 128 virtual ~ObjectDecl(); 129 129 130 virtual Type * get_type() const { return type; }131 virtual void set_type(Type *newType) { type = newType; }130 virtual Type * get_type() const override { return type; } 131 virtual void set_type(Type *newType) override { type = newType; } 132 132 133 133 Initializer *get_init() const { return init; } … … 139 139 static ObjectDecl * newObject( const std::string & name, Type * type, Initializer * init ); 140 140 141 virtual ObjectDecl *clone() const { return new ObjectDecl( *this ); }142 virtual void accept( Visitor &v ) { v.visit( this ); }143 virtual DeclarationWithType *acceptMutator( Mutator &m ) { return m.mutate( this ); }144 virtual void print( std::ostream &os, int indent = 0 ) const ;145 virtual void printShort( std::ostream &os, int indent = 0 ) const ;141 virtual ObjectDecl *clone() const override { return new ObjectDecl( *this ); } 142 virtual void accept( Visitor &v ) override { v.visit( this ); } 143 virtual DeclarationWithType *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 144 virtual void print( std::ostream &os, int indent = 0 ) const override; 145 virtual void printShort( std::ostream &os, int indent = 0 ) const override; 146 146 }; 147 147 … … 157 157 virtual ~FunctionDecl(); 158 158 159 Type * get_type() const{ return type; }160 virtual void set_type(Type * t) { type = strict_dynamic_cast< FunctionType* >( t ); }159 virtual Type * get_type() const override { return type; } 160 virtual void set_type(Type * t) override { type = strict_dynamic_cast< FunctionType* >( t ); } 161 161 162 162 FunctionType * get_functionType() const { return type; } … … 165 165 void set_statements( CompoundStmt *newValue ) { statements = newValue; } 166 166 167 virtual FunctionDecl *clone() const { return new FunctionDecl( *this ); }168 virtual void accept( Visitor &v ) { v.visit( this ); }169 virtual DeclarationWithType *acceptMutator( Mutator &m ) { return m.mutate( this ); }170 virtual void print( std::ostream &os, int indent = 0 ) const ;171 virtual void printShort( std::ostream &os, int indent = 0 ) const ;167 virtual FunctionDecl *clone() const override { return new FunctionDecl( *this ); } 168 virtual void accept( Visitor &v ) override { v.visit( this ); } 169 virtual DeclarationWithType *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 170 virtual void print( std::ostream &os, int indent = 0 ) const override; 171 virtual void printShort( std::ostream &os, int indent = 0 ) const override; 172 172 }; 173 173 … … 190 190 virtual std::string typeString() const = 0; 191 191 192 virtual NamedTypeDecl *clone() const = 0;193 virtual void print( std::ostream &os, int indent = 0 ) const ;194 virtual void printShort( std::ostream &os, int indent = 0 ) const ;192 virtual NamedTypeDecl *clone() const override = 0; 193 virtual void print( std::ostream &os, int indent = 0 ) const override; 194 virtual void printShort( std::ostream &os, int indent = 0 ) const override; 195 195 }; 196 196 … … 227 227 TypeDecl * set_sized( bool newValue ) { sized = newValue; return this; } 228 228 229 virtual std::string typeString() const ;229 virtual std::string typeString() const override; 230 230 virtual std::string genTypeString() const; 231 231 232 virtual TypeDecl *clone() const { return new TypeDecl( *this ); }233 virtual void accept( Visitor &v ) { v.visit( this ); }234 virtual Declaration *acceptMutator( Mutator &m ) { return m.mutate( this ); }235 virtual void print( std::ostream &os, int indent = 0 ) const ;232 virtual TypeDecl *clone() const override { return new TypeDecl( *this ); } 233 virtual void accept( Visitor &v ) override { v.visit( this ); } 234 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 235 virtual void print( std::ostream &os, int indent = 0 ) const override; 236 236 237 237 private: … … 245 245 TypedefDecl( const TypedefDecl &other ) : Parent( other ) {} 246 246 247 virtual std::string typeString() const ;248 249 virtual TypedefDecl *clone() const { return new TypedefDecl( *this ); }250 virtual void accept( Visitor &v ) { v.visit( this ); }251 virtual Declaration *acceptMutator( Mutator &m ) { return m.mutate( this ); }247 virtual std::string typeString() const override; 248 249 virtual TypedefDecl *clone() const override { return new TypedefDecl( *this ); } 250 virtual void accept( Visitor &v ) override { v.visit( this ); } 251 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 252 252 private: 253 253 }; … … 274 274 AggregateDecl * set_body( bool body ) { AggregateDecl::body = body; return this; } 275 275 276 virtual void print( std::ostream &os, int indent = 0 ) const ;277 virtual void printShort( std::ostream &os, int indent = 0 ) const ;276 virtual void print( std::ostream &os, int indent = 0 ) const override; 277 virtual void printShort( std::ostream &os, int indent = 0 ) const override; 278 278 protected: 279 279 virtual std::string typeString() const = 0; … … 290 290 bool is_thread() { return kind == DeclarationNode::Thread; } 291 291 292 virtual StructDecl *clone() const { return new StructDecl( *this ); }293 virtual void accept( Visitor &v ) { v.visit( this ); }294 virtual Declaration *acceptMutator( Mutator &m ) { return m.mutate( this ); }292 virtual StructDecl *clone() const override { return new StructDecl( *this ); } 293 virtual void accept( Visitor &v ) override { v.visit( this ); } 294 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 295 295 private: 296 296 DeclarationNode::Aggregate kind; 297 virtual std::string typeString() const ;297 virtual std::string typeString() const override; 298 298 }; 299 299 … … 304 304 UnionDecl( const UnionDecl &other ) : Parent( other ) {} 305 305 306 virtual UnionDecl *clone() const { return new UnionDecl( *this ); }307 virtual void accept( Visitor &v ) { v.visit( this ); }308 virtual Declaration *acceptMutator( Mutator &m ) { return m.mutate( this ); }309 private: 310 virtual std::string typeString() const ;306 virtual UnionDecl *clone() const override { return new UnionDecl( *this ); } 307 virtual void accept( Visitor &v ) override { v.visit( this ); } 308 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 309 private: 310 virtual std::string typeString() const override; 311 311 }; 312 312 … … 317 317 EnumDecl( const EnumDecl &other ) : Parent( other ) {} 318 318 319 virtual EnumDecl *clone() const { return new EnumDecl( *this ); }320 virtual void accept( Visitor &v ) { v.visit( this ); }321 virtual Declaration *acceptMutator( Mutator &m ) { return m.mutate( this ); }322 private: 323 virtual std::string typeString() const ;319 virtual EnumDecl *clone() const override { return new EnumDecl( *this ); } 320 virtual void accept( Visitor &v ) override { v.visit( this ); } 321 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 322 private: 323 virtual std::string typeString() const override; 324 324 }; 325 325 … … 332 332 TraitDecl( const TraitDecl &other ) : Parent( other ) {} 333 333 334 virtual TraitDecl *clone() const { return new TraitDecl( *this ); }335 virtual void accept( Visitor &v ) { v.visit( this ); }336 virtual Declaration *acceptMutator( Mutator &m ) { return m.mutate( this ); }337 private: 338 virtual std::string typeString() const ;334 virtual TraitDecl *clone() const override { return new TraitDecl( *this ); } 335 virtual void accept( Visitor &v ) override { v.visit( this ); } 336 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 337 private: 338 virtual std::string typeString() const override; 339 339 }; 340 340 … … 350 350 void set_stmt( AsmStmt *newValue ) { stmt = newValue; } 351 351 352 virtual AsmDecl *clone() const { return new AsmDecl( *this ); } 353 virtual void accept( Visitor &v ) { v.visit( this ); } 354 virtual AsmDecl *acceptMutator( Mutator &m ) { return m.mutate( this ); } 355 virtual void print( std::ostream &os, int indent = 0 ) const; 356 virtual void printShort( std::ostream &os, int indent = 0 ) const; 357 }; 358 359 std::ostream & operator<<( std::ostream & out, const Declaration * decl ); 352 virtual AsmDecl *clone() const override { return new AsmDecl( *this ); } 353 virtual void accept( Visitor &v ) override { v.visit( this ); } 354 virtual AsmDecl *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 355 virtual void print( std::ostream &os, int indent = 0 ) const override; 356 virtual void printShort( std::ostream &os, int indent = 0 ) const override; 357 }; 358 360 359 std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data ); 361 360 -
src/SynTree/Expression.cc
r9bae71f r7453a68 741 741 } 742 742 743 744 std::ostream & operator<<( std::ostream & out, const Expression * expr ) {745 if ( expr ) {746 expr->print( out );747 } else {748 out << "nullptr";749 }750 return out;751 }752 753 743 // Local Variables: // 754 744 // tab-width: 4 // -
src/SynTree/Expression.h
r9bae71f r7453a68 821 821 }; 822 822 823 824 std::ostream & operator<<( std::ostream & out, const Expression * expr );825 826 823 // Local Variables: // 827 824 // tab-width: 4 // -
src/SynTree/Initializer.cc
r9bae71f r7453a68 137 137 } 138 138 139 std::ostream & operator<<( std::ostream & out, const Initializer * init ) {140 if ( init ) {141 init->print( out );142 } else {143 out << "nullptr";144 }145 return out;146 }147 148 std::ostream & operator<<( std::ostream & out, const Designation * des ) {149 if ( des ) {150 des->print( out );151 } else {152 out << "nullptr";153 }154 return out;155 }156 157 139 // Local Variables: // 158 140 // tab-width: 4 // -
src/SynTree/Initializer.h
r9bae71f r7453a68 38 38 39 39 virtual Designation * clone() const { return new Designation( *this ); }; 40 virtual void accept( Visitor &v ) { v.visit( this ); }40 virtual void accept( Visitor &v ) override { v.visit( this ); } 41 41 virtual Designation * acceptMutator( Mutator &m ) { return m.mutate( this ); } 42 virtual void print( std::ostream &os, int indent = 0 ) const ;42 virtual void print( std::ostream &os, int indent = 0 ) const override; 43 43 }; 44 44 … … 55 55 56 56 virtual Initializer *clone() const = 0; 57 virtual void accept( Visitor &v ) = 0;57 virtual void accept( Visitor &v ) override = 0; 58 58 virtual Initializer *acceptMutator( Mutator &m ) = 0; 59 virtual void print( std::ostream &os, int indent = 0 ) const = 0;59 virtual void print( std::ostream &os, int indent = 0 ) const override = 0; 60 60 private: 61 61 bool maybeConstructed; … … 75 75 void set_value( Expression *newValue ) { value = newValue; } 76 76 77 virtual SingleInit *clone() const { return new SingleInit( *this); }78 virtual void accept( Visitor &v ) { v.visit( this ); }79 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }80 virtual void print( std::ostream &os, int indent = 0 ) const ;77 virtual SingleInit *clone() const override { return new SingleInit( *this); } 78 virtual void accept( Visitor &v ) override { v.visit( this ); } 79 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 80 virtual void print( std::ostream &os, int indent = 0 ) const override; 81 81 }; 82 82 … … 103 103 const_iterator end() const { return initializers.end(); } 104 104 105 virtual ListInit *clone() const { return new ListInit( *this ); }106 virtual void accept( Visitor &v ) { v.visit( this ); }107 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }108 virtual void print( std::ostream &os, int indent = 0 ) const ;105 virtual ListInit *clone() const override { return new ListInit( *this ); } 106 virtual void accept( Visitor &v ) override { v.visit( this ); } 107 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 108 virtual void print( std::ostream &os, int indent = 0 ) const override; 109 109 }; 110 110 … … 129 129 Initializer * get_init() const { return init; } 130 130 131 ConstructorInit *clone() const { return new ConstructorInit( *this ); }132 virtual void accept( Visitor &v ) { v.visit( this ); }133 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }134 virtual void print( std::ostream &os, int indent = 0 ) const ;131 ConstructorInit *clone() const override { return new ConstructorInit( *this ); } 132 virtual void accept( Visitor &v ) override { v.visit( this ); } 133 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 134 virtual void print( std::ostream &os, int indent = 0 ) const override; 135 135 136 136 private: … … 140 140 }; 141 141 142 std::ostream & operator<<( std::ostream & out, const Initializer * init );143 std::ostream & operator<<( std::ostream & out, const Designation * des );144 145 142 // Local Variables: // 146 143 // tab-width: 4 // -
src/SynTree/Statement.cc
r9bae71f r7453a68 168 168 } 169 169 170 SwitchStmt::SwitchStmt( std::list<Label> labels, Expression * condition, std::list<Statement *> &statements ):170 SwitchStmt::SwitchStmt( std::list<Label> labels, Expression * condition, const std::list<Statement *> &statements ): 171 171 Statement( labels ), condition( condition ), statements( statements ) { 172 172 } … … 196 196 } 197 197 198 CaseStmt::CaseStmt( std::list<Label> labels, Expression *condition, std::list<Statement *> &statements, bool deflt ) throw ( SemanticError ) :198 CaseStmt::CaseStmt( std::list<Label> labels, Expression *condition, const std::list<Statement *> &statements, bool deflt ) throw ( SemanticError ) : 199 199 Statement( labels ), condition( condition ), stmts( statements ), _isDefault( deflt ) { 200 200 if ( isDefault() && condition != 0 ) … … 497 497 } 498 498 499 std::ostream & operator<<( std::ostream & out, const Statement * statement ) {500 if ( statement ) {501 statement->print( out );502 } else {503 out << "nullptr";504 }505 return out;506 }507 508 499 // Local Variables: // 509 500 // tab-width: 4 // -
src/SynTree/Statement.h
r9bae71f r7453a68 44 44 45 45 virtual Statement *clone() const = 0; 46 virtual void accept( Visitor &v ) = 0;46 virtual void accept( Visitor &v ) override = 0; 47 47 virtual Statement *acceptMutator( Mutator &m ) = 0; 48 virtual void print( std::ostream &os, int indent = 0 ) const ;48 virtual void print( std::ostream &os, int indent = 0 ) const override; 49 49 }; 50 50 … … 54 54 55 55 CompoundStmt( std::list<Label> labels ); 56 CompoundStmt( std::list<Statement *> stmts ); 56 57 CompoundStmt( const CompoundStmt &other ); 57 58 virtual ~CompoundStmt(); … … 61 62 void push_front( Statement * stmt ) { kids.push_front( stmt ); } 62 63 63 virtual CompoundStmt *clone() const { return new CompoundStmt( *this ); }64 virtual void accept( Visitor &v ) { v.visit( this ); }65 virtual CompoundStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); }66 virtual void print( std::ostream &os, int indent = 0 ) const ;64 virtual CompoundStmt *clone() const override { return new CompoundStmt( *this ); } 65 virtual void accept( Visitor &v ) override { v.visit( this ); } 66 virtual CompoundStmt *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 67 virtual void print( std::ostream &os, int indent = 0 ) const override; 67 68 }; 68 69 … … 72 73 NullStmt( std::list<Label> labels ); 73 74 74 virtual NullStmt *clone() const { return new NullStmt( *this ); }75 virtual void accept( Visitor &v ) { v.visit( this ); }76 virtual NullStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); }77 virtual void print( std::ostream &os, int indent = 0 ) const ;75 virtual NullStmt *clone() const override { return new NullStmt( *this ); } 76 virtual void accept( Visitor &v ) override { v.visit( this ); } 77 virtual NullStmt *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 78 virtual void print( std::ostream &os, int indent = 0 ) const override; 78 79 }; 79 80 … … 89 90 void set_expr( Expression *newValue ) { expr = newValue; } 90 91 91 virtual ExprStmt *clone() const { return new ExprStmt( *this ); }92 virtual void accept( Visitor &v ) { v.visit( this ); }93 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }94 virtual void print( std::ostream &os, int indent = 0 ) const ;92 virtual ExprStmt *clone() const override { return new ExprStmt( *this ); } 93 virtual void accept( Visitor &v ) override { v.visit( this ); } 94 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 95 virtual void print( std::ostream &os, int indent = 0 ) const override; 95 96 }; 96 97 … … 146 147 void set_elsePart( Statement *newValue ) { elsePart = newValue; } 147 148 148 virtual IfStmt *clone() const { return new IfStmt( *this ); }149 virtual void accept( Visitor &v ) { v.visit( this ); }150 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }151 virtual void print( std::ostream &os, int indent = 0 ) const ;149 virtual IfStmt *clone() const override { return new IfStmt( *this ); } 150 virtual void accept( Visitor &v ) override { v.visit( this ); } 151 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 152 virtual void print( std::ostream &os, int indent = 0 ) const override; 152 153 }; 153 154 … … 157 158 std::list<Statement *> statements; 158 159 159 SwitchStmt( std::list<Label> labels, Expression *condition, std::list<Statement *> &statements );160 SwitchStmt( std::list<Label> labels, Expression *condition, const std::list<Statement *> &statements ); 160 161 SwitchStmt( const SwitchStmt &other ); 161 162 virtual ~SwitchStmt(); … … 166 167 std::list<Statement *> & get_statements() { return statements; } 167 168 168 virtual void accept( Visitor &v ) { v.visit( this ); }169 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }170 171 virtual SwitchStmt *clone() const { return new SwitchStmt( *this ); }172 virtual void print( std::ostream &os, int indent = 0 ) const ;169 virtual void accept( Visitor &v ) override { v.visit( this ); } 170 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 171 172 virtual SwitchStmt *clone() const override { return new SwitchStmt( *this ); } 173 virtual void print( std::ostream &os, int indent = 0 ) const override; 173 174 174 175 }; … … 179 180 std::list<Statement *> stmts; 180 181 181 CaseStmt( std::list<Label> labels, Expression *conditions, std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError);182 CaseStmt( std::list<Label> labels, Expression *conditions, const std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError); 182 183 CaseStmt( const CaseStmt &other ); 183 184 virtual ~CaseStmt(); … … 194 195 void set_statements( std::list<Statement *> &newValue ) { stmts = newValue; } 195 196 196 virtual void accept( Visitor &v ) { v.visit( this ); }197 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }198 199 virtual CaseStmt *clone() const { return new CaseStmt( *this ); }200 virtual void print( std::ostream &os, int indent = 0 ) const ;197 virtual void accept( Visitor &v ) override { v.visit( this ); } 198 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 199 200 virtual CaseStmt *clone() const override { return new CaseStmt( *this ); } 201 virtual void print( std::ostream &os, int indent = 0 ) const override; 201 202 private: 202 203 bool _isDefault; … … 221 222 void set_isDoWhile( bool newValue ) { isDoWhile = newValue; } 222 223 223 virtual WhileStmt *clone() const { return new WhileStmt( *this ); }224 virtual void accept( Visitor &v ) { v.visit( this ); }225 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }226 virtual void print( std::ostream &os, int indent = 0 ) const ;224 virtual WhileStmt *clone() const override { return new WhileStmt( *this ); } 225 virtual void accept( Visitor &v ) override { v.visit( this ); } 226 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 227 virtual void print( std::ostream &os, int indent = 0 ) const override; 227 228 }; 228 229 … … 247 248 void set_body( Statement *newValue ) { body = newValue; } 248 249 249 virtual ForStmt *clone() const { return new ForStmt( *this ); }250 virtual void accept( Visitor &v ) { v.visit( this ); }251 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }252 virtual void print( std::ostream &os, int indent = 0 ) const ;250 virtual ForStmt *clone() const override { return new ForStmt( *this ); } 251 virtual void accept( Visitor &v ) override { v.visit( this ); } 252 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 253 virtual void print( std::ostream &os, int indent = 0 ) const override; 253 254 }; 254 255 … … 276 277 const char *get_typename() { return brType[ type ]; } 277 278 278 virtual BranchStmt *clone() const { return new BranchStmt( *this ); }279 virtual void accept( Visitor &v ) { v.visit( this ); }280 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }281 virtual void print( std::ostream &os, int indent = 0 ) const ;279 virtual BranchStmt *clone() const override { return new BranchStmt( *this ); } 280 virtual void accept( Visitor &v ) override { v.visit( this ); } 281 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 282 virtual void print( std::ostream &os, int indent = 0 ) const override; 282 283 private: 283 284 static const char *brType[]; … … 295 296 void set_expr( Expression *newValue ) { expr = newValue; } 296 297 297 virtual ReturnStmt *clone() const { return new ReturnStmt( *this ); }298 virtual void accept( Visitor &v ) { v.visit( this ); }299 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }300 virtual void print( std::ostream &os, int indent = 0 ) const ;298 virtual ReturnStmt *clone() const override { return new ReturnStmt( *this ); } 299 virtual void accept( Visitor &v ) override { v.visit( this ); } 300 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 301 virtual void print( std::ostream &os, int indent = 0 ) const override; 301 302 }; 302 303 … … 319 320 void set_target( Expression * newTarget ) { target = newTarget; } 320 321 321 virtual ThrowStmt *clone() const { return new ThrowStmt( *this ); }322 virtual void accept( Visitor &v ) { v.visit( this ); }323 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }324 virtual void print( std::ostream &os, int indent = 0 ) const ;322 virtual ThrowStmt *clone() const override { return new ThrowStmt( *this ); } 323 virtual void accept( Visitor &v ) override { v.visit( this ); } 324 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 325 virtual void print( std::ostream &os, int indent = 0 ) const override; 325 326 }; 326 327 … … 342 343 void set_finally( FinallyStmt *newValue ) { finallyBlock = newValue; } 343 344 344 virtual TryStmt *clone() const { return new TryStmt( *this ); }345 virtual void accept( Visitor &v ) { v.visit( this ); }346 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }347 virtual void print( std::ostream &os, int indent = 0 ) const ;345 virtual TryStmt *clone() const override { return new TryStmt( *this ); } 346 virtual void accept( Visitor &v ) override { v.visit( this ); } 347 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 348 virtual void print( std::ostream &os, int indent = 0 ) const override; 348 349 }; 349 350 … … 370 371 void set_body( Statement *newValue ) { body = newValue; } 371 372 372 virtual CatchStmt *clone() const { return new CatchStmt( *this ); }373 virtual void accept( Visitor &v ) { v.visit( this ); }374 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }375 virtual void print( std::ostream &os, int indent = 0 ) const ;373 virtual CatchStmt *clone() const override { return new CatchStmt( *this ); } 374 virtual void accept( Visitor &v ) override { v.visit( this ); } 375 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 376 virtual void print( std::ostream &os, int indent = 0 ) const override; 376 377 }; 377 378 … … 387 388 void set_block( CompoundStmt *newValue ) { block = newValue; } 388 389 389 virtual FinallyStmt *clone() const { return new FinallyStmt( *this ); }390 virtual void accept( Visitor &v ) { v.visit( this ); }391 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }392 virtual void print( std::ostream &os, int indent = 0 ) const ;390 virtual FinallyStmt *clone() const override { return new FinallyStmt( *this ); } 391 virtual void accept( Visitor &v ) override { v.visit( this ); } 392 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 393 virtual void print( std::ostream &os, int indent = 0 ) const override; 393 394 }; 394 395 … … 424 425 } orelse; 425 426 426 virtual WaitForStmt *clone() const { return new WaitForStmt( *this ); }427 virtual void accept( Visitor &v ) { v.visit( this ); }428 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }429 virtual void print( std::ostream &os, int indent = 0 ) const ;427 virtual WaitForStmt *clone() const override { return new WaitForStmt( *this ); } 428 virtual void accept( Visitor &v ) override { v.visit( this ); } 429 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 430 virtual void print( std::ostream &os, int indent = 0 ) const override; 430 431 431 432 }; … … 444 445 void set_decl( Declaration *newValue ) { decl = newValue; } 445 446 446 virtual DeclStmt *clone() const { return new DeclStmt( *this ); }447 virtual void accept( Visitor &v ) { v.visit( this ); }448 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }449 virtual void print( std::ostream &os, int indent = 0 ) const ;447 virtual DeclStmt *clone() const override { return new DeclStmt( *this ); } 448 virtual void accept( Visitor &v ) override { v.visit( this ); } 449 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 450 virtual void print( std::ostream &os, int indent = 0 ) const override; 450 451 }; 451 452 … … 466 467 void set_callStmt( Statement * newValue ) { callStmt = newValue; } 467 468 468 virtual ImplicitCtorDtorStmt *clone() const { return new ImplicitCtorDtorStmt( *this ); } 469 virtual void accept( Visitor &v ) { v.visit( this ); } 470 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 471 virtual void print( std::ostream &os, int indent = 0 ) const; 472 }; 473 474 475 std::ostream & operator<<( std::ostream & out, const Statement * statement ); 469 virtual ImplicitCtorDtorStmt *clone() const override { return new ImplicitCtorDtorStmt( *this ); } 470 virtual void accept( Visitor &v ) override { v.visit( this ); } 471 virtual Statement *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 472 virtual void print( std::ostream &os, int indent = 0 ) const override; 473 }; 476 474 477 475 // Local Variables: // -
src/SynTree/Type.cc
r9bae71f r7453a68 99 99 const Type::Qualifiers noQualifiers; 100 100 101 std::ostream & operator<<( std::ostream & out, const Type * type ) {102 if ( type ) {103 type->print( out );104 } else {105 out << "nullptr";106 } // if107 return out;108 }109 110 101 // Local Variables: // 111 102 // tab-width: 4 // -
src/SynTree/Type.h
r9bae71f r7453a68 192 192 VoidType( const Type::Qualifiers & tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 193 193 194 virtual unsigned size() const { return 0; };195 virtual bool isComplete() const { return false; }196 197 virtual VoidType *clone() const { return new VoidType( *this ); }198 virtual void accept( Visitor & v ) { v.visit( this ); }199 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }200 virtual void print( std::ostream & os, int indent = 0 ) const ;194 virtual unsigned size() const override { return 0; }; 195 virtual bool isComplete() const override { return false; } 196 197 virtual VoidType *clone() const override { return new VoidType( *this ); } 198 virtual void accept( Visitor & v ) override { v.visit( this ); } 199 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 200 virtual void print( std::ostream & os, int indent = 0 ) const override; 201 201 }; 202 202 … … 235 235 void set_kind( Kind newValue ) { kind = newValue; } 236 236 237 virtual BasicType *clone() const { return new BasicType( *this ); }238 virtual void accept( Visitor & v ) { v.visit( this ); }239 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }240 virtual void print( std::ostream & os, int indent = 0 ) const ;237 virtual BasicType *clone() const override { return new BasicType( *this ); } 238 virtual void accept( Visitor & v ) override { v.visit( this ); } 239 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 240 virtual void print( std::ostream & os, int indent = 0 ) const override; 241 241 242 242 bool isInteger() const; … … 268 268 bool is_array() const { return isStatic || isVarLen || dimension; } 269 269 270 virtual bool isComplete() const { return ! isVarLen; }271 272 virtual PointerType *clone() const { return new PointerType( *this ); }273 virtual void accept( Visitor & v ) { v.visit( this ); }274 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }275 virtual void print( std::ostream & os, int indent = 0 ) const ;270 virtual bool isComplete() const override { return ! isVarLen; } 271 272 virtual PointerType *clone() const override { return new PointerType( *this ); } 273 virtual void accept( Visitor & v ) override { v.visit( this ); } 274 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 275 virtual void print( std::ostream & os, int indent = 0 ) const override; 276 276 }; 277 277 … … 296 296 void set_isStatic( bool newValue ) { isStatic = newValue; } 297 297 298 virtual bool isComplete() const { return ! isVarLen; }299 300 virtual ArrayType *clone() const { return new ArrayType( *this ); }301 virtual void accept( Visitor & v ) { v.visit( this ); }302 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }303 virtual void print( std::ostream & os, int indent = 0 ) const ;298 virtual bool isComplete() const override { return ! isVarLen; } 299 300 virtual ArrayType *clone() const override { return new ArrayType( *this ); } 301 virtual void accept( Visitor & v ) override { v.visit( this ); } 302 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 303 virtual void print( std::ostream & os, int indent = 0 ) const override; 304 304 }; 305 305 … … 315 315 void set_base( Type *newValue ) { base = newValue; } 316 316 317 virtual int referenceDepth() const ;317 virtual int referenceDepth() const override; 318 318 319 319 // Since reference types act like value types, their size is the size of the base. 320 320 // This makes it simple to cast the empty tuple to a reference type, since casts that increase 321 321 // the number of values are disallowed. 322 virtual unsigned size() const { return base->size(); }323 324 virtual ReferenceType *clone() const { return new ReferenceType( *this ); }325 virtual void accept( Visitor & v ) { v.visit( this ); }326 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }327 virtual void print( std::ostream & os, int indent = 0 ) const ;322 virtual unsigned size() const override { return base->size(); } 323 324 virtual ReferenceType *clone() const override { return new ReferenceType( *this ); } 325 virtual void accept( Visitor & v ) override { v.visit( this ); } 326 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 327 virtual void print( std::ostream & os, int indent = 0 ) const override; 328 328 }; 329 329 … … 349 349 bool isTtype() const; 350 350 351 virtual FunctionType *clone() const { return new FunctionType( *this ); }352 virtual void accept( Visitor & v ) { v.visit( this ); }353 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }354 virtual void print( std::ostream & os, int indent = 0 ) const ;351 virtual FunctionType *clone() const override { return new FunctionType( *this ); } 352 virtual void accept( Visitor & v ) override { v.visit( this ); } 353 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 354 virtual void print( std::ostream & os, int indent = 0 ) const override; 355 355 }; 356 356 … … 371 371 void set_hoistType( bool newValue ) { hoistType = newValue; } 372 372 373 virtual ReferenceToType *clone() const = 0;374 virtual void accept( Visitor & v ) = 0;375 virtual Type *acceptMutator( Mutator & m ) = 0;376 virtual void print( std::ostream & os, int indent = 0 ) const ;373 virtual ReferenceToType *clone() const override = 0; 374 virtual void accept( Visitor & v ) override = 0; 375 virtual Type *acceptMutator( Mutator & m ) override = 0; 376 virtual void print( std::ostream & os, int indent = 0 ) const override; 377 377 378 378 virtual void lookup( __attribute__((unused)) const std::string & name, __attribute__((unused)) std::list< Declaration* > & foundDecls ) const {} … … 398 398 std::list<TypeDecl*> * get_baseParameters(); 399 399 400 virtual bool isComplete() const ;400 virtual bool isComplete() const override; 401 401 402 402 /// Looks up the members of this struct named "name" and places them into "foundDecls". 403 403 /// Clones declarations into "foundDecls", caller responsible for freeing 404 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const ;405 406 virtual StructInstType *clone() const { return new StructInstType( *this ); }407 virtual void accept( Visitor & v ) { v.visit( this ); }408 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }409 410 virtual void print( std::ostream & os, int indent = 0 ) const ;404 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override; 405 406 virtual StructInstType *clone() const override { return new StructInstType( *this ); } 407 virtual void accept( Visitor & v ) override { v.visit( this ); } 408 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 409 410 virtual void print( std::ostream & os, int indent = 0 ) const override; 411 411 private: 412 virtual std::string typeString() const ;412 virtual std::string typeString() const override; 413 413 }; 414 414 … … 430 430 std::list< TypeDecl * > * get_baseParameters(); 431 431 432 virtual bool isComplete() const ;432 virtual bool isComplete() const override; 433 433 434 434 /// looks up the members of this union named "name" and places them into "foundDecls" 435 435 /// Clones declarations into "foundDecls", caller responsible for freeing 436 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const ;437 438 virtual UnionInstType *clone() const { return new UnionInstType( *this ); }439 virtual void accept( Visitor & v ) { v.visit( this ); }440 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }441 442 virtual void print( std::ostream & os, int indent = 0 ) const ;436 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override; 437 438 virtual UnionInstType *clone() const override { return new UnionInstType( *this ); } 439 virtual void accept( Visitor & v ) override { v.visit( this ); } 440 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 441 442 virtual void print( std::ostream & os, int indent = 0 ) const override; 443 443 private: 444 virtual std::string typeString() const ;444 virtual std::string typeString() const override; 445 445 }; 446 446 … … 459 459 void set_baseEnum( EnumDecl *newValue ) { baseEnum = newValue; } 460 460 461 virtual bool isComplete() const ;462 463 virtual EnumInstType *clone() const { return new EnumInstType( *this ); }464 virtual void accept( Visitor & v ) { v.visit( this ); }465 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }461 virtual bool isComplete() const override; 462 463 virtual EnumInstType *clone() const override { return new EnumInstType( *this ); } 464 virtual void accept( Visitor & v ) override { v.visit( this ); } 465 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 466 466 private: 467 virtual std::string typeString() const ;467 virtual std::string typeString() const override; 468 468 }; 469 469 … … 480 480 ~TraitInstType(); 481 481 482 virtual bool isComplete() const ;483 484 virtual TraitInstType *clone() const { return new TraitInstType( *this ); }485 virtual void accept( Visitor & v ) { v.visit( this ); }486 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }482 virtual bool isComplete() const override; 483 484 virtual TraitInstType *clone() const override { return new TraitInstType( *this ); } 485 virtual void accept( Visitor & v ) override { v.visit( this ); } 486 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 487 487 private: 488 virtual std::string typeString() const ;488 virtual std::string typeString() const override; 489 489 }; 490 490 … … 507 507 void set_isFtype( bool newValue ) { isFtype = newValue; } 508 508 509 virtual bool isComplete() const ;510 511 virtual TypeInstType *clone() const { return new TypeInstType( *this ); }512 virtual void accept( Visitor & v ) { v.visit( this ); }513 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }514 virtual void print( std::ostream & os, int indent = 0 ) const ;509 virtual bool isComplete() const override; 510 511 virtual TypeInstType *clone() const override { return new TypeInstType( *this ); } 512 virtual void accept( Visitor & v ) override { v.visit( this ); } 513 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 514 virtual void print( std::ostream & os, int indent = 0 ) const override; 515 515 private: 516 virtual std::string typeString() const ;516 virtual std::string typeString() const override; 517 517 }; 518 518 … … 530 530 531 531 std::list<Type *> & get_types() { return types; } 532 virtual unsigned size() const { return types.size(); };532 virtual unsigned size() const override { return types.size(); }; 533 533 534 534 // For now, this is entirely synthetic -- tuple types always have unnamed members. … … 539 539 iterator end() { return types.end(); } 540 540 541 virtual Type * getComponent( unsigned i ) {541 virtual Type * getComponent( unsigned i ) override { 542 542 assertf( i < size(), "TupleType::getComponent: index %d must be less than size %d", i, size() ); 543 543 return *(begin()+i); 544 544 } 545 545 546 // virtual bool isComplete() const { return true; } // xxx - not sure if this is right, might need to recursively check complete-ness547 548 virtual TupleType *clone() const { return new TupleType( *this ); }549 virtual void accept( Visitor & v ) { v.visit( this ); }550 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }551 virtual void print( std::ostream & os, int indent = 0 ) const ;546 // virtual bool isComplete() const override { return true; } // xxx - not sure if this is right, might need to recursively check complete-ness 547 548 virtual TupleType *clone() const override { return new TupleType( *this ); } 549 virtual void accept( Visitor & v ) override { v.visit( this ); } 550 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 551 virtual void print( std::ostream & os, int indent = 0 ) const override; 552 552 }; 553 553 … … 563 563 void set_expr( Expression *newValue ) { expr = newValue; } 564 564 565 virtual bool isComplete() const { assert( false ); return false; }566 567 virtual TypeofType *clone() const { return new TypeofType( *this ); }568 virtual void accept( Visitor & v ) { v.visit( this ); }569 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }570 virtual void print( std::ostream & os, int indent = 0 ) const ;565 virtual bool isComplete() const override { assert( false ); return false; } 566 567 virtual TypeofType *clone() const override { return new TypeofType( *this ); } 568 virtual void accept( Visitor & v ) override { v.visit( this ); } 569 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 570 virtual void print( std::ostream & os, int indent = 0 ) const override; 571 571 }; 572 572 … … 592 592 void set_isType( bool newValue ) { isType = newValue; } 593 593 594 virtual bool isComplete() const { assert( false ); } // xxx - not sure what to do here595 596 virtual AttrType *clone() const { return new AttrType( *this ); }597 virtual void accept( Visitor & v ) { v.visit( this ); }598 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }599 virtual void print( std::ostream & os, int indent = 0 ) const ;594 virtual bool isComplete() const override { assert( false ); } // xxx - not sure what to do here 595 596 virtual AttrType *clone() const override { return new AttrType( *this ); } 597 virtual void accept( Visitor & v ) override { v.visit( this ); } 598 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 599 virtual void print( std::ostream & os, int indent = 0 ) const override; 600 600 }; 601 601 … … 606 606 VarArgsType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 607 607 608 virtual bool isComplete() const { return true; } // xxx - is this right?609 610 virtual VarArgsType *clone() const { return new VarArgsType( *this ); }611 virtual void accept( Visitor & v ) { v.visit( this ); }612 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }613 virtual void print( std::ostream & os, int indent = 0 ) const ;608 virtual bool isComplete() const override{ return true; } // xxx - is this right? 609 610 virtual VarArgsType *clone() const override { return new VarArgsType( *this ); } 611 virtual void accept( Visitor & v ) override { v.visit( this ); } 612 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 613 virtual void print( std::ostream & os, int indent = 0 ) const override; 614 614 }; 615 615 … … 620 620 ZeroType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 621 621 622 virtual ZeroType *clone() const { return new ZeroType( *this ); }623 virtual void accept( Visitor & v ) { v.visit( this ); }624 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }625 virtual void print( std::ostream & os, int indent = 0 ) const ;622 virtual ZeroType *clone() const override { return new ZeroType( *this ); } 623 virtual void accept( Visitor & v ) override { v.visit( this ); } 624 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 625 virtual void print( std::ostream & os, int indent = 0 ) const override; 626 626 }; 627 627 … … 632 632 OneType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 633 633 634 virtual OneType *clone() const { return new OneType( *this ); } 635 virtual void accept( Visitor & v ) { v.visit( this ); } 636 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 637 virtual void print( std::ostream & os, int indent = 0 ) const; 638 }; 639 640 std::ostream & operator<<( std::ostream & out, const Type * type ); 634 virtual OneType *clone() const override { return new OneType( *this ); } 635 virtual void accept( Visitor & v ) override { v.visit( this ); } 636 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 637 virtual void print( std::ostream & os, int indent = 0 ) const override; 638 }; 641 639 642 640 // Local Variables: // -
src/libcfa/concurrency/invoke.h
r9bae71f r7453a68 84 84 }; 85 85 86 struct __waitfor_mask_t { 87 short * accepted; // the index of the accepted function, -1 if none 88 struct __acceptable_t * clauses; // list of acceptable functions, null if any 89 short size; // number of acceptable functions 90 }; 91 86 92 struct monitor_desc { 87 93 struct spinlock lock; // spinlock to protect internal data … … 90 96 struct __condition_stack_t signal_stack; // stack of conditions to run next once we exit the monitor 91 97 unsigned int recursion; // monitor routines can be called recursively, we need to keep track of that 98 struct __waitfor_mask_t mask; // mask used to know if some thread is waiting for something while holding the monitor 99 }; 92 100 93 struct __acceptable_t * acceptables; // list of acceptable functions, null if any 94 unsigned short acceptable_count; // number of acceptable functions 95 short accepted_index; // the index of the accepted function, -1 if none 96 }; 101 struct __monitor_group_t { 102 struct monitor_desc ** list; // currently held monitors 103 short size; // number of currently held monitors 104 fptr_t func; // last function that acquired monitors 105 }; 97 106 98 107 struct thread_desc { 99 108 // Core threading fields 100 struct coroutine_desc cor; // coroutine body used to store context 101 struct monitor_desc mon; // monitor body used for mutual exclusion 109 struct coroutine_desc self_cor; // coroutine body used to store context 110 struct monitor_desc self_mon; // monitor body used for mutual exclusion 111 struct monitor_desc * self_mon_p; // pointer to monitor with sufficient lifetime for current monitors 112 struct __monitor_group_t monitors; // monitors currently held by this thread 102 113 103 114 // Link lists fields 104 115 struct thread_desc * next; // instrusive link field for threads 105 116 106 // Current status related to monitors 107 struct monitor_desc ** current_monitors; // currently held monitors 108 unsigned short current_monitor_count; // number of currently held monitors 109 fptr_t current_monitor_func; // last function that acquired monitors 117 110 118 }; 119 120 #ifdef __CFORALL__ 121 extern "Cforall" { 122 static inline monitor_desc * ?[?]( const __monitor_group_t & this, ptrdiff_t index ) { 123 return this.list[index]; 124 } 125 126 static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) { 127 if( lhs.size != rhs.size ) return false; 128 if( lhs.func != rhs.func ) return false; 129 130 // Check that all the monitors match 131 for( int i = 0; i < lhs.size; i++ ) { 132 // If not a match, check next function 133 if( lhs[i] != rhs[i] ) return false; 134 } 135 136 return true; 137 } 138 } 139 #endif 111 140 112 141 #endif //_INVOKE_H_ -
src/libcfa/concurrency/kernel.c
r9bae71f r7453a68 106 106 107 107 void ?{}( thread_desc & this, current_stack_info_t * info) { 108 (this. cor){ info };108 (this.self_cor){ info }; 109 109 } 110 110 … … 328 328 // if( !thrd ) return; 329 329 verify( thrd ); 330 verify( thrd-> cor.state != Halted );330 verify( thrd->self_cor.state != Halted ); 331 331 332 332 verify( disable_preempt_count > 0 ); … … 373 373 assert(thrd); 374 374 disable_interrupts(); 375 assert( thrd-> cor.state != Halted );375 assert( thrd->self_cor.state != Halted ); 376 376 this_processor->finish.action_code = Schedule; 377 377 this_processor->finish.thrd = thrd; … … 466 466 this_processor = mainProcessor; 467 467 this_thread = mainThread; 468 this_coroutine = &mainThread-> cor;468 this_coroutine = &mainThread->self_cor; 469 469 470 470 // Enable preemption … … 547 547 thread_desc * thrd = kernel_data; 548 548 549 int len = snprintf( abort_text, abort_text_size, "Error occurred while executing task %.256s (%p)", thrd-> cor.name, thrd );549 int len = snprintf( abort_text, abort_text_size, "Error occurred while executing task %.256s (%p)", thrd->self_cor.name, thrd ); 550 550 __lib_debug_write( STDERR_FILENO, abort_text, len ); 551 551 -
src/libcfa/concurrency/monitor
r9bae71f r7453a68 22 22 #include "stdlib" 23 23 24 trait is_monitor(dtype T) { 25 monitor_desc * get_monitor( T & ); 26 void ^?{}( T & mutex ); 27 }; 28 24 29 static inline void ?{}(monitor_desc & this) { 25 30 (this.lock){}; … … 28 33 (this.signal_stack){}; 29 34 this.recursion = 0; 30 this. acceptables= NULL;31 this. acceptable_count = 0;32 this. accepted_index = -1;35 this.mask.accepted = NULL; 36 this.mask.clauses = NULL; 37 this.mask.size = 0; 33 38 } 34 39 … … 100 105 101 106 struct __acceptable_t { 102 fptr_t func; 103 unsigned short count; 104 monitor_desc ** monitors; 107 __monitor_group_t; 105 108 bool is_dtor; 106 109 }; 107 110 108 int __accept_internal( unsigned short count, __acceptable_t * acceptables);111 void __waitfor_internal( const __waitfor_mask_t & mask, int duration ); 109 112 110 113 // Local Variables: // -
src/libcfa/concurrency/monitor.c
r9bae71f r7453a68 25 25 static inline void set_owner( monitor_desc * this, thread_desc * owner ); 26 26 static inline thread_desc * next_thread( monitor_desc * this ); 27 static inline int is_accepted( thread_desc * owner, monitor_desc * this, monitor_desc ** group, int group_cnt, void (*func)());27 static inline bool is_accepted( monitor_desc * this, const __monitor_group_t & monitors ); 28 28 29 29 static inline void lock_all( spinlock ** locks, unsigned short count ); … … 42 42 static inline unsigned short insert_unique( thread_desc ** thrds, unsigned short end, thread_desc * val ); 43 43 44 static inline thread_desc * search_entry_queue( __acceptable_t * acceptables, int acc_count, monitor_desc ** monitors, int count ); 44 static inline [thread_desc *, int] search_entry_queue( const __waitfor_mask_t &, monitor_desc ** monitors, int count ); 45 46 static inline short count_max( const __waitfor_mask_t & mask ); 47 static inline short aggregate( monitor_desc ** storage, const __waitfor_mask_t & mask ); 48 static inline void set_mask ( monitor_desc ** storage, short count, const __waitfor_mask_t & mask ); 45 49 46 50 //----------------------------------------------------------------------------- … … 68 72 extern "C" { 69 73 // Enter single monitor 70 static void __enter_monitor_desc( monitor_desc * this, monitor_desc ** group, int group_cnt, void (*func)() ) { 74 static void __enter_monitor_desc( const __monitor_group_t & group ) { 75 monitor_desc * this = group.list[0]; 76 71 77 // Lock the monitor spinlock, lock_yield to reduce contention 72 78 lock_yield( &this->lock DEBUG_CTX2 ); … … 75 81 LIB_DEBUG_PRINT_SAFE("Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner); 76 82 77 this->accepted_index = -1;78 83 if( !this->owner ) { 79 84 // No one has the monitor, just take it … … 89 94 LIB_DEBUG_PRINT_SAFE("Kernel : mon already owned \n"); 90 95 } 91 else if( (this->accepted_index = is_accepted( thrd, this, group, group_cnt, func)) >= 0) {96 else if( is_accepted( this, group) ) { 92 97 // Some one was waiting for us, enter 93 98 set_owner( this, thrd ); … … 146 151 // Should never return 147 152 void __leave_thread_monitor( thread_desc * thrd ) { 148 monitor_desc * this = &thrd-> mon;153 monitor_desc * this = &thrd->self_mon; 149 154 150 155 // Lock the monitor now … … 153 158 disable_interrupts(); 154 159 155 thrd-> cor.state = Halted;160 thrd->self_cor.state = Halted; 156 161 157 162 verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i)", thrd, this->owner, this->recursion ); … … 178 183 // Enter multiple monitor 179 184 // relies on the monitor array being sorted 180 static inline void enter( monitor_desc ** monitors, int count, void (*func)()) {181 for(int i = 0; i < count; i++) {182 __enter_monitor_desc( monitors [i], monitors, count, func);185 static inline void enter( __monitor_group_t monitors ) { 186 for(int i = 0; i < monitors.size; i++) { 187 __enter_monitor_desc( monitors ); 183 188 } 184 189 } … … 203 208 204 209 // Save previous thread context 205 this.prev_mntrs = this_thread-> current_monitors;206 this.prev_count = this_thread-> current_monitor_count;207 this.prev_func = this_thread-> current_monitor_func;210 this.prev_mntrs = this_thread->monitors.list; 211 this.prev_count = this_thread->monitors.size; 212 this.prev_func = this_thread->monitors.func; 208 213 209 214 // Update thread context (needed for conditions) 210 this_thread-> current_monitors= m;211 this_thread-> current_monitor_count= count;212 this_thread-> current_monitor_func= func;215 this_thread->monitors.list = m; 216 this_thread->monitors.size = count; 217 this_thread->monitors.func = func; 213 218 214 219 // Enter the monitors in order 215 enter( this.m, this.count, func ); 220 __monitor_group_t group = {this.m, this.count, func}; 221 enter( group ); 216 222 } 217 223 … … 223 229 224 230 // Restore thread context 225 this_thread-> current_monitors= this.prev_mntrs;226 this_thread-> current_monitor_count= this.prev_count;227 this_thread-> current_monitor_func= this.prev_func;231 this_thread->monitors.list = this.prev_mntrs; 232 this_thread->monitors.size = this.prev_count; 233 this_thread->monitors.func = this.prev_func; 228 234 } 229 235 … … 274 280 lock_all( monitors, locks, count ); 275 281 276 // DON'T unlock, ask the kernel to do it277 278 // Save monitor state279 save_recursion( monitors, recursions, count );280 281 282 // Find the next thread(s) to run 282 283 unsigned short thread_count = 0; … … 292 293 } 293 294 295 // Save monitor state 296 save_recursion( monitors, recursions, count ); 297 294 298 // Everything is ready to go to sleep 295 299 BlockInternal( locks, count, threads, thread_count ); … … 315 319 LIB_DEBUG_DO( 316 320 thread_desc * this_thrd = this_thread; 317 if ( this->monitor_count != this_thrd-> current_monitor_count) {318 abortf( "Signal on condition %p made with different number of monitor(s), expected %i got %i", this, this->monitor_count, this_thrd-> current_monitor_count);321 if ( this->monitor_count != this_thrd->monitors.size ) { 322 abortf( "Signal on condition %p made with different number of monitor(s), expected %i got %i", this, this->monitor_count, this_thrd->monitors.size ); 319 323 } 320 324 321 325 for(int i = 0; i < this->monitor_count; i++) { 322 if ( this->monitors[i] != this_thrd-> current_monitors[i] ) {323 abortf( "Signal on condition %p made with different monitor, expected %p got %i", this, this->monitors[i], this_thrd-> current_monitors[i] );326 if ( this->monitors[i] != this_thrd->monitors.list[i] ) { 327 abortf( "Signal on condition %p made with different monitor, expected %p got %i", this, this->monitors[i], this_thrd->monitors.list[i] ); 324 328 } 325 329 } … … 397 401 398 402 //----------------------------------------------------------------------------- 399 // Internal scheduling 400 int __accept_internal( unsigned short acc_count, __acceptable_t * acceptables ) { 401 thread_desc * thrd = this_thread; 403 // External scheduling 404 // cases to handle : 405 // - target already there : 406 // block and wake 407 // - dtor already there 408 // put thread on signaller stack 409 // - non-blocking 410 // return else 411 // - timeout 412 // return timeout 413 // - block 414 // setup mask 415 // block 416 void __waitfor_internal( const __waitfor_mask_t & mask, int duration ) { 417 // This statment doesn't have a contiguous list of monitors... 418 // Create one! 419 short max = count_max( mask ); 420 monitor_desc * mon_storage[max]; 421 short actual_count = aggregate( mon_storage, mask ); 402 422 403 423 // Create storage for monitor context 404 monitor_ctx( acceptables->monitors, acceptables->count );424 monitor_ctx( mon_storage, actual_count ); 405 425 406 426 // Lock all monitors (aggregates the lock them as well) 407 427 lock_all( monitors, locks, count ); 408 428 409 // Create the node specific to this wait operation 410 wait_ctx_primed( thrd, 0 ); 411 412 // Check if the entry queue 413 thread_desc * next = search_entry_queue( acceptables, acc_count, monitors, count ); 414 415 LIB_DEBUG_PRINT_SAFE("Owner(s) :"); 416 for(int i = 0; i < count; i++) { 417 LIB_DEBUG_PRINT_SAFE(" %p", monitors[i]->owner ); 418 } 419 LIB_DEBUG_PRINT_SAFE("\n"); 420 421 LIB_DEBUG_PRINT_SAFE("Passing mon to %p\n", next); 422 423 if( !next ) { 424 // Update acceptables on the current monitors 425 for(int i = 0; i < count; i++) { 426 monitors[i]->acceptables = acceptables; 427 monitors[i]->acceptable_count = acc_count; 428 } 429 } 430 else { 431 for(int i = 0; i < count; i++) { 432 set_owner( monitors[i], next ); 433 } 434 } 429 { 430 // Check if the entry queue 431 thread_desc * next; int index; 432 [next, index] = search_entry_queue( mask, monitors, count ); 433 434 if( next ) { 435 if( mask.clauses[index].is_dtor ) { 436 #warning case not implemented 437 } 438 else { 439 save_recursion( monitors, recursions, count ); 440 441 // Everything is ready to go to sleep 442 BlockInternal( locks, count, &next, 1 ); 443 444 445 //WE WOKE UP 446 447 448 //We are back, restore the owners and recursions 449 lock_all( locks, count ); 450 restore_recursion( monitors, recursions, count ); 451 unlock_all( locks, count ); 452 } 453 454 return index; 455 } 456 } 457 458 459 if( duration == 0 ) return -1; 460 461 462 verifyf( duration < 0, "Timeout on waitfor statments not supported yet."); 435 463 436 464 437 465 save_recursion( monitors, recursions, count ); 466 set_mask( monitors, count, mask ); 438 467 439 468 440 469 // Everything is ready to go to sleep 441 BlockInternal( locks, count , &next, next ? 1 : 0);470 BlockInternal( locks, count ); 442 471 443 472 … … 448 477 lock_all( locks, count ); 449 478 restore_recursion( monitors, recursions, count ); 450 int acc_idx = monitors[0]->accepted_index;451 479 unlock_all( locks, count ); 452 480 453 return acc_idx;481 return mask.accepted; 454 482 } 455 483 … … 485 513 } 486 514 487 static inline int is_accepted( thread_desc * owner, monitor_desc * this, monitor_desc ** group, int group_cnt, void (*func)() ) {488 __acceptable_t* accs = this->acceptables; // Optim489 int acc_cnt = this->acceptable_count;490 491 // Check if there are any acceptable functions492 if( !accs ) return -1;493 494 // If this isn't the first monitor to test this, there is no reason to repeat the test.495 if( this != group[0] ) return group[0]->accepted_index;496 497 // For all acceptable functions check if this is the current function.498 OUT_LOOP:499 for( int i = 0; i < acc_cnt; i++ ) {500 __acceptable_t * acc = &accs[i];501 502 // if function matches, check the monitors503 if( acc->func == func ) {504 505 // If the group count is different then it can't be a match506 if( acc->count != group_cnt ) return -1;507 508 // Check that all the monitors match509 for( int j = 0; j < group_cnt; j++ ) {510 // If not a match, check next function511 if( acc->monitors[j] != group[j] ) continue OUT_LOOP;512 }513 514 // It's a complete match, accept the call515 return i;516 }517 }518 519 // No function matched520 return -1;521 }522 523 515 static inline void init( int count, monitor_desc ** monitors, __condition_node_t * waiter, __condition_criterion_t * criteria ) { 524 516 for(int i = 0; i < count; i++) { … … 607 599 if( !this->monitors ) { 608 600 // LIB_DEBUG_PRINT_SAFE("Branding\n"); 609 assertf( thrd-> current_monitors != NULL, "No current monitor to brand condition %p", thrd->current_monitors);610 this->monitor_count = thrd-> current_monitor_count;601 assertf( thrd->monitors.list != NULL, "No current monitor to brand condition %p", thrd->monitors.list ); 602 this->monitor_count = thrd->monitors.size; 611 603 612 604 this->monitors = malloc( this->monitor_count * sizeof( *this->monitors ) ); 613 605 for( int i = 0; i < this->monitor_count; i++ ) { 614 this->monitors[i] = thrd-> current_monitors[i];606 this->monitors[i] = thrd->monitors.list[i]; 615 607 } 616 608 } … … 628 620 } 629 621 630 631 static inline bool match( __acceptable_t * acc, thread_desc * thrd ) { 632 verify( thrd ); 633 verify( acc ); 634 if( acc->func != thrd->current_monitor_func ) return false; 635 636 return true; 637 } 638 639 static inline thread_desc * search_entry_queue( __acceptable_t * acceptables, int acc_count, monitor_desc ** monitors, int count ) { 622 static inline bool is_accepted( monitor_desc * this, const __monitor_group_t & group ) { 623 __acceptable_t * it = this->mask.clauses; // Optim 624 int count = this->mask.size; 625 626 // Check if there are any acceptable functions 627 if( !it ) return -1; 628 629 // If this isn't the first monitor to test this, there is no reason to repeat the test. 630 if( this != group[0] ) return group[0]->mask.accepted >= 0; 631 632 // For all acceptable functions check if this is the current function. 633 for( short i = 0; i < count; i++, it++ ) { 634 if( *it == group ) { 635 *this->mask.accepted = i; 636 return true; 637 } 638 } 639 640 // No function matched 641 return false; 642 } 643 644 static inline [thread_desc *, int] search_entry_queue( const __waitfor_mask_t & mask, monitor_desc ** monitors, int count ) { 640 645 641 646 __thread_queue_t * entry_queue = &monitors[0]->entry_queue; … … 647 652 { 648 653 // For each acceptable check if it matches 649 __acceptable_t * acc_end = acceptables + acc_count; 650 for( __acceptable_t * acc_it = acceptables; acc_it != acc_end; acc_it++ ) { 654 int i; 655 __acceptable_t * end = mask.clauses + mask.size; 656 for( __acceptable_t * it = mask.clauses; it != end; it++, i++ ) { 651 657 // Check if we have a match 652 if( match( acc_it, *thrd_it )) {658 if( *it == (*thrd_it)->monitors ) { 653 659 654 660 // If we have a match return it 655 661 // after removeing it from the entry queue 656 return remove( entry_queue, thrd_it );662 return [remove( entry_queue, thrd_it ), i]; 657 663 } 658 664 } 659 665 } 660 666 661 return NULL; 662 } 667 return [0, -1]; 668 } 669 670 static inline short count_max( const __waitfor_mask_t & mask ) { 671 short max = 0; 672 for( int i = 0; i < mask.size; i++ ) { 673 max += mask.clauses[i].size; 674 } 675 return max; 676 } 677 678 static inline short aggregate( monitor_desc ** storage, const __waitfor_mask_t & mask ) { 679 #warning function not implemented 680 return 0; 681 } 682 683 static inline void set_mask( monitor_desc ** storage, short count, const __waitfor_mask_t & mask ) { 684 for(int i = 0; i < count; i++) { 685 storage[i]->mask = mask; 686 } 687 } 688 689 663 690 void ?{}( __condition_blocked_queue_t & this ) { 664 691 this.head = NULL; -
src/libcfa/concurrency/thread
r9bae71f r7453a68 36 36 forall( dtype T | is_thread(T) ) 37 37 static inline coroutine_desc* get_coroutine(T & this) { 38 return &get_thread(this)-> cor;38 return &get_thread(this)->self_cor; 39 39 } 40 40 41 41 forall( dtype T | is_thread(T) ) 42 42 static inline monitor_desc* get_monitor(T & this) { 43 return &get_thread(this)-> mon;43 return &get_thread(this)->self_mon; 44 44 } 45 45 46 46 static inline coroutine_desc* get_coroutine(thread_desc * this) { 47 return &this-> cor;47 return &this->self_cor; 48 48 } 49 49 50 50 static inline monitor_desc* get_monitor(thread_desc * this) { 51 return &this-> mon;51 return &this->self_mon; 52 52 } 53 53 -
src/libcfa/concurrency/thread.c
r9bae71f r7453a68 33 33 34 34 void ?{}(thread_desc& this) { 35 (this.cor){}; 36 this.cor.name = "Anonymous Coroutine"; 37 this.mon.owner = &this; 38 this.mon.recursion = 1; 35 (this.self_cor){}; 36 this.self_cor.name = "Anonymous Coroutine"; 37 this.self_mon.owner = &this; 38 this.self_mon.recursion = 1; 39 this.self_mon_p = &this.self_mon; 39 40 this.next = NULL; 40 41 41 this.current_monitors = &this.mon; 42 this.current_monitor_count = 1; 42 (this.monitors){ &this.self_mon_p, 1, (fptr_t)0 }; 43 43 } 44 44 45 45 void ^?{}(thread_desc& this) { 46 ^(this. cor){};46 ^(this.self_cor){}; 47 47 } 48 48 -
src/prelude/prelude.cf
r9bae71f r7453a68 42 42 _Bool ?--( _Bool & ), ?--( volatile _Bool & ); 43 43 unsigned char ?++( unsigned char & ), ?++( volatile unsigned char & ); 44 signed short ?++( signed short & ), ?++( volatile signed short & ); 45 signed short ?--( signed short & ), ?--( volatile signed short & ); 46 unsigned short ?++( unsigned short & ), ?++( volatile unsigned short & ); 47 unsigned short ?--( unsigned short & ), ?--( volatile unsigned short & ); 44 48 signed int ?++( signed int & ), ?++( volatile signed int & ); 45 49 signed int ?--( signed int & ), ?--( volatile signed int & ); … … 92 96 93 97 _Bool ++?( _Bool & ), --?( _Bool & ); 98 signed short ++?( signed short & ), --?( signed short & ); 94 99 signed int ++?( signed int & ), --?( signed int & ); 95 unsigned int ++?( unsigned int & ), --?( unsigned int & ); 100 unsigned short ++?( unsigned int & ), --?( unsigned int & ); 101 unsigned int ++?( unsigned short & ), --?( unsigned short & ); 96 102 signed long int ++?( signed long int & ), --?( signed long int & ); 97 103 unsigned long int ++?( unsigned long int & ), --?( unsigned long int & ); -
src/tests/sched-ext-parse.c
r9bae71f r7453a68 80 80 16; 81 81 } 82 or waitfor( f 1, a, a ) {82 or waitfor( f2, a, a ) { 83 83 17; 84 84 } -
src/tests/sched-ext.c
r9bae71f r7453a68 45 45 acceptable.monitors = &a; 46 46 47 __ accept_internal( 1, &acceptable );47 __waitfor_internal( 1, &acceptable ); 48 48 49 49 sout | "Accepted" | endl;
Note: See TracChangeset
for help on using the changeset viewer.