Changeset 5c14030 for src/ResolvExpr/TypeEnvironment.cc
- Timestamp:
- Jul 11, 2018, 4:26:22 PM (6 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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;
Note: See TracChangeset
for help on using the changeset viewer.