Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Concurrency/Keywords.cc

    r43cedfb1 r8edbe40  
    4242
    4343namespace Concurrency {
     44        inline static std::string getTypeIdName( std::string const & exception_name ) {
     45                return exception_name.empty() ? std::string() : Virtual::typeIdType( exception_name );
     46        }
    4447        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 );
    4649        }
    4750
     
    7578                  type_name( type_name ), field_name( field_name ), getter_name( getter_name ),
    7679                  context_error( context_error ), exception_name( exception_name ),
     80                  typeid_name( getTypeIdName( exception_name ) ),
    7781                  vtable_name( getVTableName( exception_name ) ),
    7882                  needs_main( needs_main ), cast_target( cast_target ) {}
     
    8488
    8589                void handle( StructDecl * );
     90                void addTypeId( StructDecl * );
    8691                void addVtableForward( StructDecl * );
    8792                FunctionDecl * forwardDeclare( StructDecl * );
     
    99104                const std::string context_error;
    100105                const std::string exception_name;
     106                const std::string typeid_name;
    101107                const std::string vtable_name;
    102108                bool needs_main;
     
    106112                FunctionDecl * dtor_decl = nullptr;
    107113                StructDecl * except_decl = nullptr;
     114                StructDecl * typeid_decl = nullptr;
    108115                StructDecl * vtable_decl = nullptr;
    109116        };
     
    393400                        except_decl = decl;
    394401                }
     402                else if ( !typeid_decl && typeid_name == decl->name && decl->body ) {
     403                        typeid_decl = decl;
     404                }
    395405                else if ( !vtable_decl && vtable_name == decl->name && decl->body ) {
    396406                        vtable_decl = decl;
     
    404414                if ( type_decl && isDestructorFor( decl, type_decl ) )
    405415                        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() )
    409417                        ;
    410418                else if ( auto param = isMainFor( decl, cast_target ) ) {
     
    418426                        std::list< Expression * > poly_args = { new TypeExpr( struct_type->clone() ) };
    419427                        ObjectDecl * vtable_object = Virtual::makeVtableInstance(
     428                                "_default_vtable_object_declaration",
    420429                                vtable_decl->makeInst( poly_args ), struct_type, nullptr );
    421430                        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                        );
    422441                        declsToAddAfter.push_back( Virtual::makeGetExceptionFunction(
    423442                                vtable_object, except_decl->makeInst( std::move( poly_args ) )
     
    448467                if( !dtor_decl ) SemanticError( decl, context_error );
    449468
    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                }
    451476                FunctionDecl * func = forwardDeclare( decl );
    452477                ObjectDecl * field = addField( decl );
     
    454479        }
    455480
     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
    456490        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                );
    471513        }
    472514
Note: See TracChangeset for help on using the changeset viewer.