Changes in / [5189888:7e23d0a]
- Location:
- src
- Files:
-
- 4 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Unify.cc
r5189888 r7e23d0a 61 61 62 62 template< typename RefType > void handleRefType( RefType *inst, Type *other ); 63 template< typename RefType > void handleGenericRefType( RefType *inst, Type *other ); 63 64 64 65 bool result; … … 496 497 497 498 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 499 501 RefType *otherStruct = dynamic_cast< RefType* >( other ); 500 502 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 } 502 537 503 538 void Unify::visit(StructInstType *structInst) { 504 handle RefType( structInst, type2 );539 handleGenericRefType( structInst, type2 ); 505 540 } 506 541 507 542 void Unify::visit(UnionInstType *unionInst) { 508 handle RefType( unionInst, type2 );543 handleGenericRefType( unionInst, type2 ); 509 544 } 510 545
Note: See TracChangeset
for help on using the changeset viewer.