Changes in / [f710aca:303406a]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Specialize.cc
rf710aca r303406a 93 93 } 94 94 95 // walk into tuple type and find the number of components96 size_t singleParameterSize( Type * type ) {97 if ( TupleType * tt = dynamic_cast< TupleType * >( type ) ) {98 size_t sz = 0;99 for ( Type * t : *tt ) {100 sz += singleParameterSize( t );101 }102 return sz;103 } else {104 return 1;105 }106 }107 108 // find the total number of components in a parameter list109 size_t functionParameterSize( FunctionType * ftype ) {110 size_t sz = 0;111 for ( DeclarationWithType * p : ftype->get_parameters() ) {112 sz += singleParameterSize( p->get_type() );113 }114 return sz;115 }116 117 95 bool needsTupleSpecialization( Type *formalType, Type *actualType ) { 118 96 // Needs tuple specialization if the structure of the formal type and actual type do not match. … … 125 103 FunctionType * aftype = getFunctionType( actualType ); 126 104 assertf( aftype, "formal type is a function type, but actual type is not." ); 127 // Can't tuple specialize if parameter sizes deeply-differ.128 if ( functionParameterSize( fftype ) != functionParameterSize( aftype ) ) return false;129 // tuple-parameter sizes are the same, but actual parameter sizes differ - must tuple specialize130 105 if ( fftype->get_parameters().size() != aftype->get_parameters().size() ) return true; 131 // total parameter size can be the same, while individual parameters can have different structure132 106 for ( auto params : group_iterate( fftype->get_parameters(), aftype->get_parameters() ) ) { 133 107 DeclarationWithType * formal = std::get<0>(params);
Note: See TracChangeset
for help on using the changeset viewer.