Changes in / [bd098ea:be9288a]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Specialize.cc
rbd098ea rbe9288a 101 101 } 102 102 103 // walk into tuple type and find the number of components104 size_t singleParameterSize( Type * type ) {105 if ( TupleType * tt = dynamic_cast< TupleType * >( type ) ) {106 size_t sz = 0;107 for ( Type * t : *tt ) {108 sz += singleParameterSize( t );109 }110 return sz;111 } else {112 return 1;113 }114 }115 116 // find the total number of components in a parameter list117 size_t functionParameterSize( FunctionType * ftype ) {118 size_t sz = 0;119 for ( DeclarationWithType * p : ftype->get_parameters() ) {120 sz += singleParameterSize( p->get_type() );121 }122 return sz;123 }124 125 103 bool needsTupleSpecialization( Type *formalType, Type *actualType ) { 126 104 // Needs tuple specialization if the structure of the formal type and actual type do not match. … … 133 111 FunctionType * aftype = getFunctionType( actualType ); 134 112 assertf( aftype, "formal type is a function type, but actual type is not." ); 135 // Can't tuple specialize if parameter sizes deeply-differ.136 if ( functionParameterSize( fftype ) != functionParameterSize( aftype ) ) return false;137 // tuple-parameter sizes are the same, but actual parameter sizes differ - must tuple specialize138 113 if ( fftype->get_parameters().size() != aftype->get_parameters().size() ) return true; 139 // total parameter size can be the same, while individual parameters can have different structure140 114 for ( auto params : group_iterate( fftype->get_parameters(), aftype->get_parameters() ) ) { 141 115 DeclarationWithType * formal = std::get<0>(params);
Note: See TracChangeset
for help on using the changeset viewer.