Changeset b583113
- Timestamp:
- Apr 21, 2021, 3:44:58 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 578c09a
- Parents:
- 7711064
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/coroutine.cfa
r7711064 rb583113 46 46 47 47 //----------------------------------------------------------------------------- 48 EHM_VIRTUAL_TABLE(SomeCoroutineCancelled, std_coroutine_cancelled);49 50 48 forall(T &) 51 49 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src) { … … 62 60 // This code should not be inlined. It is the error path on resume. 63 61 forall(T & | is_coroutine(T)) 64 void __cfaehm_cancelled_coroutine( T & cor, $coroutine * desc ) { 62 void __cfaehm_cancelled_coroutine( 63 T & cor, $coroutine * desc, _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable ) { 65 64 verify( desc->cancellation ); 66 65 desc->state = Cancelled; … … 68 67 69 68 // TODO: Remove explitate vtable set once trac#186 is fixed. 70 SomeCoroutineCancelledexcept;71 except.virtual_table = & std_coroutine_cancelled;69 CoroutineCancelled(T) except; 70 except.virtual_table = &_default_vtable; 72 71 except.the_coroutine = &cor; 73 72 except.the_exception = except; 74 73 // Why does this need a cast? 75 throwResume ( SomeCoroutineCancelled&)except;74 throwResume (CoroutineCancelled(T) &)except; 76 75 77 76 except->virtual_table->free( except ); … … 146 145 // Part of the Public API 147 146 // Not inline since only ever called once per coroutine 148 forall(T & | is_coroutine(T) )147 forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; }) 149 148 void prime(T& cor) { 150 149 $coroutine* this = get_coroutine(cor); -
libcfa/src/concurrency/coroutine.hfa
r7711064 rb583113 22 22 //----------------------------------------------------------------------------- 23 23 // Exception thrown from resume when a coroutine stack is cancelled. 24 EHM_EXCEPTION(SomeCoroutineCancelled)(25 void * the_coroutine;26 exception_t * the_exception;27 );28 29 EHM_EXTERN_VTABLE(SomeCoroutineCancelled, std_coroutine_cancelled);30 31 24 EHM_FORALL_EXCEPTION(CoroutineCancelled, (coroutine_t &), (coroutine_t)) ( 32 25 coroutine_t * the_coroutine; … … 44 37 // Anything that implements this trait can be resumed. 45 38 // Anything that is resumed is a coroutine. 46 trait is_coroutine(T & | IS_RESUMPTION_EXCEPTION( SomeCoroutineCancelled)) {39 trait is_coroutine(T & | IS_RESUMPTION_EXCEPTION(CoroutineCancelled, (T))) { 47 40 void main(T & this); 48 41 $coroutine * get_coroutine(T & this); … … 67 60 //----------------------------------------------------------------------------- 68 61 // Public coroutine API 69 forall(T & | is_coroutine(T) )62 forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; }) 70 63 void prime(T & cor); 71 64 … … 137 130 138 131 forall(T & | is_coroutine(T)) 139 void __cfaehm_cancelled_coroutine( T & cor, $coroutine * desc ); 132 void __cfaehm_cancelled_coroutine( 133 T & cor, $coroutine * desc, _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable ); 140 134 141 135 // Resume implementation inlined for performance 142 forall(T & | is_coroutine(T) )136 forall(T & | is_coroutine(T) | { _EHM_VTABLE_TYPE(CoroutineCancelled)(T) & const _default_vtable; }) 143 137 static inline T & resume(T & cor) { 144 138 // optimization : read TLS once and reuse it … … 170 164 $ctx_switch( src, dst ); 171 165 if ( unlikely(dst->cancellation) ) { 172 __cfaehm_cancelled_coroutine( cor, dst );166 __cfaehm_cancelled_coroutine( cor, dst, _default_vtable ); 173 167 } 174 168 -
libcfa/src/exception.hfa
r7711064 rb583113 142 142 _EHM_VTABLE_TYPE(exception_name) parameters const &) {} \ 143 143 144 #define _EHM_TRAIT_FUNCTION2(exception_name, forall_clause, parameters) \145 forall_clause _EHM_VTABLE_TYPE(exception_name) parameters const & \146 get_exception_vtable(exception_name parameters const & this)147 148 144 #define __EHM_TRAIT_FUNCTION(exception_name, forall_clause, parameters) \ 149 145 forall_clause inline _EHM_VTABLE_TYPE(exception_name) parameters const & \ -
src/Concurrency/Keywords.cc
r7711064 rb583113 414 414 if ( type_decl && isDestructorFor( decl, type_decl ) ) 415 415 dtor_decl = decl; 416 else if ( vtable_name.empty() ) 417 ; 418 else if( !decl->has_body() ) 416 else if ( vtable_name.empty() || !decl->has_body() ) 419 417 ; 420 418 else if ( auto param = isMainFor( decl, cast_target ) ) { … … 428 426 std::list< Expression * > poly_args = { new TypeExpr( struct_type->clone() ) }; 429 427 ObjectDecl * vtable_object = Virtual::makeVtableInstance( 428 "_default_vtable_object_declaration", 430 429 vtable_decl->makeInst( poly_args ), struct_type, nullptr ); 431 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 ); 432 441 declsToAddAfter.push_back( Virtual::makeGetExceptionFunction( 433 442 vtable_object, except_decl->makeInst( std::move( poly_args ) ) … … 488 497 except_decl->makeInst( poly_args ) 489 498 ) ); 490 declsToAddBefore.push_back( Virtual::makeVtableForward( 491 vtable_decl->makeInst( move( poly_args ) ) ) ); 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 declsToAddAfter.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 ); 492 513 } 493 514 -
src/Virtual/Tables.cc
r7711064 rb583113 10 10 // Created On : Mon Aug 31 11:11:00 2020 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Apr 8 15:51:00 202113 // Update Count : 112 // Last Modified On : Wed Apr 21 15:36:00 2021 13 // Update Count : 2 14 14 // 15 15 … … 50 50 } 51 51 52 std::string concurrentDefaultVTableName() { 53 return "_default_vtable"; 54 } 55 52 56 bool isVTableInstanceName( std::string const & name ) { 53 57 // There are some delicate length calculations here. … … 57 61 58 62 static ObjectDecl * makeVtableDeclaration( 63 std::string const & name, 59 64 StructInstType * type, Initializer * init ) { 60 std::string const & name = instanceName( type->name );61 65 Type::StorageClasses storage = noStorageClasses; 62 66 if ( nullptr == init ) { … … 73 77 } 74 78 75 ObjectDecl * makeVtableForward( StructInstType * type ) {79 ObjectDecl * makeVtableForward( std::string const & name, StructInstType * type ) { 76 80 assert( type ); 77 return makeVtableDeclaration( type, nullptr );81 return makeVtableDeclaration( name, type, nullptr ); 78 82 } 79 83 80 84 ObjectDecl * makeVtableInstance( 81 StructInstType * vtableType, Type * objectType, Initializer * init ) { 85 std::string const & name, StructInstType * vtableType, 86 Type * objectType, Initializer * init ) { 82 87 assert( vtableType ); 83 88 assert( objectType ); … … 115 120 assert(false); 116 121 } 117 return makeVtableDeclaration( vtableType, init );122 return makeVtableDeclaration( name, vtableType, init ); 118 123 } 119 124 … … 167 172 } 168 173 169 ObjectDecl * makeTypeIdForward() {170 return nullptr;171 }172 173 174 Attribute * linkonce( const std::string & subsection ) { 174 175 const std::string section = ".gnu.linkonce." + subsection; -
src/Virtual/Tables.h
r7711064 rb583113 10 10 // Created On : Mon Aug 31 11:07:00 2020 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Apr 8 15:55:00 202113 // Update Count : 112 // Last Modified On : Wed Apr 21 10:30:00 2021 13 // Update Count : 2 14 14 // 15 15 … … 27 27 std::string instanceName( std::string const & vtable_name ); 28 28 std::string vtableInstanceName( std::string const & type_name ); 29 std::string concurrentDefaultVTableName(); 29 30 bool isVTableInstanceName( std::string const & name ); 30 31 31 ObjectDecl * makeVtableForward( StructInstType * vtableType ); 32 ObjectDecl * makeVtableForward( 33 std::string const & name, StructInstType * vtableType ); 32 34 /* Create a forward declaration of a vtable of the given type. 33 35 * vtableType node is consumed. 34 36 */ 35 37 36 ObjectDecl * makeVtableInstance( StructInstType * vtableType, Type * objectType, 38 ObjectDecl * makeVtableInstance( 39 std::string const & name, 40 StructInstType * vtableType, Type * objectType, 37 41 Initializer * init = nullptr ); 38 42 /* Create an initialized definition of a vtable. -
tests/exceptions/cancel/coroutine.cfa
r7711064 rb583113 25 25 resume(cancel); 26 26 printf("4"); 27 } catchResume ( SomeCoroutineCancelled* error) {27 } catchResume (CoroutineCancelled(WillCancel) * error) { 28 28 printf("2"); 29 29 if ((virtual internal_error *)error->the_exception) {
Note: See TracChangeset
for help on using the changeset viewer.