Changeset 4ee1efb for src/GenPoly/Specialize.cc
- Timestamp:
- Oct 26, 2017, 11:23:26 AM (7 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 136ccd7
- Parents:
- 0b9be4d (diff), 598f50e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - git-author:
- Rob Schluntz <rschlunt@…> (10/26/17 10:43:08)
- git-committer:
- Rob Schluntz <rschlunt@…> (10/26/17 11:23:26)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Specialize.cc
r0b9be4d r4ee1efb 45 45 struct Specialize final : public WithTypeSubstitution, public WithStmtsToAdd, public WithVisitorRef<Specialize> { 46 46 Expression * postmutate( ApplicationExpr *applicationExpr ); 47 Expression * postmutate( AddressExpr *castExpr );48 47 Expression * postmutate( CastExpr *castExpr ); 49 48 50 49 void handleExplicitParams( ApplicationExpr *appExpr ); 51 50 Expression * createThunkFunction( FunctionType *funType, Expression *actual, InferredParams *inferParams ); 52 Expression * doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams = nullptr);51 Expression * doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams ); 53 52 54 53 std::string paramPrefix = "_p"; … … 67 66 if ( ! boundType ) continue; 68 67 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( boundType ) ) { 68 // bound to another type variable 69 69 if ( closedVars.find( typeInst->get_name() ) == closedVars.end() ) { 70 // bound to a closed variable => must specialize 70 71 return true; 71 72 } // if 72 73 } else { 74 // variable is bound to a concrete type => must specialize 73 75 return true; 74 76 } // if 75 77 } // for 78 // none of the type variables are bound 76 79 return false; 77 80 } else { 81 // no env 78 82 return false; 79 83 } // if … … 131 135 if ( functionParameterSize( fftype ) != functionParameterSize( aftype ) ) return false; 132 136 // tuple-parameter sizes are the same, but actual parameter sizes differ - must tuple specialize 133 if ( fftype-> get_parameters().size() != aftype->get_parameters().size() ) return true;137 if ( fftype->parameters.size() != aftype->parameters.size() ) return true; 134 138 // total parameter size can be the same, while individual parameters can have different structure 135 for ( auto params : group_iterate( fftype-> get_parameters(), aftype->get_parameters()) ) {139 for ( auto params : group_iterate( fftype->parameters, aftype->parameters ) ) { 136 140 DeclarationWithType * formal = std::get<0>(params); 137 141 DeclarationWithType * actual = std::get<1>(params); … … 150 154 if ( needsSpecialization( formalType, actual->get_result(), env ) ) { 151 155 if ( FunctionType *funType = getFunctionType( formalType ) ) { 152 ApplicationExpr *appExpr; 153 VariableExpr *varExpr; 154 if ( ( appExpr = dynamic_cast<ApplicationExpr*>( actual ) ) ) { 156 if ( ApplicationExpr * appExpr = dynamic_cast<ApplicationExpr*>( actual ) ) { 155 157 return createThunkFunction( funType, appExpr->get_function(), inferParams ); 156 } else if ( ( varExpr = dynamic_cast<VariableExpr*>( actual )) ) {158 } else if ( VariableExpr * varExpr = dynamic_cast<VariableExpr*>( actual ) ) { 157 159 return createThunkFunction( funType, varExpr, inferParams ); 158 160 } else { … … 323 325 } 324 326 325 Expression * Specialize::postmutate( AddressExpr *addrExpr ) {326 assert( addrExpr->result );327 addrExpr->set_arg( doSpecialization( addrExpr->result, addrExpr->arg ) );328 return addrExpr;329 }330 331 327 Expression * Specialize::postmutate( CastExpr *castExpr ) { 332 328 if ( castExpr->result->isVoid() ) { … … 334 330 return castExpr; 335 331 } 336 Expression *specialized = doSpecialization( castExpr->result, castExpr->arg );332 Expression *specialized = doSpecialization( castExpr->result, castExpr->arg, &castExpr->inferParams ); 337 333 if ( specialized != castExpr->arg ) { 338 334 // assume here that the specialization incorporates the cast
Note: See TracChangeset
for help on using the changeset viewer.