Changeset aaeacf4 for src/ResolvExpr


Ignore:
Timestamp:
Jun 12, 2019, 4:06:32 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
21300d7
Parents:
6e3e0717
Message:

Removed global look-up table from UniqueId? to Decl

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/ResolveAssertions.cc

    r6e3e0717 raaeacf4  
    5050                UniqueId resnSlot;              ///< Slot for any recursive assertion IDs
    5151
    52                 AssnCandidate( const SymTab::Indexer::IdData& cdata, Type* adjType, TypeEnvironment&& env, 
    53                         AssertionSet&& have, AssertionSet&& need, OpenVarSet&& openVars, UniqueId resnSlot ) 
    54                 : cdata(cdata), adjType(adjType), env(std::move(env)), have(std::move(have)), 
     52                AssnCandidate( const SymTab::Indexer::IdData& cdata, Type* adjType, TypeEnvironment&& env,
     53                        AssertionSet&& have, AssertionSet&& need, OpenVarSet&& openVars, UniqueId resnSlot )
     54                : cdata(cdata), adjType(adjType), env(std::move(env)), have(std::move(have)),
    5555                        need(std::move(need)), openVars(std::move(openVars)), resnSlot(resnSlot) {}
    5656        };
     
    8686        using DeferList = std::vector<DeferItem>;
    8787
    88         /// Combo iterator that combines candidates into an output list, merging their environments. 
     88        /// Combo iterator that combines candidates into an output list, merging their environments.
    8989        /// Rejects an appended candidate if the environments cannot be merged.
    9090        class CandidateEnvMerger {
     
    9797                /// Indexer to use for merges
    9898                const SymTab::Indexer& indexer;
    99        
     99
    100100        public:
    101101                /// The merged environment/open variables and the list of candidates
     
    106106                        Cost cost;
    107107
    108                         OutType( const TypeEnvironment& env, const OpenVarSet& openVars, 
     108                        OutType( const TypeEnvironment& env, const OpenVarSet& openVars,
    109109                                const std::vector<DeferRef>& assns )
    110110                        : env(env), openVars(openVars), assns(assns), cost(Cost::infinity) {}
    111111                };
    112112
    113                 CandidateEnvMerger( const TypeEnvironment& env, const OpenVarSet& openVars, 
     113                CandidateEnvMerger( const TypeEnvironment& env, const OpenVarSet& openVars,
    114114                        const SymTab::Indexer& indexer )
    115115                : crnt(), envs{ env }, varSets{ openVars }, indexer(indexer) {}
     
    137137        };
    138138
    139         /// Comparator for CandidateEnvMerger outputs that sums their costs and caches the stored 
     139        /// Comparator for CandidateEnvMerger outputs that sums their costs and caches the stored
    140140        /// sums
    141141        struct CandidateCost {
     
    156156                        for ( const auto& assn : x.assns ) {
    157157                                // compute conversion cost from satisfying decl to assertion
    158                                 k += computeConversionCost( 
     158                                k += computeConversionCost(
    159159                                        assn.match.adjType, assn.decl->get_type(), indexer, x.env );
    160                                
     160
    161161                                // mark vars+specialization cost on function-type assertions
    162162                                FunctionType* func = GenPoly::getFunctionType( assn.match.cdata.id->get_type() );
    163163                                if ( ! func ) continue;
    164                                
     164
    165165                                for ( DeclarationWithType* formal : func->parameters ) {
    166166                                        k.decSpec( specCost( formal->get_type() ) );
     
    176176                        return k;
    177177                }
    178                
     178
    179179                /// compares elements by cost
    180180                bool operator() ( Element& a, Element& b ) const {
     
    206206                /// Updated resolution state with new need-list
    207207                ResnState( ResnState&& o, IterateFlag )
    208                 : alt(std::move(o.alt)), need(o.newNeed.begin(), o.newNeed.end()), newNeed(), deferred(), 
     208                : alt(std::move(o.alt)), need(o.newNeed.begin(), o.newNeed.end()), newNeed(), deferred(),
    209209                  inferred(std::move(o.inferred)), indexer(o.indexer) {}
    210210        };
    211211
    212212        /// Binds a single assertion, updating resolution state
    213         void bindAssertion( const DeclarationWithType* decl, AssertionSetValue info, Alternative& alt, 
     213        void bindAssertion( const DeclarationWithType* decl, AssertionSetValue info, Alternative& alt,
    214214                        AssnCandidate& match, InferCache& inferred ) {
    215                
     215
    216216                DeclarationWithType* candidate = match.cdata.id;
    217217                assertf( candidate->get_uniqueId(), "Assertion candidate does not have a unique ID: %s", toString( candidate ).c_str() );
     
    224224                // place newly-inferred assertion in proper place in cache
    225225                inferred[ info.resnSlot ][ decl->get_uniqueId() ] = ParamEntry{
    226                                 candidate->get_uniqueId(), match.adjType->clone(), decl->get_type()->clone(),
     226                                candidate->get_uniqueId(), candidate->clone(), match.adjType->clone(), decl->get_type()->clone(),
    227227                                varExpr };
    228228        }
     
    263263
    264264                        // keep unifying candidates
    265                         if ( unify( assn.decl->get_type(), adjType, newEnv, newNeed, have, newOpenVars, 
     265                        if ( unify( assn.decl->get_type(), adjType, newEnv, newNeed, have, newOpenVars,
    266266                                        resn.indexer ) ) {
    267267                                // set up binding slot for recursive assertions
     
    274274                                }
    275275
    276                                 matches.emplace_back( cdata, adjType, std::move(newEnv), std::move(have), 
     276                                matches.emplace_back( cdata, adjType, std::move(newEnv), std::move(have),
    277277                                        std::move(newNeed), std::move(newOpenVars), crntResnSlot );
    278278                        } else {
     
    319319                                }
    320320                                InferredParams& inferParams = it->second;
    321                                
     321
    322322                                // place inferred parameters into proper place in expression
    323323                                for ( auto& entry : inferParams ) {
     
    373373                                                ss << (tabs-1) << "Could not satisfy assertion:\n";
    374374                                                assn.decl->print( ss, tabs );
    375                                                
     375
    376376                                                errors.emplace_back( ss.str() );
    377377                                                goto nextResn;
     
    403403                                        // resolve deferred assertions by mutual compatibility
    404404                                        std::vector<CandidateEnvMerger::OutType> compatible = filterCombos(
    405                                                 resn.deferred, 
     405                                                resn.deferred,
    406406                                                CandidateEnvMerger{ resn.alt.env, resn.alt.openVars, resn.indexer } );
    407407                                        // fail early if no mutually-compatible assertion satisfaction
     
    466466                        new_resns.clear();
    467467                }
    468                
     468
    469469                // exceeded recursion limit if reaches here
    470470                if ( out.empty() ) {
Note: See TracChangeset for help on using the changeset viewer.