Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    r7e003011 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 );
     
    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.
     
    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 );
     
    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.