Changes in / [ebc0a85:1259c35]
- Location:
- src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
rebc0a85 r1259c35 10 10 // Created On : Thu May 09 15::37::05 2019 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : T ue May 28 12:00:00 201913 // Update Count : 712 // Last Modified On : Thu May 23 16:59:00 2019 13 // Update Count : 6 14 14 // 15 15 … … 1337 1337 if ( ! old ) return nullptr; 1338 1338 old->accept(*this); 1339 ast::Node * ret = node; 1340 node = nullptr; 1341 return strict_dynamic_cast< NewT * >( ret ); 1339 return strict_dynamic_cast< NewT * >( node ); 1342 1340 } 1343 1341 … … 1352 1350 a->accept( *this ); 1353 1351 ret.emplace_back( strict_dynamic_cast< NewT * >(node) ); 1354 node = nullptr;1355 1352 } 1356 1353 return ret; … … 1876 1873 GET_LABELS_V(old->labels) 1877 1874 ); 1878 cache.emplace( old, stmt ); 1875 this->node = stmt; 1876 cache.emplace( old, this->node ); 1879 1877 stmt->callStmt = GET_ACCEPT_1(callStmt, Stmt); 1880 this->node = stmt;1881 1878 } 1882 1879 -
src/ResolvExpr/ResolveAssertions.cc
rebc0a85 r1259c35 103 103 OpenVarSet openVars; 104 104 std::vector<DeferRef> assns; 105 Cost cost;106 105 107 106 OutType( const TypeEnvironment& env, const OpenVarSet& openVars, 108 107 const std::vector<DeferRef>& assns ) 109 : env(env), openVars(openVars), assns(assns) , cost(Cost::infinity){}108 : env(env), openVars(openVars), assns(assns) {} 110 109 }; 111 110 … … 141 140 using Element = CandidateEnvMerger::OutType; 142 141 private: 142 using Memo = std::unordered_map<const Element*, Cost>; 143 mutable Memo cache; ///< cache of element costs 143 144 const SymTab::Indexer& indexer; ///< Indexer for costing 144 145 … … 147 148 148 149 /// reports the cost of an element 149 Cost get( Element& x ) const { 150 // check cached cost 151 if ( x.cost != Cost::infinity ) return x.cost; 152 153 // generate cost 154 Cost k = Cost::zero; 155 for ( const auto& assn : x.assns ) { 156 k += computeConversionCost( 157 assn.match.adjType, assn.decl->get_type(), indexer, x.env ); 158 159 // mark vars+specialization cost on function-type assertions 160 Type* assnType = assn.match.cdata.id->get_type(); 161 FunctionType* func; 162 if ( PointerType* ptr = dynamic_cast< PointerType* >( assnType ) ) { 163 func = dynamic_cast< FunctionType* >( ptr->base ); 164 } else { 165 func = dynamic_cast< FunctionType* >( assnType ); 166 } 167 if ( ! func ) continue; 168 169 for ( DeclarationWithType* formal : func->parameters ) { 170 k.decSpec( specCost( formal->get_type() ) ); 171 } 172 k.incVar( func->forall.size() ); 173 for ( TypeDecl* td : func->forall ) { 174 k.decSpec( td->assertions.size() ); 175 } 150 Cost get( const Element& x ) const { 151 Memo::const_iterator it = cache.find( &x ); 152 if ( it == cache.end() ) { 153 Cost k = Cost::zero; 154 for ( const auto& assn : x.assns ) { 155 k += computeConversionCost( 156 assn.match.adjType, assn.decl->get_type(), indexer, x.env ); 157 158 // mark vars+specialization cost on function-type assertions 159 PointerType* ptr = dynamic_cast< PointerType* >( assn.decl->get_type() ); 160 if ( ! ptr ) continue; 161 FunctionType* func = dynamic_cast< FunctionType* >( ptr->base ); 162 if ( ! func ) continue; 163 164 for ( DeclarationWithType* formal : func->parameters ) { 165 k.decSpec( specCost( formal->get_type() ) ); 166 } 167 k.incVar( func->forall.size() ); 168 for ( TypeDecl* td : func->forall ) { 169 k.decSpec( td->assertions.size() ); 170 } 171 } 172 it = cache.emplace_hint( it, &x, k ); 176 173 } 177 178 // cache and return 179 x.cost = k; 180 return k; 174 return it->second; 181 175 } 182 176 183 177 /// compares elements by cost 184 bool operator() ( Element& a,Element& b ) const {178 bool operator() ( const Element& a, const Element& b ) const { 185 179 return get( a ) < get( b ); 186 180 }
Note: See TracChangeset
for help on using the changeset viewer.