Changes in src/Concurrency/Keywords.cc [43cedfb1:8edbe40]
- File:
-
- 1 edited
-
src/Concurrency/Keywords.cc (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Concurrency/Keywords.cc
r43cedfb1 r8edbe40 42 42 43 43 namespace Concurrency { 44 inline static std::string getTypeIdName( std::string const & exception_name ) { 45 return exception_name.empty() ? std::string() : Virtual::typeIdType( exception_name ); 46 } 44 47 inline static std::string getVTableName( std::string const & exception_name ) { 45 return exception_name.empty() ? std::string() : Virtual::vtableTypeName( exception_name);48 return exception_name.empty() ? std::string() : Virtual::vtableTypeName( exception_name ); 46 49 } 47 50 … … 75 78 type_name( type_name ), field_name( field_name ), getter_name( getter_name ), 76 79 context_error( context_error ), exception_name( exception_name ), 80 typeid_name( getTypeIdName( exception_name ) ), 77 81 vtable_name( getVTableName( exception_name ) ), 78 82 needs_main( needs_main ), cast_target( cast_target ) {} … … 84 88 85 89 void handle( StructDecl * ); 90 void addTypeId( StructDecl * ); 86 91 void addVtableForward( StructDecl * ); 87 92 FunctionDecl * forwardDeclare( StructDecl * ); … … 99 104 const std::string context_error; 100 105 const std::string exception_name; 106 const std::string typeid_name; 101 107 const std::string vtable_name; 102 108 bool needs_main; … … 106 112 FunctionDecl * dtor_decl = nullptr; 107 113 StructDecl * except_decl = nullptr; 114 StructDecl * typeid_decl = nullptr; 108 115 StructDecl * vtable_decl = nullptr; 109 116 }; … … 393 400 except_decl = decl; 394 401 } 402 else if ( !typeid_decl && typeid_name == decl->name && decl->body ) { 403 typeid_decl = decl; 404 } 395 405 else if ( !vtable_decl && vtable_name == decl->name && decl->body ) { 396 406 vtable_decl = decl; … … 404 414 if ( type_decl && isDestructorFor( decl, type_decl ) ) 405 415 dtor_decl = decl; 406 else if ( vtable_name.empty() ) 407 ; 408 else if( !decl->has_body() ) 416 else if ( vtable_name.empty() || !decl->has_body() ) 409 417 ; 410 418 else if ( auto param = isMainFor( decl, cast_target ) ) { … … 418 426 std::list< Expression * > poly_args = { new TypeExpr( struct_type->clone() ) }; 419 427 ObjectDecl * vtable_object = Virtual::makeVtableInstance( 428 "_default_vtable_object_declaration", 420 429 vtable_decl->makeInst( poly_args ), struct_type, nullptr ); 421 430 declsToAddAfter.push_back( vtable_object ); 431 declsToAddAfter.push_back( 432 new ObjectDecl( 433 Virtual::concurrentDefaultVTableName(), 434 Type::Const, 435 LinkageSpec::Cforall, 436 /* bitfieldWidth */ nullptr, 437 new ReferenceType( Type::Const, vtable_object->type->clone() ), 438 new SingleInit( new VariableExpr( vtable_object ) ) 439 ) 440 ); 422 441 declsToAddAfter.push_back( Virtual::makeGetExceptionFunction( 423 442 vtable_object, except_decl->makeInst( std::move( poly_args ) ) … … 448 467 if( !dtor_decl ) SemanticError( decl, context_error ); 449 468 450 addVtableForward( decl ); 469 if ( !exception_name.empty() ) { 470 if( !typeid_decl ) SemanticError( decl, context_error ); 471 if( !vtable_decl ) SemanticError( decl, context_error ); 472 473 addTypeId( decl ); 474 addVtableForward( decl ); 475 } 451 476 FunctionDecl * func = forwardDeclare( decl ); 452 477 ObjectDecl * field = addField( decl ); … … 454 479 } 455 480 481 void ConcurrentSueKeyword::addTypeId( StructDecl * decl ) { 482 assert( typeid_decl ); 483 StructInstType typeid_type( Type::Const, typeid_decl ); 484 typeid_type.parameters.push_back( new TypeExpr( 485 new StructInstType( noQualifiers, decl ) 486 ) ); 487 declsToAddBefore.push_back( Virtual::makeTypeIdInstance( &typeid_type ) ); 488 } 489 456 490 void ConcurrentSueKeyword::addVtableForward( StructDecl * decl ) { 457 if ( vtable_decl ) { 458 std::list< Expression * > poly_args = { 459 new TypeExpr( new StructInstType( noQualifiers, decl ) ), 460 }; 461 declsToAddBefore.push_back( Virtual::makeGetExceptionForward( 462 vtable_decl->makeInst( poly_args ), 463 except_decl->makeInst( poly_args ) 464 ) ); 465 declsToAddBefore.push_back( Virtual::makeVtableForward( 466 vtable_decl->makeInst( move( poly_args ) ) ) ); 467 // Its only an error if we want a vtable and don't have one. 468 } else if ( ! vtable_name.empty() ) { 469 SemanticError( decl, context_error ); 470 } 491 assert( vtable_decl ); 492 std::list< Expression * > poly_args = { 493 new TypeExpr( new StructInstType( noQualifiers, decl ) ), 494 }; 495 declsToAddBefore.push_back( Virtual::makeGetExceptionForward( 496 vtable_decl->makeInst( poly_args ), 497 except_decl->makeInst( poly_args ) 498 ) ); 499 ObjectDecl * vtable_object = Virtual::makeVtableForward( 500 "_default_vtable_object_declaration", 501 vtable_decl->makeInst( move( poly_args ) ) ); 502 declsToAddBefore.push_back( vtable_object ); 503 declsToAddBefore.push_back( 504 new ObjectDecl( 505 Virtual::concurrentDefaultVTableName(), 506 Type::Const, 507 LinkageSpec::Cforall, 508 /* bitfieldWidth */ nullptr, 509 new ReferenceType( Type::Const, vtable_object->type->clone() ), 510 /* init */ nullptr 511 ) 512 ); 471 513 } 472 514
Note:
See TracChangeset
for help on using the changeset viewer.