Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    re04ef3a rb9be079b  
    1919#include <functional>
    2020#include <cassert>
     21#include <unordered_map>
     22#include <utility>
     23#include <vector>
    2124
    2225#include "AlternativeFinder.h"
     
    3942#include "Tuples/NameMatcher.h"
    4043#include "Common/utility.h"
     44#include "InitTweak/InitTweak.h"
    4145
    4246extern bool resolvep;
     
    407411        }
    408412
    409         static const int recursionLimit = 10;
     413        /// Map of declarations (intended to be the assertions in an AssertionSet) to their parents and the number of times they've been included
     414        typedef std::unordered_map< DeclarationWithType*, std::unordered_map< DeclarationWithType*, unsigned > > AssertionParentSet;
     415       
     416        static const int recursionLimit = 10;  ///< Limit to depth of recursion satisfaction
     417        static const unsigned recursionParentLimit = 1;  ///< Limit to the number of times an assertion can recursively use itself
    410418
    411419        void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) {
     
    416424                }
    417425        }
    418 
     426       
    419427        template< typename ForwardIterator, typename OutputIterator >
    420         void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, int level, const SymTab::Indexer &indexer, OutputIterator out ) {
     428        void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, const AssertionParentSet &needParents,
     429                                                 int level, const SymTab::Indexer &indexer, OutputIterator out ) {
    421430                if ( begin == end ) {
    422431                        if ( newNeed.empty() ) {
     
    431440                                        printAssertionSet( newNeed, std::cerr, 8 );
    432441                                )
    433                                 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out );
     442                                inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, needParents, level+1, indexer, out );
    434443                                return;
    435444                        }
     
    438447                ForwardIterator cur = begin++;
    439448                if ( ! cur->second ) {
    440                         inferRecursive( begin, end, newAlt, openVars, decls, newNeed, level, indexer, out );
     449                        inferRecursive( begin, end, newAlt, openVars, decls, newNeed, needParents, level, indexer, out );
    441450                }
    442451                DeclarationWithType *curDecl = cur->first;
     
    455464                                std::cerr << std::endl;
    456465                        )
     466                        AssertionParentSet newNeedParents( needParents );
     467                        // skip repeatingly-self-recursive assertion satisfaction
     468                        if ( newNeedParents[ curDecl ][ *candidate ]++ > recursionParentLimit ) return;
     469                       
    457470                        AssertionSet newHave, newerNeed( newNeed );
    458471                        TypeEnvironment newEnv( newAlt.env );
     
    491504                                // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions
    492505                                appExpr->get_inferParams()[ curDecl->get_uniqueId() ] = ParamEntry( (*candidate)->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr );
    493                                 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, level, indexer, out );
     506                                inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, newNeedParents, level, indexer, out );
    494507                        } else {
    495508                                delete adjType;
     
    513526                addToIndexer( have, decls );
    514527                AssertionSet newNeed;
    515                 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out );
     528                AssertionParentSet needParents;
     529                inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, needParents, 0, indexer, out );
    516530//      PRINT(
    517531//          std::cerr << "declaration 14 is ";
     
    546560
    547561                {
    548                         NameExpr *fname = 0;;
    549                         if ( ( fname = dynamic_cast<NameExpr *>( untypedExpr->get_function()))
    550                                  && ( fname->get_name() == std::string("&&")) ) {
     562                        std::string fname = InitTweak::getFunctionName( untypedExpr );
     563                        if ( fname == "&&" ) {
    551564                                VoidType v = Type::Qualifiers();                // resolve to type void *
    552565                                PointerType pt( Type::Qualifiers(), v.clone() );
Note: See TracChangeset for help on using the changeset viewer.