Changeset ae4038d for src/GenPoly
- Timestamp:
- Aug 15, 2017, 12:08:53 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 322b97e, bd098ea, f710aca
- Parents:
- 6a36975
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Specialize.cc
r6a36975 rae4038d 93 93 } 94 94 95 // walk into tuple type and find the number of components 96 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 list 109 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 95 117 bool needsTupleSpecialization( Type *formalType, Type *actualType ) { 96 118 // Needs tuple specialization if the structure of the formal type and actual type do not match. … … 103 125 FunctionType * aftype = getFunctionType( actualType ); 104 126 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 specialize 105 130 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 structure 106 132 for ( auto params : group_iterate( fftype->get_parameters(), aftype->get_parameters() ) ) { 107 133 DeclarationWithType * formal = std::get<0>(params);
Note: See TracChangeset
for help on using the changeset viewer.