Changeset e04b636


Ignore:
Timestamp:
Mar 21, 2017, 12:36:01 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
168c007, cb0e6de
Parents:
31ce3d6
Message:

Implemented and tested coroutine keyword

Location:
src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/Concurrency/Keywords.cc

    r31ce3d6 re04b636  
    150150                        coroutine_decl = decl;
    151151                }
    152                 else if ( false ) {
     152                else if ( decl->is_coroutine() ) {
    153153                        handle( decl );
    154154                }
     
    178178                );
    179179
    180                 decl->get_members().push_front( cor );
     180                decl->get_members().push_back( cor );
    181181
    182182                return cor;
     
    201201                        )
    202202                );
     203                type->get_returnVals().push_back(
     204                        new ObjectDecl(
     205                                "ret",
     206                                noStorage,
     207                                LinkageSpec::Cforall,
     208                                nullptr,
     209                                new PointerType(
     210                                        noQualifiers,
     211                                        new StructInstType(
     212                                                noQualifiers,
     213                                                coroutine_decl
     214                                        )
     215                                ),
     216                                nullptr
     217                        )
     218                );
    203219
    204220                CompoundStmt * statement = new CompoundStmt( noLabels );
     
    206222                        new ReturnStmt(
    207223                                noLabels,
    208                                 new UntypedMemberExpr(
    209                                         new NameExpr( "__cor" ),
    210                                         new NameExpr( "this" )
     224                                new AddressExpr(
     225                                        new UntypedMemberExpr(
     226                                                new NameExpr( "__cor" ),
     227                                                new UntypedExpr(
     228                                                        new NameExpr( "*?" ),
     229                                                        { new NameExpr( "this" ) }
     230                                                )
     231                                        )
    211232                                )
    212233                        )
    213234                );
    214235
    215                 declsToAddAfter.push_back(
    216                         new FunctionDecl(
    217                                 "get_coroutine",
    218                                 Type::Static,
    219                                 LinkageSpec::Cforall,
    220                                 type,
    221                                 statement,
    222                                 noAttributes,
    223                                 Type::Inline
    224                         )
    225                 );
     236                FunctionDecl * get_decl = new FunctionDecl(
     237                        "get_coroutine",
     238                        Type::Static,
     239                        LinkageSpec::Cforall,
     240                        type,
     241                        statement,
     242                        noAttributes,
     243                        Type::Inline
     244                );
     245
     246                declsToAddAfter.push_back( get_decl );
     247
     248                get_decl->fixUniqueId();
    226249        }
    227250       
     
    285308
    286309                //Make sure that typed isn't mutex
    287                 if( ! base->get_mutex() ) throw SemanticError( "mutex keyword may only appear once per argument ", arg );
     310                if( base->get_mutex() ) throw SemanticError( "mutex keyword may only appear once per argument ", arg );
    288311        }
    289312
  • src/Parser/lex.ll

    r31ce3d6 re04b636  
    202202__const__               { KEYWORD_RETURN(CONST); }                              // GCC
    203203continue                { KEYWORD_RETURN(CONTINUE); }
    204 _Coroutine              { KEYWORD_RETURN(COROUTINE); }                  // CFA
     204coroutine               { KEYWORD_RETURN(COROUTINE); }                  // CFA
    205205default                 { KEYWORD_RETURN(DEFAULT); }
    206206disable                 { KEYWORD_RETURN(DISABLE); }                    // CFA
  • src/SynTree/Type.h

    r31ce3d6 re04b636  
    117117                bool operator!=( Qualifiers other ) const { return (val & Mask) != (other.val & Mask); }
    118118                bool operator<=( Qualifiers other ) const {
    119                         return is_const <= other.is_const && is_volatile <= other.is_volatile &&
    120                                 is_mutex >= other.is_mutex && is_atomic == other.is_atomic;
     119                        return is_const    <= other.is_const        //Any non-const converts to const without cost
     120                                        && is_volatile <= other.is_volatile     //Any non-volatile converts to volatile without cost
     121                                        && is_mutex    >= other.is_mutex        //Any mutex converts to non-mutex without cost
     122                                        && is_atomic   == other.is_atomic;      //No conversion from atomic to non atomic is free
    121123                }
    122124                bool operator<( Qualifiers other ) const { return *this != other && *this <= other; }
  • src/tests/coroutine.c

    r31ce3d6 re04b636  
    22#include <coroutine>
    33
    4 struct Fibonacci {
     4coroutine Fibonacci {
    55      int fn; // used for communication
    6       coroutine_desc __cor;
    76};
    87
     
    1110}
    1211
    13 coroutine_desc* get_coroutine(Fibonacci* this) {
    14       return &this->__cor;
    15 }
    16 
    1712void main(Fibonacci* this) {
    18 #ifdef MORE_DEBUG
    19       sout | "Starting main of coroutine " | this | endl;
    20       sout | "Started from " | this->__cor.last | endl;
    21 #endif
    2213      int fn1, fn2;             // retained between resumes
    2314      this->fn = 0;
     
    4536int main() {
    4637      Fibonacci f1, f2;
    47 #ifdef MORE_DEBUG     
    48       Fibonacci *pf1 = &f1, *pf2 = &f2;
    49       coroutine_desc *cf1 = &f1.c, *cf2 = &f2.c;
    50       covptr_t  *vf1 = vtable(pf1), *vf2 = vtable(pf2);
    51       coroutine_desc *cv1 = get_coroutine(vf1), *cv2 = get_coroutine(vf2);
    52       Fibonacci *ov1 = (Fibonacci *)get_object(vf1), *ov2 = (Fibonacci *)get_object(vf2);
    53 
    54       sout | "User coroutines : " | pf1 | ' ' | pf2 | endl;
    55       sout | "Coroutine data  : " | cf1 | ' ' | cf2 | endl;
    56       sout | "Vptr address    : " | vf1 | ' ' | vf2 | endl;
    57       sout | "Vptr obj data   : " | ov1 | ' ' | ov2 | endl;
    58       sout | "Vptr cor data   : " | cv1 | ' ' | cv2 | endl;
    59 #endif
    6038      for ( int i = 1; i <= 10; i += 1 ) {
    6139            sout | next(&f1) | ' ' | next(&f2) | endl;
Note: See TracChangeset for help on using the changeset viewer.