Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • translator/GenPoly/Box.cc

    rb1a6d6b rbdd516a  
    77
    88#include <set>
    9 #include <stack>
    109#include <string>
    1110#include <iterator>
     
    5150            virtual Type *mutate( FunctionType *pointerType );
    5251 
    53             virtual void doBeginScope();
    5452            virtual void doEndScope();
    5553          private:
     
    6866 
    6967            std::map< std::string, DeclarationWithType *> assignOps;
    70             typedef std::map< std::string, FunctionDecl *> AdapterMap;
    71             std::stack< AdapterMap > adapters;
     68            std::map< std::string, FunctionDecl *> adapters;
    7269            DeclarationWithType *retval;
    7370            bool useRetval;
     
    129126
    130127    namespace {
    131         std::string makeAdapterName( const std::string &mangleName ) {
    132             return "_adapter" + mangleName;
    133         }
    134 
    135128        bool isPolyRet( FunctionType *function, std::string &name, const TyVarMap &otherTyVars ) {
    136129            bool doTransform = false;
     
    226219                retval = oldRetval;
    227220                useRetval = oldUseRetval;
    228                 // doEndScope();
     221                doEndScope();
    229222            } // if
    230223            return functionDecl;
     
    323316            Type *concrete = env->lookup( typeName );
    324317            if ( concrete == 0 ) {
    325                 throw SemanticError( "Unbound type variable " + typeName + " in ", appExpr );
     318                throw SemanticError( "Unbound type variable " + typeName + " in", appExpr );
    326319            } // if
    327320            return addRetParam( appExpr, function, concrete, arg );
     
    333326                ret = addRetParam( appExpr, function, function->get_returnVals().front()->get_type(), arg );
    334327            } // if
    335             std::string mangleName = SymTab::Mangler::mangle( function );
    336             std::string adapterName = makeAdapterName( mangleName );
    337 
    338328            appExpr->get_args().push_front( appExpr->get_function() );
    339             appExpr->set_function( new NameExpr( adapterName ) );
     329            appExpr->set_function( new NameExpr( "_adapter" + SymTab::Mangler::mangle( function ) ) );
    340330 
    341331            return ret;
     
    347337            TypeInstType *typeInst = dynamic_cast< TypeInstType *>( param );
    348338            if ( typeInst && exprTyVars.find( typeInst->get_name() ) != exprTyVars.end() ) {
    349                 if ( dynamic_cast< TypeInstType *>( arg->get_results().front() ) ) {
    350                     // if the argument's type is a type parameter, we don't need to box again!
    351                     return;
    352                 } else if ( arg->get_results().front()->get_isLvalue() ) {
    353                     // VariableExpr and MemberExpr are lvalues
     339                if ( arg->get_results().front()->get_isLvalue() ) {
    354340                    arg = new AddressExpr( arg );
    355341                } else {
     
    385371            for ( std::list< DeclarationWithType *>::const_iterator param = function->get_parameters().begin(); param != function->get_parameters().end(); ++param, ++arg ) {
    386372///     std::cout << "parameter is ";
    387 ///     (*param)->print( std::fcout );
     373///     (*param)->print( std::cout );
    388374///     std::cout << std::endl << "argument is ";
    389375///     (*arg)->print( std::cout );
     
    462448        }
    463449
    464 
    465 
    466450        FunctionDecl *Pass1::makeAdapter( FunctionType *adaptee, FunctionType *realType, const std::string &mangleName, const TyVarMap &tyVars ) {
    467451            FunctionType *adapterType = makeAdapterType( adaptee, tyVars );
     
    512496            CompoundStmt *adapterBody = new CompoundStmt( noLabels );
    513497            adapterBody->get_kids().push_back( bodyStmt );
    514             std::string adapterName = makeAdapterName( mangleName );
    515             return new FunctionDecl( adapterName, Declaration::NoStorageClass, LinkageSpec::C, adapterType, adapterBody, false );
     498            return new FunctionDecl( "_adapter" + mangleName, Declaration::NoStorageClass, LinkageSpec::C, adapterType, adapterBody, false );
    516499        }
    517500
     
    532515                assert( env );
    533516                env->apply( realFunction );
    534 
    535517                std::string mangleName = SymTab::Mangler::mangle( realFunction );
    536518                if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) {
    537                     AdapterMap & adapters = Pass1::adapters.top();
    538                     AdapterMap::iterator adapter = adapters.find( mangleName );
    539 
    540                     if ( needsAdapter( realFunction, exprTyVars, true ) ) {
    541                         // the function still contains type variables, which means we are in a polymorphic
    542                         // context and the adapter function is a parameter - call the parameter and don't
    543                         // create a new adapter.
    544                         appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) );
    545                         continue;
    546                     } else if ( adapter == adapters.end() ) {
    547                         FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars );
     519                    std::map< std::string, FunctionDecl *>::iterator adapter = adapters.find( mangleName );
     520                    if ( adapter == adapters.end() ) {
     521                        FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars );
    548522                        adapter = adapters.insert( adapters.begin(), std::pair< std::string, FunctionDecl *>( mangleName, newAdapter ) );
    549523                        stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) );
     
    551525                    assert( adapter != adapters.end() );
    552526                    appExpr->get_args().push_front( new VariableExpr( adapter->second ) );
    553                     // appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) );
    554527                    adaptersDone.insert( adaptersDone.begin(), mangleName );
    555528                } // if
     
    872845        }
    873846
    874         void Pass1::doBeginScope() {
    875             adapters.push(AdapterMap());
    876         }
    877 
    878847        void Pass1::doEndScope() {
    879             adapters.pop();
     848            adapters.clear();
    880849        }
    881850
     
    896865                std::string mangleName = SymTab::Mangler::mangle( *funType );
    897866                if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) {
    898                     std::string adapterName = makeAdapterName( mangleName );
    899                     paramList.push_front( new ObjectDecl( adapterName, Declaration::NoStorageClass, LinkageSpec::C, 0, new PointerType( Type::Qualifiers(), makeAdapterType( *funType, scopeTyVars ) ), 0 ) );
     867                    paramList.push_front( new ObjectDecl( "_adapter" + mangleName, Declaration::NoStorageClass, LinkageSpec::C, 0, new PointerType( Type::Qualifiers(), makeAdapterType( *funType, scopeTyVars ) ), 0 ) );
    900868                    adaptersDone.insert( adaptersDone.begin(), mangleName );
    901869                }
Note: See TracChangeset for help on using the changeset viewer.