Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    r00ac42e r5de1e2c  
    102102                void addAnonConversions( const Alternative & alt );
    103103                /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member
    104                 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name );
     104                template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member );
    105105                /// Adds alternatives for member expressions where the left side has tuple type
    106106                void addTupleMembers( TupleType * tupleType, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member );
     
    307307
    308308                if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->result ) ) {
    309                         addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, "" );
     309                        NameExpr nameExpr( "" );
     310                        addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr );
    310311                } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->result ) ) {
    311                         addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, "" );
     312                        NameExpr nameExpr( "" );
     313                        addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr );
    312314                } // if
    313315        }
    314316
    315317        template< typename StructOrUnionType >
    316         void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name ) {
     318        void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) {
     319                // by this point, member must be a name expr
     320                NameExpr * nameExpr = dynamic_cast< NameExpr * >( member );
     321                if ( ! nameExpr ) return;
     322                const std::string & name = nameExpr->name;
    317323                std::list< Declaration* > members;
    318324                aggInst->lookup( name, members );
     
    466472        }
    467473
     474        // /// Map of declaration uniqueIds (intended to be the assertions in an AssertionSet) to their parents and the number of times they've been included
     475        //typedef std::unordered_map< UniqueId, std::unordered_map< UniqueId, unsigned > > AssertionParentSet;
     476
    468477        static const int recursionLimit = /*10*/ 4;  ///< Limit to depth of recursion satisfaction
     478        //static const unsigned recursionParentLimit = 1;  ///< Limit to the number of times an assertion can recursively use itself
    469479
    470480        void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) {
     
    477487
    478488        template< typename ForwardIterator, typename OutputIterator >
    479         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 ) {
     489        void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, /*const AssertionParentSet &needParents,*/
     490                                                 int level, const SymTab::Indexer &indexer, OutputIterator out ) {
    480491                if ( begin == end ) {
    481492                        if ( newNeed.empty() ) {
     
    495506                                        printAssertionSet( newNeed, std::cerr, 8 );
    496507                                )
    497                                 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out );
     508                                inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, /*needParents,*/ level+1, indexer, out );
    498509                                return;
    499510                        }
     
    502513                ForwardIterator cur = begin++;
    503514                if ( ! cur->second.isUsed ) {
    504                         inferRecursive( begin, end, newAlt, openVars, decls, newNeed, level, indexer, out );
     515                        inferRecursive( begin, end, newAlt, openVars, decls, newNeed, /*needParents,*/ level, indexer, out );
    505516                        return; // xxx - should this continue? previously this wasn't here, and it looks like it should be
    506517                }
     
    555566                                }
    556567
     568                                //AssertionParentSet newNeedParents( needParents );
     569                                // skip repeatingly-self-recursive assertion satisfaction
     570                                // DOESN'T WORK: grandchild nodes conflict with their cousins
     571                                //if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue;
     572
    557573                                Expression *varExpr = data.combine( newerAlt.cvtCost );
    558574                                delete varExpr->get_result();
     
    572588                                // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions
    573589                                (*inferParameters)[ curDecl->get_uniqueId() ] = ParamEntry( candidate->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr );
    574                                 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, level, indexer, out );
     590                                inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, /*newNeedParents,*/ level, indexer, out );
    575591                        } else {
    576592                                delete adjType;
     
    594610                addToIndexer( have, decls );
    595611                AssertionSet newNeed;
     612                //AssertionParentSet needParents;
    596613                PRINT(
    597614                        std::cerr << "env is: " << std::endl;
     
    600617                )
    601618
    602                 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out );
     619                inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, /*needParents,*/ 0, indexer, out );
    603620//      PRINT(
    604621//          std::cerr << "declaration 14 is ";
     
    10791096                AlternativeFinder funcOpFinder( indexer, env );
    10801097                // it's ok if there aren't any defined function ops
    1081                 funcOpFinder.maybeFind( opExpr );
     1098                funcOpFinder.maybeFind( opExpr);
    10821099                PRINT(
    10831100                        std::cerr << "known function ops:" << std::endl;
     
    11161133                                        }
    11171134                                } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( func->expr->result->stripReferences() ) ) { // handle ftype (e.g. *? on function pointer)
    1118                                         if ( const EqvClass *eqvClass = func->env.lookup( typeInst->name ) ) {
    1119                                                 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass->type ) ) {
     1135                                        EqvClass eqvClass;
     1136                                        if ( func->env.lookup( typeInst->name, eqvClass ) && eqvClass.type ) {
     1137                                                if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass.type ) ) {
    11201138                                                        Alternative newFunc( *func );
    11211139                                                        referenceToRvalueConversion( newFunc.expr, newFunc.cost );
     
    13321350        }
    13331351
    1334         namespace {
    1335                 /// Gets name from untyped member expression (member must be NameExpr)
    1336                 const std::string& get_member_name( UntypedMemberExpr *memberExpr ) {
    1337                         NameExpr * nameExpr = dynamic_cast< NameExpr * >( memberExpr->get_member() );
    1338                         assert( nameExpr );
    1339                         return nameExpr->get_name();
    1340                 }
    1341         }
    1342 
    13431352        void AlternativeFinder::Finder::postvisit( UntypedMemberExpr *memberExpr ) {
    13441353                AlternativeFinder funcFinder( indexer, env );
     
    13531362                        // find member of the given type
    13541363                        if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) {
    1355                                 addAggMembers( structInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) );
     1364                                addAggMembers( structInst, aggrExpr, cost, agg->env, memberExpr->get_member() );
    13561365                        } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) {
    1357                                 addAggMembers( unionInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) );
     1366                                addAggMembers( unionInst, aggrExpr, cost, agg->env, memberExpr->get_member() );
    13581367                        } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( aggrExpr->get_result() ) ) {
    13591368                                addTupleMembers( tupleType, aggrExpr, cost, agg->env, memberExpr->get_member() );
Note: See TracChangeset for help on using the changeset viewer.