Changes in / [4f57930:87c5f40]


Ignore:
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • doc/generic_types/generic_types.tex

    r4f57930 r87c5f40  
    226226\end{lstlisting}
    227227Within 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 local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types.
     228Hence, programmers can easily form a local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types.
    229229
    230230Finally, \CFA allows variable overloading:
  • src/ResolvExpr/AlternativeFinder.cc

    r4f57930 r87c5f40  
    211211        }
    212212
    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         }
     213        // std::unordered_map< Expression *, UniqueExpr * > ;
    226214
    227215        template< typename StructOrUnionType >
     
    232220                std::list< Declaration* > members;
    233221                aggInst->lookup( name, members );
    234 
    235222                for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) {
    236223                        if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) {
    237224                                alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) );
    238225                                renameTypes( alternatives.back().expr );
    239                                 addAnonConversions( alternatives.back() ); // add anonymous member interpretations whenever an aggregate value type is seen as a member expression.
    240226                        } else {
    241227                                assert( false );
     
    744730                if ( candidates.empty() && ! errors.isEmpty() ) { throw errors; }
    745731
    746                 // compute conversionsion costs
    747732                for ( AltList::iterator withFunc = candidates.begin(); withFunc != candidates.end(); ++withFunc ) {
    748733                        Cost cvtCost = computeConversionCost( *withFunc, indexer );
     
    766751                        } // if
    767752                } // 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 
    773753                candidates.clear();
    774754                candidates.splice( candidates.end(), alternatives );
     
    905885                        )
    906886                        renameTypes( alternatives.back().expr );
    907                         addAnonConversions( alternatives.back() ); // add anonymous member interpretations whenever an aggregate value type is seen as a name expression.
     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
    908894                } // for
    909895        }
  • src/ResolvExpr/AlternativeFinder.h

    r4f57930 r87c5f40  
    7878                void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out );
    7979
    80                 /// Adds alternatives for anonymous members
    81                 void addAnonConversions( const Alternative & alt );
    8280                /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member
    8381                template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member );
  • src/SymTab/Autogen.cc

    r4f57930 r87c5f40  
    498498                makeUnionFieldsAssignment( srcParam, dstParam, back_inserter( funcDecl->get_statements()->get_kids() ) );
    499499                if ( returnVal ) {
    500                         funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
     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 ) ) );
    501502                }
    502503        }
  • src/SynTree/Expression.cc

    r4f57930 r87c5f40  
    339339                        return TypeSubstitution( aggInst->get_baseParameters()->begin(), aggInst->get_baseParameters()->end(), aggInst->get_parameters().begin() );
    340340                } else {
    341                         assertf( false, "makeSub expects struct or union type for aggregate, but got: %s", toString( t ).c_str() );
     341                        assertf( false, "makeSub expects struct or union type for aggregate" );
    342342                }
    343343        }
Note: See TracChangeset for help on using the changeset viewer.