Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    re04ef3a r22cad76  
    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 declaration uniqueIds (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< UniqueId, std::unordered_map< UniqueId, 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                       
    457467                        AssertionSet newHave, newerNeed( newNeed );
    458468                        TypeEnvironment newEnv( newAlt.env );
     
    477487                                newerAlt.env = newEnv;
    478488                                assert( (*candidate)->get_uniqueId() );
    479                                 Expression *varExpr = new VariableExpr( static_cast< DeclarationWithType* >( Declaration::declFromId( (*candidate)->get_uniqueId() ) ) );
     489                                DeclarationWithType *candDecl = static_cast< DeclarationWithType* >( Declaration::declFromId( (*candidate)->get_uniqueId() ) );
     490                                AssertionParentSet newNeedParents( needParents );
     491                                // skip repeatingly-self-recursive assertion satisfaction
     492                                if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue;
     493                                Expression *varExpr = new VariableExpr( candDecl );
    480494                                deleteAll( varExpr->get_results() );
    481495                                varExpr->get_results().clear();
     
    491505                                // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions
    492506                                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 );
     507                                inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, newNeedParents, level, indexer, out );
    494508                        } else {
    495509                                delete adjType;
     
    513527                addToIndexer( have, decls );
    514528                AssertionSet newNeed;
    515                 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out );
     529                AssertionParentSet needParents;
     530                inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, needParents, 0, indexer, out );
    516531//      PRINT(
    517532//          std::cerr << "declaration 14 is ";
     
    546561
    547562                {
    548                         NameExpr *fname = 0;;
    549                         if ( ( fname = dynamic_cast<NameExpr *>( untypedExpr->get_function()))
    550                                  && ( fname->get_name() == std::string("&&")) ) {
     563                        std::string fname = InitTweak::getFunctionName( untypedExpr );
     564                        if ( fname == "&&" ) {
    551565                                VoidType v = Type::Qualifiers();                // resolve to type void *
    552566                                PointerType pt( Type::Qualifiers(), v.clone() );
Note: See TracChangeset for help on using the changeset viewer.