Changes in / [713905fd:e6e1a12]
- Files:
-
- 4 deleted
- 10 edited
-
libcfa/src/concurrency/coroutine.cfa (modified) (2 diffs)
-
libcfa/src/concurrency/coroutine.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/invoke.h (modified) (2 diffs)
-
src/AST/Decl.hpp (modified) (1 diff)
-
src/AST/SymbolTable.cpp (modified) (2 diffs)
-
src/GenPoly/SpecializeNew.cpp (modified) (2 diffs)
-
src/InitTweak/FixInitNew.cpp (modified) (2 diffs)
-
src/ResolvExpr/CommonType.cc (modified) (3 diffs)
-
src/ResolvExpr/Unify.cc (modified) (2 diffs)
-
src/Validate/LinkReferenceToTypes.cpp (modified) (1 diff)
-
tests/exceptions/.expect/fibonacci_nonlocal.txt (deleted)
-
tests/exceptions/.expect/pingpong_nonlocal.txt (deleted)
-
tests/exceptions/fibonacci_nonlocal.cfa (deleted)
-
tests/exceptions/pingpong_nonlocal.cfa (deleted)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/coroutine.cfa
r713905fd re6e1a12 121 121 last = 0p; 122 122 cancellation = 0p; 123 ehm_state.ehm_buffer{};124 ehm_state.buffer_lock{};125 ehm_state.ehm_enabled = false;126 123 } 127 124 … … 286 283 } 287 284 288 289 ////////////////////////////////////////////////////////////////////////////////////////////////////290 // non local ehm routines291 292 // helper for popping from coroutine's ehm buffer293 inline nonlocal_exception * pop_ehm_head( coroutine$ * this ) {294 lock( this->ehm_state.buffer_lock __cfaabi_dbg_ctx2 );295 nonlocal_exception * nl_ex = pop_head( this->ehm_state.ehm_buffer );296 unlock( this->ehm_state.buffer_lock );297 return nl_ex;298 }299 300 // user facing ehm operations301 forall(T & | is_coroutine(T)) {302 // enable/disable non-local exceptions303 void enable_ehm( T & cor ) libcfa_public { get_coroutine( cor )->ehm_state.ehm_enabled = true; }304 void disable_ehm( T & cor ) libcfa_public { get_coroutine( cor )->ehm_state.ehm_enabled = false; }305 306 // poll for non-local exceptions307 bool poll( T & cor ) libcfa_public {308 coroutine$ * base_cor = get_coroutine( cor );309 nonlocal_exception * nl_ex = pop_ehm_head( base_cor );310 311 // if no exceptions return false312 if ( nl_ex == 0p ) return false;313 314 // otherwise loop and throwResume all pending exceptions315 while ( nl_ex != 0p ){316 exception_t * ex = nl_ex->the_exception;317 free( nl_ex );318 throwResume *ex;319 nl_ex = pop_ehm_head( base_cor );320 }321 322 return true;323 }324 325 // poll iff nonlocal ehm is enabled326 bool checked_poll( T & cor ) libcfa_public { return get_coroutine( cor )->ehm_state.ehm_enabled ? poll( cor ) : false; }327 }328 329 // resume non local exception at receiver (i.e. enqueue in ehm buffer)330 forall(exceptT &, T & | ehm_resume_at( exceptT, T ))331 void resumeAt( T & receiver, exceptT & ex ) libcfa_public {332 coroutine$ * cor = get_coroutine( receiver );333 nonlocal_exception * nl_ex = alloc();334 (*nl_ex){ (exception_t *)&ex };335 lock( cor->ehm_state.buffer_lock __cfaabi_dbg_ctx2 );336 append( cor->ehm_state.ehm_buffer, nl_ex );337 unlock( cor->ehm_state.buffer_lock );338 }339 340 285 // Local Variables: // 341 286 // mode: c // -
libcfa/src/concurrency/coroutine.hfa
r713905fd re6e1a12 19 19 #include "invoke.h" 20 20 #include "../exception.hfa" 21 22 //-----------------------------------------------------------------------------23 // Type used to store and queue nonlocal exceptions on coroutines24 struct nonlocal_exception {25 exception_t * the_exception;26 nonlocal_exception * next;27 };28 static inline void ?{} ( nonlocal_exception & this, exception_t * ex ) with(this) {29 the_exception = ex;30 next = 0p;31 }32 33 static inline nonlocal_exception *& get_next( nonlocal_exception & this ) __attribute__((const)) {34 return this.next;35 }36 21 37 22 //----------------------------------------------------------------------------- … … 218 203 } 219 204 220 // non local ehm routines221 forall(T & | is_coroutine(T)) {222 void enable_ehm( T & cor );223 void disable_ehm( T & cor );224 bool poll( T & cor );225 bool checked_poll( T & cor );226 }227 228 // trait for exceptions able to be resumed at another coroutine229 forall(exceptT &, T & | is_coroutine(T))230 trait ehm_resume_at { void $throwResume(exceptT &); };231 232 forall(exceptT &, T & | ehm_resume_at( exceptT, T ))233 void resumeAt( T & receiver, exceptT & ex );234 235 205 // Local Variables: // 236 206 // mode: c // -
libcfa/src/concurrency/invoke.h
r713905fd re6e1a12 74 74 }; 75 75 76 struct nonlocal_ehm {77 // list of pending nonlocal exceptions78 __queue_t(struct nonlocal_exception) ehm_buffer;79 80 // lock to protect the buffer81 struct __spinlock_t buffer_lock;82 83 // enable/disabled flag84 bool ehm_enabled;85 };86 87 76 enum __Coroutine_State { Halted, Start, Primed, Blocked, Ready, Active, Cancelled, Halting }; 88 77 … … 109 98 struct _Unwind_Exception * cancellation; 110 99 111 // Non-local exception handling information112 struct nonlocal_ehm ehm_state;113 100 }; 114 101 // Wrapper for gdb -
src/AST/Decl.hpp
r713905fd re6e1a12 69 69 public: 70 70 /// Represents the type with all types and typedefs expanded. 71 /// This field is generated by SymTab::Validate::Pass2 71 72 std::string mangleName; 72 73 /// Stores the scope level at which the variable was declared. -
src/AST/SymbolTable.cpp
r713905fd re6e1a12 19 19 20 20 #include "Copy.hpp" 21 #include <iostream> 22 #include <algorithm> 23 21 24 #include "Decl.hpp" 22 25 #include "Expr.hpp" … … 203 206 out.push_back(decl.second); 204 207 } 208 209 // std::cerr << otypeKey << ' ' << out.size() << std::endl; 205 210 } 206 211 -
src/GenPoly/SpecializeNew.cpp
r713905fd re6e1a12 104 104 105 105 bool needsPolySpecialization( 106 const ast::Type * /*formalType*/,106 const ast::Type * formalType, 107 107 const ast::Type * actualType, 108 108 const ast::TypeSubstitution * subs ) { … … 126 126 if ( closedVars.find( *inst ) == closedVars.end() ) { 127 127 return true; 128 } else { 128 } 129 else { 129 130 assertf(false, "closed: %s", inst->name.c_str()); 130 131 } -
src/InitTweak/FixInitNew.cpp
r713905fd re6e1a12 22 22 #include "AST/SymbolTable.hpp" 23 23 #include "AST/Type.hpp" 24 #include "CodeGen/OperatorTable.h" // for isConstructor, isCtorDtor, isD... 24 #include "CodeGen/GenType.h" // for genPrettyType 25 #include "CodeGen/OperatorTable.h" 26 #include "Common/PassVisitor.h" // for PassVisitor, WithStmtsToAdd 25 27 #include "Common/SemanticError.h" // for SemanticError 26 28 #include "Common/ToString.hpp" // for toCString … … 31 33 #include "ResolvExpr/Resolver.h" // for findVoidExpression 32 34 #include "ResolvExpr/Unify.h" // for typesCompatible 35 #include "SymTab/Autogen.h" // for genImplicitCall 33 36 #include "SymTab/GenImplicitCall.hpp" // for genImplicitCall 37 #include "SymTab/Indexer.h" // for Indexer 38 #include "SymTab/Mangler.h" // for Mangler 39 #include "SynTree/LinkageSpec.h" // for C, Spec, Cforall, isBuiltin 40 #include "SynTree/Attribute.h" // for Attribute 41 #include "SynTree/Constant.h" // for Constant 42 #include "SynTree/Declaration.h" // for ObjectDecl, FunctionDecl, Decl... 43 #include "SynTree/Expression.h" // for UniqueExpr, VariableExpr, Unty... 44 #include "SynTree/Initializer.h" // for ConstructorInit, SingleInit 45 #include "SynTree/Label.h" // for Label, operator< 46 #include "SynTree/Mutator.h" // for mutateAll, Mutator, maybeMutate 47 #include "SynTree/Statement.h" // for ExprStmt, CompoundStmt, Branch... 48 #include "SynTree/Type.h" // for Type, Type::StorageClasses 49 #include "SynTree/TypeSubstitution.h" // for TypeSubstitution, operator<< 50 #include "SynTree/DeclReplacer.h" // for DeclReplacer 51 #include "SynTree/Visitor.h" // for acceptAll, maybeAccept 52 #include "Validate/FindSpecialDecls.h" // for dtorStmt, dtorStructDestroy 34 53 35 54 extern bool ctordtorp; // print all debug -
src/ResolvExpr/CommonType.cc
r713905fd re6e1a12 696 696 void postvisit( const ast::BasicType * basic ) { 697 697 if ( auto basic2 = dynamic_cast< const ast::BasicType * >( type2 ) ) { 698 #warning remove casts when `commonTypes` moved to new AST 699 700 /* 701 ast::BasicType::Kind kind = (ast::BasicType::Kind)(int)commonTypes[ (BasicType::Kind)(int)basic->kind ][ (BasicType::Kind)(int)basic2->kind ]; 702 if ( 703 ( ( kind == basic->kind && basic->qualifiers >= basic2->qualifiers ) 704 || widen.first ) 705 && ( ( kind == basic2->kind && basic->qualifiers <= basic2->qualifiers ) 706 || widen.second ) 707 ) { 708 result = new ast::BasicType{ kind, basic->qualifiers | basic2->qualifiers }; 709 } 710 */ 698 711 ast::BasicType::Kind kind; 699 712 if (basic->kind != basic2->kind && !widen.first && !widen.second) return; … … 706 719 result = new ast::BasicType{ kind, basic->qualifiers | basic2->qualifiers }; 707 720 } 721 708 722 } else if ( 709 723 dynamic_cast< const ast::ZeroType * >( type2 ) 710 724 || dynamic_cast< const ast::OneType * >( type2 ) 711 725 ) { 726 #warning remove casts when `commonTypes` moved to new AST 727 ast::BasicType::Kind kind = (ast::BasicType::Kind)(int)commonTypes[ (BasicType::Kind)(int)basic->kind ][ (BasicType::Kind)(int)ast::BasicType::SignedInt ]; 728 /* 729 if ( // xxx - what does qualifier even do here?? 730 ( ( basic->qualifiers >= type2->qualifiers ) 731 || widen.first ) 732 && ( ( /* kind != basic->kind && basic->qualifiers <= type2->qualifiers ) 733 || widen.second ) 734 ) 735 */ 712 736 if (widen.second) { 713 737 result = new ast::BasicType{ basic->kind, basic->qualifiers | type2->qualifiers }; 714 738 } 715 739 } else if ( const ast::EnumInstType * enumInst = dynamic_cast< const ast::EnumInstType * >( type2 ) ) { 740 #warning remove casts when `commonTypes` moved to new AST 716 741 const ast::EnumDecl* enumDecl = enumInst->base; 717 742 if ( enumDecl->base ) { 718 743 result = enumDecl->base.get(); 719 744 } else { 720 #warning remove casts when `commonTypes` moved to new AST721 745 ast::BasicType::Kind kind = (ast::BasicType::Kind)(int)commonTypes[ (BasicType::Kind)(int)basic->kind ][ (BasicType::Kind)(int)ast::BasicType::SignedInt ]; 722 746 if ( … … 739 763 auto entry = open.find( *var ); 740 764 if ( entry != open.end() ) { 765 // if (tenv.lookup(*var)) { 741 766 ast::AssertionSet need, have; 742 767 if ( ! tenv.bindVar( -
src/ResolvExpr/Unify.cc
r713905fd re6e1a12 1298 1298 auto var1 = dynamic_cast< const ast::TypeInstType * >( type1 ); 1299 1299 auto var2 = dynamic_cast< const ast::TypeInstType * >( type2 ); 1300 ast::OpenVarSet::const_iterator 1301 entry1 = var1 ? open.find( *var1 ) : open.end(), 1302 entry2 = var2 ? open.find( *var2 ) : open.end(); 1303 // bool isopen1 = entry1 != open.end(); 1304 // bool isopen2 = entry2 != open.end(); 1300 1305 bool isopen1 = var1 && env.lookup(*var1); 1301 1306 bool isopen2 = var2 && env.lookup(*var2); 1302 1307 1308 /* 1309 if ( isopen1 && isopen2 ) { 1310 if ( entry1->second.kind != entry2->second.kind ) return false; 1311 return env.bindVarToVar( 1312 var1, var2, ast::TypeData{ entry1->second, entry2->second }, need, have, 1313 open, widen ); 1314 } else if ( isopen1 ) { 1315 return env.bindVar( var1, type2, entry1->second, need, have, open, widen ); 1316 } else if ( isopen2 ) { 1317 return env.bindVar( var2, type1, entry2->second, need, have, open, widen, symtab ); 1318 } */ 1303 1319 if ( isopen1 && isopen2 ) { 1304 1320 if ( var1->base->kind != var2->base->kind ) return false; … … 1310 1326 } else if ( isopen2 ) { 1311 1327 return env.bindVar( var2, type1, ast::TypeData{var2->base}, need, have, open, widen ); 1312 } else {1328 }else { 1313 1329 return ast::Pass<Unify_new>::read( 1314 1330 type1, type2, env, need, have, open, widen ); 1315 1331 } 1332 1316 1333 } 1317 1334 -
src/Validate/LinkReferenceToTypes.cpp
r713905fd re6e1a12 80 80 ast::EnumInstType const * LinkTypesCore::postvisit( ast::EnumInstType const * type ) { 81 81 ast::EnumDecl const * decl = symtab.lookupEnum( type->name ); 82 ast::EnumInstType * mut = ast::mutate( type );83 82 // It's not a semantic error if the enum is not found, just an implicit forward declaration. 84 83 if ( decl ) { 85 84 // Just linking in the node. 85 auto mut = ast::mutate( type ); 86 86 mut->base = decl; 87 type = mut; 87 88 } 88 89 if ( !decl || !decl->body ) { 90 auto mut = ast::mutate( type ); 89 91 forwardEnums[ mut->name ].push_back( mut ); 90 } 91 return mut; 92 type = mut; 93 } 94 return type; 92 95 } 93 96 94 97 ast::StructInstType const * LinkTypesCore::postvisit( ast::StructInstType const * type ) { 95 98 ast::StructDecl const * decl = symtab.lookupStruct( type->name ); 96 ast::StructInstType * mut = ast::mutate( type );97 99 // It's not a semantic error if the struct is not found, just an implicit forward declaration. 98 100 if ( decl ) { 99 101 // Just linking in the node. 102 auto mut = ast::mutate( type ); 100 103 mut->base = decl; 104 type = mut; 101 105 } 102 106 if ( !decl || !decl->body ) { 107 auto mut = ast::mutate( type ); 103 108 forwardStructs[ mut->name ].push_back( mut ); 104 } 105 return mut; 109 type = mut; 110 } 111 return type; 106 112 } 107 113 108 114 ast::UnionInstType const * LinkTypesCore::postvisit( ast::UnionInstType const * type ) { 109 115 ast::UnionDecl const * decl = symtab.lookupUnion( type->name ); 110 ast::UnionInstType * mut = ast::mutate( type );111 116 // It's not a semantic error if the union is not found, just an implicit forward declaration. 112 117 if ( decl ) { 113 118 // Just linking in the node. 119 auto mut = ast::mutate( type ); 114 120 mut->base = decl; 121 type = mut; 115 122 } 116 123 if ( !decl || !decl->body ) { 124 auto mut = ast::mutate( type ); 117 125 forwardUnions[ mut->name ].push_back( mut ); 118 } 119 return mut; 126 type = mut; 127 } 128 return type; 120 129 } 121 130
Note:
See TracChangeset
for help on using the changeset viewer.