Changes in / [bd098ea:be9288a]


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Specialize.cc

    rbd098ea rbe9288a  
    101101        }
    102102
    103         // walk into tuple type and find the number of components
    104         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 list
    117         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 
    125103        bool needsTupleSpecialization( Type *formalType, Type *actualType ) {
    126104                // Needs tuple specialization if the structure of the formal type and actual type do not match.
     
    133111                        FunctionType * aftype = getFunctionType( actualType );
    134112                        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 specialize
    138113                        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 structure
    140114                        for ( auto params : group_iterate( fftype->get_parameters(), aftype->get_parameters() ) ) {
    141115                                DeclarationWithType * formal = std::get<0>(params);
Note: See TracChangeset for help on using the changeset viewer.