Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    rd7dc824 r8ca3a72  
    6262namespace GenPoly {
    6363        namespace {
    64                 const std::list<Label> noLabels;
    65 
    6664                FunctionType *makeAdapterType( FunctionType *adaptee, const TyVarMap &tyVars );
    6765
     
    103101                        void passTypeVars( ApplicationExpr *appExpr, Type *polyRetType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars );
    104102                        /// wraps a function application with a new temporary for the out-parameter return value
    105                         Expression *addRetParam( ApplicationExpr *appExpr, Type *retType, std::list< Expression *>::iterator &arg );
     103                        Expression *addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg );
    106104                        /// Replaces all the type parameters of a generic type with their concrete equivalents under the current environment
    107105                        void replaceParametersWithConcrete( ApplicationExpr *appExpr, std::list< Expression* >& params );
     
    110108                        Type *replaceWithConcrete( ApplicationExpr *appExpr, Type *type, bool doClone = true );
    111109                        /// wraps a function application returning a polymorphic type with a new temporary for the out-parameter return value
    112                         Expression *addDynRetParam( ApplicationExpr *appExpr, Type *polyType, std::list< Expression *>::iterator &arg );
     110                        Expression *addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *polyType, std::list< Expression *>::iterator &arg );
    113111                        Expression *applyAdapter( ApplicationExpr *appExpr, FunctionType *function, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars );
    114112                        void boxParam( Type *formal, Expression *&arg, const TyVarMap &exprTyVars );
     
    136134                  public:
    137135                        template< typename DeclClass >
    138                         DeclClass *handleDecl( DeclClass *decl );
     136                        DeclClass *handleDecl( DeclClass *decl, Type *type );
    139137                        template< typename AggDecl >
    140138                        AggDecl * handleAggDecl( AggDecl * aggDecl );
     
    665663                }
    666664
    667                 Expression *Pass1::addRetParam( ApplicationExpr *appExpr, Type *retType, std::list< Expression *>::iterator &arg ) {
     665                Expression *Pass1::addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg ) {
    668666                        // Create temporary to hold return value of polymorphic function and produce that temporary as a result
    669667                        // using a comma expression.
     
    728726                }
    729727
    730                 Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, Type *dynType, std::list< Expression *>::iterator &arg ) {
     728                Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *dynType, std::list< Expression *>::iterator &arg ) {
    731729                        assert( env );
    732730                        Type *concrete = replaceWithConcrete( appExpr, dynType );
    733731                        // add out-parameter for return value
    734                         return addRetParam( appExpr, concrete, arg );
     732                        return addRetParam( appExpr, function, concrete, arg );
    735733                }
    736734
     
    739737//                      if ( ! function->get_returnVals().empty() && isPolyType( function->get_returnVals().front()->get_type(), tyVars ) ) {
    740738                        if ( isDynRet( function, tyVars ) ) {
    741                                 ret = addRetParam( appExpr, function->get_returnVals().front()->get_type(), arg );
     739                                ret = addRetParam( appExpr, function, function->get_returnVals().front()->get_type(), arg );
    742740                        } // if
    743741                        std::string mangleName = mangleAdapterName( function, tyVars );
     
    11481146                        if ( dynRetType ) {
    11491147                                Type *concRetType = appExpr->get_result()->isVoid() ? nullptr : appExpr->get_result();
    1150                                 ret = addDynRetParam( appExpr, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType
     1148                                ret = addDynRetParam( appExpr, function, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType
    11511149                        } else if ( needsAdapter( function, scopeTyVars ) && ! needsAdapter( function, exprTyVars) ) { // xxx - exprTyVars is used above...?
    11521150                                // xxx - the ! needsAdapter check may be incorrect. It seems there is some situation where an adapter is applied where it shouldn't be, and this fixes it for some cases. More investigation is needed.
     
    12821280
    12831281                template< typename DeclClass >
    1284                 DeclClass * Pass2::handleDecl( DeclClass *decl ) {
     1282                DeclClass * Pass2::handleDecl( DeclClass *decl, Type *type ) {
    12851283                        DeclClass *ret = static_cast< DeclClass *>( Parent::mutate( decl ) );
    12861284
     
    12961294
    12971295                DeclarationWithType * Pass2::mutate( FunctionDecl *functionDecl ) {
    1298                         functionDecl = safe_dynamic_cast< FunctionDecl * > ( handleDecl( functionDecl ) );
     1296                        functionDecl = safe_dynamic_cast< FunctionDecl * > ( handleDecl( functionDecl, functionDecl->get_functionType() ) );
    12991297                        FunctionType * ftype = functionDecl->get_functionType();
    13001298                        if ( ! ftype->get_returnVals().empty() && functionDecl->get_statements() ) {
     
    13211319
    13221320                ObjectDecl * Pass2::mutate( ObjectDecl *objectDecl ) {
    1323                         return handleDecl( objectDecl );
     1321                        return handleDecl( objectDecl, objectDecl->get_type() );
    13241322                }
    13251323
     
    13441342                        addToTyVarMap( typeDecl, scopeTyVars );
    13451343                        if ( typeDecl->get_base() ) {
    1346                                 return handleDecl( typeDecl );
     1344                                return handleDecl( typeDecl, typeDecl->get_base() );
    13471345                        } else {
    13481346                                return Parent::mutate( typeDecl );
     
    13511349
    13521350                TypedefDecl * Pass2::mutate( TypedefDecl *typedefDecl ) {
    1353                         return handleDecl( typedefDecl );
     1351                        return handleDecl( typedefDecl, typedefDecl->get_base() );
    13541352                }
    13551353
Note: See TracChangeset for help on using the changeset viewer.