Ignore:
Timestamp:
Sep 1, 2017, 2:39:52 PM (4 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
a984e65
Parents:
9b18044
Message:

Refactor Validate filter into utility

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r9b18044 r2bf9c37  
    291291
    292292        HoistStruct::HoistStruct() : inStruct( false ) {
    293         }
    294 
    295         void filter( std::list< Declaration * > &declList, bool (*pred)( Declaration * ), bool doDelete ) {
    296                 std::list< Declaration * >::iterator i = declList.begin();
    297                 while ( i != declList.end() ) {
    298                         std::list< Declaration * >::iterator next = i;
    299                         ++next;
    300                         if ( pred( *i ) ) {
    301                                 if ( doDelete ) {
    302                                         delete *i;
    303                                 } // if
    304                                 declList.erase( i );
    305                         } // if
    306                         i = next;
    307                 } // while
    308293        }
    309294
     
    797782                CompoundStmt *ret = Mutator::mutate( compoundStmt );
    798783                scopeLevel -= 1;
    799                 std::list< Statement * >::iterator i = compoundStmt->get_kids().begin();
    800                 while ( i != compoundStmt->get_kids().end() ) {
    801                         std::list< Statement * >::iterator next = i+1;
    802                         if ( DeclStmt *declStmt = dynamic_cast< DeclStmt * >( *i ) ) {
     784                // remove and delete decl stmts
     785                filter( compoundStmt->kids, [](Statement * stmt) {
     786                        if ( DeclStmt *declStmt = dynamic_cast< DeclStmt * >( stmt ) ) {
    803787                                if ( dynamic_cast< TypedefDecl * >( declStmt->get_decl() ) ) {
    804                                         delete *i;
    805                                         compoundStmt->get_kids().erase( i );
     788                                        return true;
    806789                                } // if
    807790                        } // if
    808                         i = next;
    809                 } // while
     791                        return false;
     792                }, true);
    810793                typedefNames.endScope();
    811794                return ret;
     
    816799        template<typename AggDecl>
    817800        AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
    818                 std::list<Declaration *>::iterator it = aggDecl->get_members().begin();
    819                 for ( ; it != aggDecl->get_members().end(); ) {
    820                         std::list< Declaration * >::iterator next = it+1;
    821                         if ( dynamic_cast< TypedefDecl * >( *it ) ) {
    822                                 delete *it;
    823                                 aggDecl->get_members().erase( it );
    824                         } // if
    825                         it = next;
    826                 }
     801                filter( aggDecl->members, isTypedef, true );
    827802                return aggDecl;
    828803        }
Note: See TracChangeset for help on using the changeset viewer.