Changes in / [5189888:7e23d0a]


Ignore:
Location:
src
Files:
4 added
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Unify.cc

    r5189888 r7e23d0a  
    6161
    6262                template< typename RefType > void handleRefType( RefType *inst, Type *other );
     63                template< typename RefType > void handleGenericRefType( RefType *inst, Type *other );
    6364
    6465                bool result;
     
    496497
    497498        template< typename RefType >
    498         void Unify::handleRefType( RefType *inst, Type *other ) { 
     499        void Unify::handleRefType( RefType *inst, Type *other ) {
     500                // check that other type is compatible and named the same
    499501                RefType *otherStruct = dynamic_cast< RefType* >( other );
    500502                result = otherStruct && inst->get_name() == otherStruct->get_name();
    501         } 
     503        }
     504
     505        template< typename RefType >
     506        void Unify::handleGenericRefType( RefType *inst, Type *other ) {
     507                // Check that other type is compatible and named the same
     508                handleRefType( inst, other );
     509                if ( ! result ) return;
     510                // Check that parameters of type unify, if any
     511                std::list< Expression* > params = inst->get_parameters();
     512                if ( ! params.empty() ) {
     513                        std::list< TypeDecl* > *baseParams = inst->get_baseParameters();
     514                        if ( ! baseParams ) {
     515                                result = false;
     516                                return;
     517                        }
     518                        std::list< Expression* >::const_iterator it = params.begin();
     519                        std::list< TypeDecl* >::const_iterator baseIt = baseParams->begin();
     520                        while ( it != params.end() && baseIt != baseParams->end()) {
     521                                TypeExpr *param = dynamic_cast< TypeExpr* >(*it);
     522                                assert(param && "Aggregate parameters should be type expressions");
     523                                TypeInstType baseType(Type::Qualifiers(), (*baseIt)->get_name(), *baseIt);
     524                                if ( ! unifyExact( param->get_type(), &baseType, env, needAssertions, haveAssertions, openVars, WidenMode(false, false), indexer ) ) {
     525                                        result = false;
     526                                        return;
     527                                }
     528                               
     529                                ++it;
     530                                ++baseIt;
     531                        }
     532                        if ( it != params.end() || baseIt != baseParams->end() ) {
     533                                result = false;
     534                        }
     535                }
     536        }
    502537
    503538        void Unify::visit(StructInstType *structInst) {
    504                 handleRefType( structInst, type2 );
     539                handleGenericRefType( structInst, type2 );
    505540        }
    506541
    507542        void Unify::visit(UnionInstType *unionInst) {
    508                 handleRefType( unionInst, type2 );
     543                handleGenericRefType( unionInst, type2 );
    509544        }
    510545
Note: See TracChangeset for help on using the changeset viewer.