Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/SpecializeNew.cpp

    r5cf1228 r4c48be0  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // SpecializeNew.cpp -- Generate thunks to specialize polymorphic functions.
     7// SpecializeNew.cpp --
    88//
    99// Author           : Andrew Beach
     
    201201                        *formal, *actual, getInferredParams( expr ) );
    202202        }
     203        //for ( auto pair : group_iterate( formal->params, mut->args ) ) {
     204        //      const ast::ptr<ast::Type> & formal = std::get<0>( pair );
     205        //      ast::ptr<ast::Expr> & actual = std::get<1>( pair );
     206        //      *actual = doSpecialization( (*actual)->location, *formal, *actual, getInferredParams( expr ) );
     207        //}
    203208        return mut;
    204209}
     
    222227}
    223228
    224 // Restructures arguments to match the structure of the formal parameters
    225 // of the actual function. Returns the next structured argument.
     229// Restructures the arguments to match the structure of the formal parameters
     230// of the actual function. [begin, end) are the exploded arguments.
     231template<typename Iterator, typename OutIterator>
     232void structureArg( const CodeLocation & location, const ast::Type * type,
     233                Iterator & begin, Iterator end, OutIterator out ) {
     234        if ( auto tuple = dynamic_cast<const ast::TupleType *>( type ) ) {
     235                std::vector<ast::ptr<ast::Expr>> exprs;
     236                for ( const ast::Type * t : *tuple ) {
     237                        structureArg( location, t, begin, end, std::back_inserter( exprs ) );
     238                }
     239                *out++ = new ast::TupleExpr( location, std::move( exprs ) );
     240        } else {
     241                assertf( begin != end, "reached the end of the arguments while structuring" );
     242                *out++ = *begin++;
     243        }
     244}
     245
     246#if 0
    226247template<typename Iterator>
    227248const ast::Expr * structureArg(
    228249                const CodeLocation& location, const ast::ptr<ast::Type> & type,
    229250                Iterator & begin, const Iterator & end ) {
    230         if ( auto tuple = type.as<ast::TupleType>() ) {
     251        if ( auto tuple = type->as<ast::TupleType>() ) {
    231252                std::vector<ast::ptr<ast::Expr>> exprs;
    232253                for ( const ast::Type * t : *tuple ) {
     
    239260        }
    240261}
     262#endif
    241263
    242264namespace {
     
    269291                // Must replace only occurrences of type variables
    270292                // that occure free in the thunk's type.
     293                //ast::TypeSubstitution::ApplyResult<ast::FunctionType>
     294                //      typeSubs->applyFree( newType );
    271295                auto result = typeSubs->applyFree( newType );
    272296                newType = result.node.release();
     
    276300        using DeclVector = std::vector<ast::ptr<ast::TypeDecl>>;
    277301
     302        //const std::string & thunkName = thunkNamer.newName();
     303        //UniqueName paramNamer(thunkName + "Param");
    278304        UniqueName paramNamer( paramPrefix );
    279305
     306        //auto toParamDecl = [&location, &paramNamer]( const ast::Type * type ) {
     307        //      return new ast::ObjectDecl(
     308        //              location, paramNamer.newName(), ast::deepCopy( type ) );
     309        //};
     310
    280311        // Create new thunk with same signature as formal type.
     312
     313        // std::map<const ast::TypeDecl *, std::pair<int, int>> typeMap;
    281314        ast::Pass<TypeInstFixer> fixer;
    282315        for (const auto & kv : newType->forall) {
    283316                if (fixer.core.typeMap.count(kv->base)) {
    284                         std::cerr << location << ' ' << kv->base->name
    285                                 << ' ' << kv->expr_id << '_' << kv->formal_usage
    286                                 << ',' << fixer.core.typeMap[kv->base].first
    287                                 << '_' << fixer.core.typeMap[kv->base].second << std::endl;
     317                        std::cerr << location << ' ' << kv->base->name << ' ' << kv->expr_id << '_' << kv->formal_usage << ','
     318                        << fixer.core.typeMap[kv->base].first << '_' << fixer.core.typeMap[kv->base].second << std::endl;
    288319                        assertf(false, "multiple formals in specialize");
    289320                }
     
    291322                        fixer.core.typeMap[kv->base] = std::make_pair(kv->expr_id, kv->formal_usage);
    292323                }
    293         }
     324        } 
    294325
    295326        ast::CompoundStmt * thunkBody = new ast::CompoundStmt( location );
     
    314345                );
    315346
     347        // thunkFunc->accept(fixer);
    316348        thunkFunc->fixUniqueId();
     349
     350
    317351
    318352        // Thunks may be generated and not used, avoid them.
     
    341375                // Name each thunk parameter and explode it.
    342376                // These are then threaded back into the actual function call.
     377                //param->name = paramNamer.newName();
    343378                ast::DeclWithType * mutParam = ast::mutate( param.get() );
     379                // - Should be renamed earlier. -
     380                //mutParam->name = paramNamer.newName();
    344381                explodeSimple( location, new ast::VariableExpr( location, mutParam ),
    345382                        std::back_inserter( args ) );
     
    351388                argBegin = args.begin(), argEnd = args.end();
    352389        for ( const auto & actualArg : actualType->params ) {
    353                 app->args.push_back(
    354                         structureArg( location, actualArg.get(), argBegin, argEnd ) );
     390                structureArg( location, actualArg.get(), argBegin, argEnd,
     391                        std::back_inserter( app->args ) );
    355392        }
    356393        assertf( argBegin == argEnd, "Did not structure all arguments." );
     
    432469        // Create thunks for the inferred parameters.
    433470        // This is not needed for intrinsic calls, because they aren't
    434         // actually passed to the function. It needs to handle explicit params
    435         // before inferred params so that explicit params do not recieve a
    436         // changed set of inferParams (and change them again).
    437         // Alternatively, if order starts to matter then copy expr's inferParams
    438         // and pass them to handleExplicitParams.
     471        // actually passed
     472        //
     473        // need to handle explicit params before inferred params so that
     474        // explicit params do not recieve a changed set of inferParams (and
     475        // change them again) alternatively, if order starts to matter then
     476        // copy appExpr's inferParams and pass them to handleExplicitParams.
    439477        ast::ApplicationExpr * mut = handleExplicitParams( expr );
    440478        if ( !mut->inferred.hasParams() ) {
     
    462500        if ( specialized != expr->arg ) {
    463501                // Assume that the specialization incorporates the cast.
    464                 std::cerr << expr <<std::endl;
     502                // std::cerr << expr <<std::endl;
    465503                return specialized;
    466504        } else {
Note: See TracChangeset for help on using the changeset viewer.