Changes in / [c2bfb31:1c2c253]


Ignore:
Files:
40 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    rc2bfb31 r1c2c253  
    12981298                        FunctionType * ftype = functionDecl->get_functionType();
    12991299                        if ( ! ftype->get_returnVals().empty() && functionDecl->get_statements() ) {
    1300                                 if ( functionDecl->get_name() != "?=?" && ! isPrefix( functionDecl->get_name(), "_thunk" ) && ! isPrefix( functionDecl->get_name(), "_adapter" ) ) { // xxx - remove check for ?=? once reference types are in; remove check for prefix once thunks properly use ctor/dtors
     1300                                if ( functionDecl->get_name() != "?=?" && ! isPrefix( functionDecl->get_name(), "_thunk" ) ) { // xxx - remove check for ?=? once reference types are in; remove check for prefix once thunks properly use ctor/dtors
    13011301                                        assert( ftype->get_returnVals().size() == 1 );
    13021302                                        DeclarationWithType * retval = ftype->get_returnVals().front();
  • src/GenPoly/Specialize.cc

    rc2bfb31 r1c2c253  
    168168        }
    169169
    170         struct EnvTrimmer : public Visitor {
    171                 TypeSubstitution * env, * newEnv;
    172                 EnvTrimmer( TypeSubstitution * env, TypeSubstitution * newEnv ) : env( env ), newEnv( newEnv ){}
    173                 virtual void visit( TypeDecl * tyDecl ) {
    174                         // transfer known bindings for seen type variables
    175                         if ( Type * t = env->lookup( tyDecl->get_name() ) ) {
    176                                 newEnv->add( tyDecl->get_name(), t );
    177                         }
    178                 }
    179         };
    180 
    181         /// reduce environment to just the parts that are referenced in a given expression
    182         TypeSubstitution * trimEnv( ApplicationExpr * expr, TypeSubstitution * env ) {
    183                 if ( env ) {
    184                         TypeSubstitution * newEnv = new TypeSubstitution();
    185                         EnvTrimmer trimmer( env, newEnv );
    186                         expr->accept( trimmer );
    187                         return newEnv;
    188                 }
    189                 return nullptr;
    190         }
    191 
    192170        /// Generates a thunk that calls `actual` with type `funType` and returns its address
    193171        Expression * Specialize::createThunkFunction( FunctionType *funType, Expression *actual, InferredParams *inferParams ) {
     
    233211                }
    234212
    235                 appExpr->set_env( trimEnv( appExpr, env ) );
     213                appExpr->set_env( maybeClone( env ) );
    236214                if ( inferParams ) {
    237215                        appExpr->get_inferParams() = *inferParams;
  • src/InitTweak/FixInit.cc

    rc2bfb31 r1c2c253  
    5252        namespace {
    5353                typedef std::unordered_map< Expression *, TypeSubstitution * > EnvMap;
    54                 typedef std::unordered_map< int, int > UnqCount;
    5554
    5655                class InsertImplicitCalls final : public GenPoly::PolyMutator {
     
    7574                        /// generate/resolve copy construction expressions for each, and generate/resolve destructors for both
    7675                        /// arguments and return value temporaries
    77                         static void resolveImplicitCalls( std::list< Declaration * > & translationUnit, const EnvMap & envMap, UnqCount & unqCount );
     76                        static void resolveImplicitCalls( std::list< Declaration * > & translationUnit, const EnvMap & envMap );
    7877
    7978                        typedef SymTab::Indexer Parent;
    8079                        using Parent::visit;
    8180
    82                         ResolveCopyCtors( const EnvMap & envMap, UnqCount & unqCount ) : envMap( envMap ), unqCount( unqCount ) {}
     81                        ResolveCopyCtors( const EnvMap & envMap ) : envMap( envMap ) {}
    8382
    8483                        virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override;
     
    9594                        TypeSubstitution * env;
    9695                        const EnvMap & envMap;
    97                         UnqCount & unqCount; // count the number of times each unique expr ID appears
    9896                };
    9997
     
    204202                class FixCopyCtors final : public GenPoly::PolyMutator {
    205203                  public:
    206                         FixCopyCtors( UnqCount & unqCount ) : unqCount( unqCount ){}
    207204                        /// expand ImplicitCopyCtorExpr nodes into the temporary declarations, copy constructors, call expression,
    208205                        /// and destructors
    209                         static void fixCopyCtors( std::list< Declaration * > &translationUnit, UnqCount & unqCount );
     206                        static void fixCopyCtors( std::list< Declaration * > &translationUnit );
    210207
    211208                        typedef GenPoly::PolyMutator Parent;
     
    214211                        virtual Expression * mutate( UniqueExpr * unqExpr ) override;
    215212                        virtual Expression * mutate( StmtExpr * stmtExpr ) override;
    216 
    217                         UnqCount & unqCount;
    218213                };
    219214
     
    277272
    278273                EnvMap envMap;
    279                 UnqCount unqCount;
    280274
    281275                InsertImplicitCalls::insert( translationUnit, envMap );
    282                 ResolveCopyCtors::resolveImplicitCalls( translationUnit, envMap, unqCount );
     276                ResolveCopyCtors::resolveImplicitCalls( translationUnit, envMap );
    283277                InsertDtors::insert( translationUnit );
    284278                FixInit::fixInitializers( translationUnit );
    285279
    286280                // FixCopyCtors must happen after FixInit, so that destructors are placed correctly
    287                 FixCopyCtors::fixCopyCtors( translationUnit, unqCount );
     281                FixCopyCtors::fixCopyCtors( translationUnit );
    288282
    289283                GenStructMemberCalls::generate( translationUnit );
     
    304298                }
    305299
    306                 void ResolveCopyCtors::resolveImplicitCalls( std::list< Declaration * > & translationUnit, const EnvMap & envMap, UnqCount & unqCount ) {
    307                         ResolveCopyCtors resolver( envMap, unqCount );
     300                void ResolveCopyCtors::resolveImplicitCalls( std::list< Declaration * > & translationUnit, const EnvMap & envMap ) {
     301                        ResolveCopyCtors resolver( envMap );
    308302                        acceptAll( translationUnit, resolver );
    309303                }
     
    335329                }
    336330
    337                 void FixCopyCtors::fixCopyCtors( std::list< Declaration * > & translationUnit, UnqCount & unqCount ) {
    338                         FixCopyCtors fixer( unqCount );
     331                void FixCopyCtors::fixCopyCtors( std::list< Declaration * > & translationUnit ) {
     332                        FixCopyCtors fixer;
    339333                        mutateAll( translationUnit, fixer );
    340334                }
     
    526520                void ResolveCopyCtors::visit( UniqueExpr * unqExpr ) {
    527521                        static std::unordered_set< int > vars;
    528                         unqCount[ unqExpr->get_id() ]++;  // count the number of unique expressions for each ID
    529522                        if ( vars.count( unqExpr->get_id() ) ) {
    530523                                // xxx - hack to prevent double-handling of unique exprs, otherwise too many temporary variables and destructors are generated
     
    643636
    644637                Expression * FixCopyCtors::mutate( UniqueExpr * unqExpr ) {
    645                         unqCount[ unqExpr->get_id() ]--;
    646                         static std::unordered_map< int, std::list< Statement * > > dtors;
    647638                        static std::unordered_map< int, UniqueExpr * > unqMap;
    648639                        static std::unordered_set< int > addDeref;
     
    654645                                delete unqExpr->get_result();
    655646                                unqExpr->set_result( maybeClone( unqExpr->get_expr()->get_result() ) );
    656                                 if ( unqCount[ unqExpr->get_id() ] == 0 ) {  // insert destructor after the last use of the unique expression
    657                                         stmtsToAdd.splice( stmtsToAddAfter.end(), dtors[ unqExpr->get_id() ] );
    658                                 }
    659647                                if ( addDeref.count( unqExpr->get_id() ) ) {
    660648                                        // other UniqueExpr was dereferenced because it was an lvalue return, so this one should be too
     
    663651                                return unqExpr;
    664652                        }
    665                         FixCopyCtors fixer( unqCount );
    666                         unqExpr->set_expr( unqExpr->get_expr()->acceptMutator( fixer ) ); // stmtexprs contained should not be separately fixed, so this must occur after the lookup
    667                         stmtsToAdd.splice( stmtsToAdd.end(), fixer.stmtsToAdd );
     653                        unqExpr = safe_dynamic_cast< UniqueExpr * >( Parent::mutate( unqExpr ) ); // stmtexprs contained should not be separately fixed, so this must occur after the lookup
    668654                        unqMap[unqExpr->get_id()] = unqExpr;
    669655                        if ( UntypedExpr * deref = dynamic_cast< UntypedExpr * >( unqExpr->get_expr() ) ) {
     
    675661                                getCallArg( deref, 0 ) = unqExpr;
    676662                                addDeref.insert( unqExpr->get_id() );
    677                                 if ( unqCount[ unqExpr->get_id() ] == 0 ) {  // insert destructor after the last use of the unique expression
    678                                         stmtsToAdd.splice( stmtsToAddAfter.end(), dtors[ unqExpr->get_id() ] );
    679                                 } else { // remember dtors for last instance of unique expr
    680                                         dtors[ unqExpr->get_id() ] = fixer.stmtsToAddAfter;
    681                                 }
    682663                                return deref;
    683664                        }
Note: See TracChangeset for help on using the changeset viewer.