Changeset 5c14030 for src/ResolvExpr
- Timestamp:
- Jul 11, 2018, 4:26:22 PM (7 years ago)
- Branches:
- new-env
- Children:
- d318a18
- Parents:
- 184557e
- git-author:
- Aaron Moss <a3moss@…> (07/11/18 16:10:36)
- git-committer:
- Aaron Moss <a3moss@…> (07/11/18 16:26:22)
- Location:
- src/ResolvExpr
- Files:
-
- 3 edited
-
AlternativeFinder.cc (modified) (8 diffs)
-
TypeEnvironment.cc (modified) (14 diffs)
-
TypeEnvironment.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r184557e r5c14030 454 454 } 455 455 456 #if 0// cost of assertions accounted for in function creation456 #if 1 // cost of assertions accounted for in function creation 457 457 for ( InferredParams::const_iterator assert = appExpr->get_inferParams().begin(); assert != appExpr->get_inferParams().end(); ++assert ) { 458 458 convCost += computeConversionCost( assert->second.actualType, assert->second.formalType, indexer, alt.env ); … … 584 584 } 585 585 586 #if !1 586 587 namespace { 587 588 /// Information required to defer resolution of an expression … … 700 701 } 701 702 } 703 #endif 702 704 703 705 template< typename OutputIterator > … … 715 717 // ) 716 718 addToIndexer( have, decls ); 717 719 #if !1 718 720 AssertionResnState resn{ newAlt, openVars, indexer }; 719 721 … … 752 754 *out++ = newAlt; 753 755 754 # if 0756 #else 755 757 AssertionSet newNeed; 756 758 PRINT( … … 1093 1095 } 1094 1096 1097 #if !1 1095 1098 namespace { 1096 1099 … … 1230 1233 } 1231 1234 } 1235 #endif 1232 1236 1233 1237 template<typename OutputIterator> … … 1276 1280 1277 1281 // calculate declaration cost of function (+vars-spec) 1282 #if !1 1278 1283 Cost funcCost = declCost( funcType ); 1284 #else 1285 Cost funcCost = Cost::zero; 1286 #endif 1279 1287 1280 1288 // iteratively build matches, one parameter at a time -
src/ResolvExpr/TypeEnvironment.cc
r184557e r5c14030 27 27 #include "SynTree/Type.h" // for Type, FunctionType, Type::Fora... 28 28 #include "SynTree/TypeSubstitution.h" // for TypeSubstitution 29 #include "Tuples/Tuples.h" // for isTtype 29 30 #include "TypeEnvironment.h" 30 31 #include "typeops.h" // for occurs … … 104 105 auto tyVar = openVars.find( typeInst->get_name() ); 105 106 assert( tyVar != openVars.end() ); 106 if ( ! tyVarCompatible( tyVar->second, other) ) return false;107 if ( ! tyVarCompatible( tyVar->second, bindTo ) ) return false; 107 108 108 109 if ( occurs( bindTo, typeInst->get_name(), *this ) ) return false; … … 135 136 } else { 136 137 // make new class consisting entirely of this variable 137 BoundType curData{ bindTo->clone(), widenMode.first && widenMode.second, data }; 138 BoundType curData{ 139 bindTo->clone(), widenMode.widenFirst && widenMode.widenSecond, data }; 138 140 curData.type->get_qualifiers() = Type::Qualifiers{}; 139 141 classes = classes->add( curClass.get_root() ); … … 146 148 const TypeDecl::Data& data, AssertionSet& need, AssertionSet& have, 147 149 const OpenVarSet& openVars, WidenMode widenMode, const SymTab::Indexer& indexer ) { 148 ClassRef class1 = env.lookup( var1->get_name() );149 ClassRef class2 = env.lookup( var2->get_name() );150 ClassRef class1 = lookup( var1->get_name() ); 151 ClassRef class2 = lookup( var2->get_name() ); 150 152 151 153 // exit early if variables already bound together … … 153 155 BoundType data1 = class1.get_bound(); 154 156 // narrow the binding if needed 155 if ( data1.allowWidening && widenMode. first != widenMode.second ) {157 if ( data1.allowWidening && widenMode.widenFirst != widenMode.widenSecond ) { 156 158 data1.allowWidening = false; 157 159 bindings = bindings->set( class1.get_root(), data1 ); … … 172 174 openVars, WidenMode{ widen1, widen2 }, indexer, common ) ) { 173 175 // merge type variables 174 interned_string root = mergeClasses( class1.update_root(), class2.update_root() ); 176 interned_string root = 177 mergeClasses( class1.update_root(), class2.update_root() ).first; 175 178 // update bindings 176 179 data1.allowWidening = widen1 && widen2; … … 197 200 if ( data2.allowWidening != widen2 ) { 198 201 data2.allowWidening = widen2; 199 bindings = bindings->set( root, data2 );202 bindings = bindings->set( merged.first, data2 ); 200 203 } else if ( merged.first == class1.get_root() ) { 201 204 bindings = bindings->set( merged.first, data2 ); … … 249 252 // filter overlapping classes out of existing environment 250 253 // (this is a very shady assumption, but has worked for a long time...) 251 interned_string root = classes->find_or_default( v , not_found );254 interned_string root = classes->find_or_default( var, not_found ); 252 255 if ( root != not_found ) { 253 256 classes = classes->remove_class( root ); … … 262 265 // add variable to class and bindings 263 266 classes = classes->add( var ); 264 bindings = bindings->set( var, BoundType{ p.second->clone , false, data } );267 bindings = bindings->set( var, BoundType{ p.second->clone(), false, data } ); 265 268 } 266 269 } 267 270 268 271 void TypeEnvironment::makeSubstitution( TypeSubstitution &sub ) const { 269 bindings-> apply_to_all([classes, &sub]( interned_string root, const BoundType& bound ){270 classes-> apply_to_class(root, [&]( interned_string var ) {272 bindings->for_each([&]( interned_string root, const BoundType& bound ){ 273 classes->for_class(root, [&]( interned_string var ) { 271 274 if ( bound.type ) { 272 275 sub.add( var, bound.type ); … … 282 285 283 286 void TypeEnvironment::print( std::ostream &os, Indenter indent ) const { 284 bindings-> apply_to_all([classes,&]( interned_string root, const BoundType& bound ) {287 bindings->for_each([&]( interned_string root, const BoundType& bound ) { 285 288 os << "( "; 286 classes-> apply_to_class( root, [&os]( interned_string var ) { os << var << " "; } );289 classes->for_class( root, [&os]( interned_string var ) { os << var << " "; } ); 287 290 os << ")"; 288 291 if ( bound.type ) { 289 292 os << " -> "; 290 type->print( os, indent+1 );293 bound.type->print( os, indent+1 ); 291 294 } 292 295 if ( ! bound.allowWidening ) { … … 298 301 299 302 void TypeEnvironment::simpleCombine( const TypeEnvironment &o ) { 300 o.bindings-> apply_to_all( [&]( interned_string root, const BoundType& bound ) {303 o.bindings->for_each( [&]( interned_string root, const BoundType& bound ) { 301 304 // add members of new class 302 305 interned_string new_root{nullptr}; 303 o.classes-> apply_to_class( root, [this,&new_root]( interned_string var ) {306 o.classes->for_class( root, [this,&new_root]( interned_string var ) { 304 307 classes = classes->add( var ); 305 308 new_root = new_root ? mergeClasses( new_root, var ).first : var; … … 311 314 312 315 void TypeEnvironment::extractOpenVars( OpenVarSet &openVars ) const { 313 bindings-> apply_to_all( [classes,&openVars]( interned_string root, const BoundType& bound ) {314 classes-> apply_to_class( root, [&openVars,&bound]( interned_string var ) {316 bindings->for_each( [&]( interned_string root, const BoundType& bound ) { 317 classes->for_class( root, [&openVars,&bound]( interned_string var ) { 315 318 openVars[ var ] = bound.data; 316 319 } ); … … 319 322 320 323 void TypeEnvironment::addActual( const TypeEnvironment& actualEnv, OpenVarSet& openVars ) { 321 actualEnv.bindings-> apply_to_all( [&]( interned_string root, const BoundType& bound ) {324 actualEnv.bindings->for_each( [&]( interned_string root, const BoundType& bound ) { 322 325 // add members of new class, setting openVars concurrently 323 326 interned_string new_root{nullptr}; 324 actualEnv.classes-> apply_to_class( root, [&]( interned_string var ) {327 actualEnv.classes->for_class( root, [&]( interned_string var ) { 325 328 classes = classes->add( var ); 326 329 new_root = new_root ? mergeClasses( new_root, var ).first : var; … … 334 337 335 338 void TypeEnvironment::forbidWidening() { 336 bindings = bindings-> apply_to_all([]( const interned_string& k, BoundType& c ) {339 bindings = bindings->mutate_each([]( const interned_string&, BoundType& c ) { 337 340 if ( c.allowWidening ) { 338 341 option<BoundType> ret = c; -
src/ResolvExpr/TypeEnvironment.h
r184557e r5c14030 189 189 /// returned root variable will be valid regardless 190 190 ClassRef lookup( interned_string var ) const; 191 ClassRef lookup( const std::string &var ) const { return lookup( var ); }192 191 193 192 /// Binds a type variable to a type; returns false if fails … … 202 201 203 202 public: 203 TypeEnvironment() : classes{ new Classes{} }, bindings{ new Bindings{} } {} 204 204 205 void add( const Type::ForallList &tyDecls ); 205 206 void add( const TypeSubstitution & sub ); … … 224 225 void forbidWidening(); 225 226 226 iterator begin() { return { this, bindings->begin() }; }227 iterator end() { return { this, bindings->end() }; }227 iterator begin() const { return { this, bindings->begin() }; } 228 iterator end() const { return { this, bindings->end() }; } 228 229 }; 229 230 … … 234 235 T vars; 235 236 if ( ! env->classes->count( root ) ) return vars; 236 env->classes-> apply_to_class( root, [&vars]( interned_string var ) {237 env->classes->for_class( root, [&vars]( interned_string var ) { 237 238 vars.insert( vars.end(), var ); 238 239 } );
Note:
See TracChangeset
for help on using the changeset viewer.