Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    r22cad76 re04ef3a  
    1919#include <functional>
    2020#include <cassert>
    21 #include <unordered_map>
    22 #include <utility>
    23 #include <vector>
    2421
    2522#include "AlternativeFinder.h"
     
    4239#include "Tuples/NameMatcher.h"
    4340#include "Common/utility.h"
    44 #include "InitTweak/InitTweak.h"
    4541
    4642extern bool resolvep;
     
    411407        }
    412408
    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
     409        static const int recursionLimit = 10;
    418410
    419411        void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) {
     
    424416                }
    425417        }
    426        
     418
    427419        template< typename ForwardIterator, typename OutputIterator >
    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 ) {
     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 ) {
    430421                if ( begin == end ) {
    431422                        if ( newNeed.empty() ) {
     
    440431                                        printAssertionSet( newNeed, std::cerr, 8 );
    441432                                )
    442                                 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, needParents, level+1, indexer, out );
     433                                inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out );
    443434                                return;
    444435                        }
     
    447438                ForwardIterator cur = begin++;
    448439                if ( ! cur->second ) {
    449                         inferRecursive( begin, end, newAlt, openVars, decls, newNeed, needParents, level, indexer, out );
     440                        inferRecursive( begin, end, newAlt, openVars, decls, newNeed, level, indexer, out );
    450441                }
    451442                DeclarationWithType *curDecl = cur->first;
     
    464455                                std::cerr << std::endl;
    465456                        )
    466                        
    467457                        AssertionSet newHave, newerNeed( newNeed );
    468458                        TypeEnvironment newEnv( newAlt.env );
     
    487477                                newerAlt.env = newEnv;
    488478                                assert( (*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 );
     479                                Expression *varExpr = new VariableExpr( static_cast< DeclarationWithType* >( Declaration::declFromId( (*candidate)->get_uniqueId() ) ) );
    494480                                deleteAll( varExpr->get_results() );
    495481                                varExpr->get_results().clear();
     
    505491                                // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions
    506492                                appExpr->get_inferParams()[ curDecl->get_uniqueId() ] = ParamEntry( (*candidate)->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr );
    507                                 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, newNeedParents, level, indexer, out );
     493                                inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, level, indexer, out );
    508494                        } else {
    509495                                delete adjType;
     
    527513                addToIndexer( have, decls );
    528514                AssertionSet newNeed;
    529                 AssertionParentSet needParents;
    530                 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, needParents, 0, indexer, out );
     515                inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out );
    531516//      PRINT(
    532517//          std::cerr << "declaration 14 is ";
     
    561546
    562547                {
    563                         std::string fname = InitTweak::getFunctionName( untypedExpr );
    564                         if ( fname == "&&" ) {
     548                        NameExpr *fname = 0;;
     549                        if ( ( fname = dynamic_cast<NameExpr *>( untypedExpr->get_function()))
     550                                 && ( fname->get_name() == std::string("&&")) ) {
    565551                                VoidType v = Type::Qualifiers();                // resolve to type void *
    566552                                PointerType pt( Type::Qualifiers(), v.clone() );
Note: See TracChangeset for help on using the changeset viewer.