Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    rc29d9ce r82dd287  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Aug 11 16:22:35 2015
    13 // Update Count     : 89
     12// Last Modified On : Wed Jun 24 16:19:07 2015
     13// Update Count     : 10
    1414//
    1515
     
    7777                        Expression *handleIntrinsics( ApplicationExpr *appExpr );
    7878                        ObjectDecl *makeTemporary( Type *type );
    79 
     79 
     80                        std::map< std::string, DeclarationWithType *> assignOps;
    8081                        typedef std::map< std::string, FunctionDecl *> AdapterMap;
    81                         std::map< std::string, DeclarationWithType *> assignOps;
    8282                        std::stack< AdapterMap > adapters;
    8383                        DeclarationWithType *retval;
     
    168168                        TyVarMap dummyTyVars;
    169169                        return isPolyRet( function, name, dummyTyVars );
    170                 }
    171 
    172                 bool isPolyRet( FunctionType *function, const TyVarMap &otherTyVars ) {
    173                         std::string dummyString;
    174                         return isPolyRet( function, dummyString, otherTyVars );
    175170                }
    176171
     
    531526                }
    532527
    533                 void Pass1::passAdapters( ApplicationExpr * appExpr, FunctionType * functionType, const TyVarMap & exprTyVars ) {
    534                         // collect a list of function types passed as parameters or implicit parameters (assertions)
     528                void Pass1::passAdapters( ApplicationExpr *appExpr, FunctionType *functionType, const TyVarMap &exprTyVars ) {
    535529                        std::list< DeclarationWithType *> &paramList = functionType->get_parameters();
    536530                        std::list< FunctionType *> functions;
     
    543537                                findFunction( (*arg)->get_type(), functions, exprTyVars, needsAdapter );
    544538                        } // for
    545 
    546                         // parameter function types for which an appropriate adapter has been generated.
    547                         // we cannot use the types after applying substitutions, since two different
    548                         // parameter types may be unified to the same type
    549539                        std::set< std::string > adaptersDone;
    550 
    551540                        for ( std::list< FunctionType *>::iterator funType = functions.begin(); funType != functions.end(); ++funType ) {
    552                                 FunctionType *originalFunction = (*funType)->clone();
    553541                                FunctionType *realFunction = (*funType)->clone();
     542                                assert( env );
     543                                env->apply( realFunction );
     544
    554545                                std::string mangleName = SymTab::Mangler::mangle( realFunction );
    555 
    556                                 // only attempt to create an adapter or pass one as a parameter if we haven't
    557                                 // already done so for this pre-substitution parameter function type.
    558546                                if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) {
    559                                         std::string mangleName = SymTab::Mangler::mangle( realFunction );
    560                                         adaptersDone.insert( adaptersDone.begin(), mangleName );
    561                                        
    562                                         // apply substitution to type variables to figure out what the
    563                                         // adapter's type should look like
    564                                         assert( env );
    565                                         env->apply( realFunction );
    566                                         mangleName = SymTab::Mangler::mangle( realFunction );
     547                                        AdapterMap & adapters = Pass1::adapters.top();
     548                                        AdapterMap::iterator adapter = adapters.find( mangleName );
    567549
    568550                                        if ( needsAdapter( realFunction, exprTyVars, true ) ) {
     
    571553                                                // create a new adapter.
    572554                                                appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) );
    573                                         } else {
    574                                                 if ( isPolyRet( originalFunction, exprTyVars ) ) {
    575                                                         // if the return type involved polymorphic types, then
    576                                                         // the adapter will need to take those polymorphic types
    577                                                         // as pointers. Therefore, there can be two different
    578                                                         // functions with the same mangled name, so we need two adapter map
    579                                                         // stacks and also we need the mangled names to be different.
    580                                                         mangleName += "polyret_";
    581                                                 }
    582 
    583                                                 AdapterMap & adapters = Pass1::adapters.top();
    584                                                 AdapterMap::iterator adapter = adapters.find( mangleName );
    585                                                 if ( adapter == adapters.end() ) {
    586                                                         // adapter has not been created yet in the current scope, so define it
    587                                                         FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars );
    588                                                         adapter = adapters.insert( adapters.begin(), std::pair< std::string, FunctionDecl *>( mangleName, newAdapter ) );
    589                                                         stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) );
    590                                                 } // if
    591                                                 assert( adapter != adapters.end() );
    592 
    593                                                 // add the appropriate adapter as a parameter
    594                                                 appExpr->get_args().push_front( new VariableExpr( adapter->second ) );
    595                                         } // if
     555                                                continue;
     556                                        } else if ( adapter == adapters.end() ) {
     557                                                FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars );
     558                                                adapter = adapters.insert( adapters.begin(), std::pair< std::string, FunctionDecl *>( mangleName, newAdapter ) );
     559                                                stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) );
     560                                        } // if
     561                                        assert( adapter != adapters.end() );
     562                                        appExpr->get_args().push_front( new VariableExpr( adapter->second ) );
     563                                        // appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) );
     564                                        adaptersDone.insert( adaptersDone.begin(), mangleName );
    596565                                } // if
    597566                        } // for
     
    911880
    912881                void Pass1::doBeginScope() {
    913                         // actually, maybe this could (should?) push
    914                         // a copy of the current map
    915882                        adapters.push(AdapterMap());
    916883                }
     
    10841051                        if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) {
    10851052                                if ( isPolyVal( objectDecl->get_type(), scopeTyVars ) ) {
    1086                                         // change initialization of a polymorphic value object
    1087                                         // to allocate storage with alloca
    10881053                                        TypeInstType *typeInst = dynamic_cast< TypeInstType *>( objectDecl->get_type() );
    10891054                                        assert( typeInst );
    10901055                                        UntypedExpr *alloc = new UntypedExpr( new NameExpr( "__builtin_alloca" ) );
    10911056                                        alloc->get_args().push_back( new NameExpr( typeInst->get_name() ) );
    1092 
    1093                                         delete objectDecl->get_init();
    1094 
    1095                                         std::list<Expression*> designators;
    1096                                         objectDecl->set_init( new SingleInit( alloc, designators ) );
     1057                                        UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );
     1058                                        assign->get_args().push_back( new VariableExpr( objectDecl ) );
     1059                                        assign->get_args().push_back( alloc );
     1060                                        stmtsToAddAfter.push_back( new ExprStmt( noLabels, assign ) );
    10971061                                }
    10981062                        }
Note: See TracChangeset for help on using the changeset viewer.