Changes in / [87c5f40:4f57930]
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/generic_types/generic_types.tex
r87c5f40 r4f57930 226 226 \end{lstlisting} 227 227 Within the block, the nested version of @<@ performs @>@ and this local version overrides the built-in @<@ so it is passed to @qsort@. 228 Hence, programmers can easily form alocal environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types.228 Hence, programmers can easily form local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types. 229 229 230 230 Finally, \CFA allows variable overloading: -
src/ResolvExpr/AlternativeFinder.cc
r87c5f40 r4f57930 211 211 } 212 212 213 // std::unordered_map< Expression *, UniqueExpr * > ; 213 void AlternativeFinder::addAnonConversions( const Alternative & alt ) { 214 // adds anonymous member interpretations whenever an aggregate value type is seen. 215 Expression * expr = alt.expr->clone(); 216 std::unique_ptr< Expression > manager( expr ); // RAII for expr 217 alt.env.apply( expr->get_result() ); 218 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( expr->get_result() ) ) { 219 NameExpr nameExpr( "" ); 220 addAggMembers( structInst, expr, alt.cost+Cost( 0, 0, 1 ), alt.env, &nameExpr ); 221 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( expr->get_result() ) ) { 222 NameExpr nameExpr( "" ); 223 addAggMembers( unionInst, expr, alt.cost+Cost( 0, 0, 1 ), alt.env, &nameExpr ); 224 } // if 225 } 214 226 215 227 template< typename StructOrUnionType > … … 220 232 std::list< Declaration* > members; 221 233 aggInst->lookup( name, members ); 234 222 235 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 223 236 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 224 237 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) ); 225 238 renameTypes( alternatives.back().expr ); 239 addAnonConversions( alternatives.back() ); // add anonymous member interpretations whenever an aggregate value type is seen as a member expression. 226 240 } else { 227 241 assert( false ); … … 730 744 if ( candidates.empty() && ! errors.isEmpty() ) { throw errors; } 731 745 746 // compute conversionsion costs 732 747 for ( AltList::iterator withFunc = candidates.begin(); withFunc != candidates.end(); ++withFunc ) { 733 748 Cost cvtCost = computeConversionCost( *withFunc, indexer ); … … 751 766 } // if 752 767 } // for 768 // function may return struct or union value, in which case we need to add alternatives for implicit conversions to each of the anonymous members 769 for ( const Alternative & alt : alternatives ) { 770 addAnonConversions( alt ); 771 } 772 753 773 candidates.clear(); 754 774 candidates.splice( candidates.end(), alternatives ); … … 885 905 ) 886 906 renameTypes( alternatives.back().expr ); 887 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) { 888 NameExpr nameExpr( "" ); 889 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr ); 890 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) { 891 NameExpr nameExpr( "" ); 892 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr ); 893 } // if 907 addAnonConversions( alternatives.back() ); // add anonymous member interpretations whenever an aggregate value type is seen as a name expression. 894 908 } // for 895 909 } -
src/ResolvExpr/AlternativeFinder.h
r87c5f40 r4f57930 78 78 void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out ); 79 79 80 /// Adds alternatives for anonymous members 81 void addAnonConversions( const Alternative & alt ); 80 82 /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member 81 83 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ); -
src/SymTab/Autogen.cc
r87c5f40 r4f57930 498 498 makeUnionFieldsAssignment( srcParam, dstParam, back_inserter( funcDecl->get_statements()->get_kids() ) ); 499 499 if ( returnVal ) { 500 if ( isDynamicLayout ) makeUnionFieldsAssignment( srcParam, returnVal, back_inserter( funcDecl->get_statements()->get_kids() ) ); 501 else funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) ); 500 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) ); 502 501 } 503 502 } -
src/SynTree/Expression.cc
r87c5f40 r4f57930 339 339 return TypeSubstitution( aggInst->get_baseParameters()->begin(), aggInst->get_baseParameters()->end(), aggInst->get_parameters().begin() ); 340 340 } else { 341 assertf( false, "makeSub expects struct or union type for aggregate ");341 assertf( false, "makeSub expects struct or union type for aggregate, but got: %s", toString( t ).c_str() ); 342 342 } 343 343 }
Note: See TracChangeset
for help on using the changeset viewer.