Changeset 8e18b8e
- Timestamp:
- May 31, 2018, 4:24:49 PM (7 years ago)
- Branches:
- new-env, with_gc
- Children:
- 0182bfa, 1d7b0a8
- Parents:
- 75308bcc
- Location:
- src/ResolvExpr
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AdjustExprType.cc
r75308bcc r8e18b8e 74 74 75 75 Type * AdjustExprType::postmutate( TypeInstType * typeInst ) { 76 EqvClass eqvClass; 77 if ( env.lookup( typeInst->get_name(), eqvClass ) ) { 78 if ( eqvClass.data.kind == TypeDecl::Ftype ) { 76 if ( const EqvClass* eqvClass = env.lookup( typeInst->get_name() ) ) { 77 if ( eqvClass->data.kind == TypeDecl::Ftype ) { 79 78 return new PointerType{ Type::Qualifiers(), typeInst }; 80 79 } -
src/ResolvExpr/AlternativeFinder.cc
r75308bcc r8e18b8e 1109 1109 } 1110 1110 } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( func->expr->get_result()->stripReferences() ) ) { // handle ftype (e.g. *? on function pointer) 1111 EqvClass eqvClass; 1112 if ( func->env.lookup( typeInst->get_name(), eqvClass ) && eqvClass.type ) { 1113 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass.type ) ) { 1111 if ( const EqvClass *eqvClass = func->env.lookup( typeInst->get_name() ) ) { 1112 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass->type ) ) { 1114 1113 Alternative newFunc( *func ); 1115 1114 referenceToRvalueConversion( newFunc.expr, newFunc.cost ); -
src/ResolvExpr/CastCost.cc
r75308bcc r8e18b8e 43 43 Cost castCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 44 44 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 45 EqvClass eqvClass; 46 NamedTypeDecl *namedType; 47 if ( env.lookup( destAsTypeInst->get_name(), eqvClass ) ) { 48 if ( eqvClass.type ) { 49 return castCost( src, eqvClass.type, indexer, env ); 45 if ( const EqvClass* eqvClass = env.lookup( destAsTypeInst->get_name() ) ) { 46 if ( eqvClass->type ) { 47 return castCost( src, eqvClass->type, indexer, env ); 50 48 } else { 51 49 return Cost::infinity; 52 50 } 53 } else if ( ( namedType = indexer.lookupType( destAsTypeInst->get_name()) ) ) {51 } else if ( NamedTypeDecl *namedType = indexer.lookupType( destAsTypeInst->get_name() ) ) { 54 52 // all typedefs should be gone by this point 55 53 TypeDecl *type = strict_dynamic_cast< TypeDecl* >( namedType ); -
src/ResolvExpr/ConversionCost.cc
r75308bcc r8e18b8e 43 43 Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 44 44 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 45 EqvClass eqvClass;46 NamedTypeDecl *namedType;47 45 PRINT( std::cerr << "type inst " << destAsTypeInst->name; ) 48 if ( env.lookup( destAsTypeInst->name, eqvClass) ) {49 if ( eqvClass .type ) {50 return conversionCost( src, eqvClass .type, indexer, env );46 if ( const EqvClass* eqvClass = env.lookup( destAsTypeInst->name ) ) { 47 if ( eqvClass->type ) { 48 return conversionCost( src, eqvClass->type, indexer, env ); 51 49 } else { 52 50 return Cost::infinity; 53 51 } 54 } else if ( ( namedType = indexer.lookupType( destAsTypeInst->name )) ) {52 } else if ( NamedTypeDecl *namedType = indexer.lookupType( destAsTypeInst->name ) ) { 55 53 PRINT( std::cerr << " found" << std::endl; ) 56 54 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType ); … … 362 360 363 361 void ConversionCost::postvisit( TypeInstType *inst ) { 364 EqvClass eqvClass; 365 NamedTypeDecl *namedType; 366 if ( env.lookup( inst->name, eqvClass ) ) { 367 cost = costFunc( eqvClass.type, dest, indexer, env ); 362 if ( const EqvClass *eqvClass = env.lookup( inst->name ) ) { 363 cost = costFunc( eqvClass->type, dest, indexer, env ); 368 364 } else if ( TypeInstType *destAsInst = dynamic_cast< TypeInstType* >( dest ) ) { 369 365 if ( inst->name == destAsInst->name ) { 370 366 cost = Cost::zero; 371 367 } 372 } else if ( ( namedType = indexer.lookupType( inst->name )) ) {368 } else if ( NamedTypeDecl *namedType = indexer.lookupType( inst->name ) ) { 373 369 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType ); 374 370 // all typedefs should be gone by this point -
src/ResolvExpr/Occurs.cc
r75308bcc r8e18b8e 38 38 39 39 Occurs::Occurs( std::string varName, const TypeEnvironment & env ) : result( false ), tenv( env ) { 40 EqvClass eqvClass; 41 if ( tenv.lookup( varName, eqvClass ) ) { 42 eqvVars = eqvClass.vars; 40 if ( const EqvClass *eqvClass = tenv.lookup( varName ) ) { 41 eqvVars = eqvClass->vars; 43 42 } else { 44 43 eqvVars.insert( varName ); … … 47 46 48 47 void Occurs::previsit( TypeInstType * typeInst ) { 49 EqvClass eqvClass; 50 /// std::cerr << "searching for vars: "; 48 /// std::cerr << "searching for vars: "; 51 49 /// std::copy( eqvVars.begin(), eqvVars.end(), std::ostream_iterator< std::string >( std::cerr, " " ) ); 52 50 /// std::cerr << std::endl; 53 51 if ( eqvVars.find( typeInst->get_name() ) != eqvVars.end() ) { 54 52 result = true; 55 } else if ( tenv.lookup( typeInst->get_name(), eqvClass) ) {56 if ( eqvClass .type ) {53 } else if ( const EqvClass *eqvClass = tenv.lookup( typeInst->get_name() ) ) { 54 if ( eqvClass->type ) { 57 55 /// std::cerr << typeInst->get_name() << " is bound to"; 58 56 /// eqvClass.type->print( std::cerr ); 59 57 /// std::cerr << std::endl; 60 eqvClass .type->accept( *visitor );58 eqvClass->type->accept( *visitor ); 61 59 } // if 62 60 } // if -
src/ResolvExpr/PolyCost.cc
r75308bcc r8e18b8e 39 39 40 40 void PolyCost::previsit(TypeInstType * typeInst) { 41 EqvClass eqvClass; 42 if ( tenv.lookup( typeInst->name, eqvClass ) ) { 43 if ( eqvClass.type ) { 44 if ( TypeInstType * otherTypeInst = dynamic_cast< TypeInstType* >( eqvClass.type ) ) { 41 if ( const EqvClass *eqvClass = tenv.lookup( typeInst->name ) ) { 42 if ( eqvClass->type ) { 43 if ( TypeInstType * otherTypeInst = dynamic_cast< TypeInstType* >( eqvClass->type ) ) { 45 44 if ( indexer.lookupType( otherTypeInst->name ) ) { 46 45 // bound to opaque type -
src/ResolvExpr/PtrsAssignable.cc
r75308bcc r8e18b8e 51 51 // std::cerr << "assignable: " << src << " | " << dest << std::endl; 52 52 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 53 EqvClass eqvClass; 54 if ( env.lookup( destAsTypeInst->get_name(), eqvClass ) ) { 55 return ptrsAssignable( src, eqvClass.type, env ); 53 if ( const EqvClass *eqvClass = env.lookup( destAsTypeInst->get_name() ) ) { 54 return ptrsAssignable( src, eqvClass->type, env ); 56 55 } // if 57 56 } // if … … 95 94 void PtrsAssignable::postvisit( __attribute__((unused)) TraitInstType *inst ) {} 96 95 void PtrsAssignable::postvisit( TypeInstType *inst ) { 97 EqvClass eqvClass; 98 if ( env.lookup( inst->get_name(), eqvClass ) && eqvClass.type ) { 99 // T * = S * for any S depends on the type bound to T 100 result = ptrsAssignable( eqvClass.type, dest, env ); 96 if ( const EqvClass *eqvClass = env.lookup( inst->get_name() ) ) { 97 if ( eqvClass->type ) { 98 // T * = S * for any S depends on the type bound to T 99 result = ptrsAssignable( eqvClass->type, dest, env ); 100 } 101 101 } // if 102 102 } -
src/ResolvExpr/PtrsCastable.cc
r75308bcc r8e18b8e 57 57 return -1; 58 58 } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( src ) ) { 59 EqvClass eqvClass;60 59 if ( NamedTypeDecl *ntDecl = indexer.lookupType( typeInst->get_name() ) ) { 61 60 if ( TypeDecl *tyDecl = dynamic_cast< TypeDecl* >( ntDecl ) ) { … … 64 63 } // if 65 64 } //if 66 } else if ( env.lookup( typeInst->get_name(), eqvClass) ) {67 if ( eqvClass .data.kind == TypeDecl::Ftype ) {65 } else if ( const EqvClass *eqvClass = env.lookup( typeInst->get_name() ) ) { 66 if ( eqvClass->data.kind == TypeDecl::Ftype ) { 68 67 return -1; 69 68 } // if … … 79 78 int ptrsCastable( Type *src, Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer ) { 80 79 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 81 EqvClass eqvClass; 82 if ( env.lookup( destAsTypeInst->get_name(), eqvClass ) ) { 80 if ( const EqvClass *eqvClass = env.lookup( destAsTypeInst->get_name() ) ) { 83 81 // xxx - should this be ptrsCastable? 84 return ptrsAssignable( src, eqvClass .type, env );82 return ptrsAssignable( src, eqvClass->type, env ); 85 83 } // if 86 84 } // if -
src/ResolvExpr/TypeEnvironment.cc
r75308bcc r8e18b8e 17 17 #include <algorithm> // for copy, set_intersection 18 18 #include <iterator> // for ostream_iterator, insert_iterator 19 #include <utility> // for pair 19 #include <utility> // for pair, move 20 20 21 21 #include "Common/PassVisitor.h" // for PassVisitor<GcTracer> … … 79 79 } 80 80 81 bool TypeEnvironment::lookup( const std::string &var, EqvClass &eqvClass) const {81 const EqvClass* TypeEnvironment::lookup( const std::string &var ) const { 82 82 for ( std::list< EqvClass >::const_iterator i = env.begin(); i != env.end(); ++i ) { 83 83 if ( i->vars.find( var ) != i->vars.end() ) { 84 84 /// std::cout << var << " is in class "; 85 85 /// i->print( std::cout ); 86 eqvClass = *i; 87 return true; 86 return &*i; 88 87 } 89 88 /// std::cout << var << " is not in class "; 90 89 /// i->print( std::cout ); 91 90 } // for 92 return false; 91 return nullptr; 92 } 93 94 /// Removes any class from env that intersects eqvClass 95 void filterOverlappingClasses( std::list<EqvClass> &env, const EqvClass &eqvClass ) { 96 for ( auto i = env.begin(); i != env.end(); ) { 97 auto next = i; 98 ++next; 99 std::set<std::string> intersection; 100 std::set_intersection( i->vars.begin(), i->vars.end(), eqvClass.vars.begin(), eqvClass.vars.end(), 101 std::inserter( intersection, intersection.begin() ) ); 102 if ( ! intersection.empty() ) { env.erase( i ); } 103 i = next; 104 } 93 105 } 94 106 95 107 void TypeEnvironment::add( const EqvClass &eqvClass ) { 96 std::list< EqvClass >::iterator i = env.begin(); 97 while ( i != env.end() ) { 98 std::list< EqvClass >::iterator next = i; 99 next++; 100 std::set< std::string > intersection; 101 std::set_intersection( i->vars.begin(), i->vars.end(), eqvClass.vars.begin(), eqvClass.vars.end(), std::inserter( intersection, intersection.begin() ) ); 102 if ( ! intersection.empty() ) { 103 env.erase( i ); 104 } // if 105 i = next; 106 } // while 107 env.insert( env.end(), eqvClass ); 108 filterOverlappingClasses( env, eqvClass ); 109 env.push_back( eqvClass ); 110 } 111 112 void TypeEnvironment::add( EqvClass &&eqvClass ) { 113 filterOverlappingClasses( env, eqvClass ); 114 env.push_back( std::move(eqvClass) ); 108 115 } 109 116 -
src/ResolvExpr/TypeEnvironment.h
r75308bcc r8e18b8e 85 85 class TypeEnvironment { 86 86 public: 87 bool lookup( const std::string &var, EqvClass &eqvClass) const;87 const EqvClass* lookup( const std::string &var ) const; 88 88 void add( const EqvClass &eqvClass ); 89 void add( EqvClass &&eqvClass ); 89 90 void add( const Type::ForallList &tyDecls ); 90 91 void add( const TypeSubstitution & sub ); -
src/ResolvExpr/Unify.cc
r75308bcc r8e18b8e 19 19 #include <set> // for set 20 20 #include <string> // for string, operator==, operator!=, bas... 21 #include <utility> // for pair 21 #include <utility> // for pair, move 22 22 23 23 #include "Common/PassVisitor.h" // for PassVisitor … … 159 159 return false; 160 160 } // if 161 EqvClass curClass; 162 if ( env.lookup( typeInst->get_name(), curClass ) ) { 163 if ( curClass.type ) { 161 if ( const EqvClass *curClass = env.lookup( typeInst->get_name() ) ) { 162 if ( curClass->type ) { 164 163 Type *common = 0; 165 164 // attempt to unify equivalence class type (which has qualifiers stripped, so they must be restored) with the type to bind to 166 Type* newType = curClass .type->clone();165 Type* newType = curClass->type->clone(); 167 166 newType->get_qualifiers() = typeInst->get_qualifiers(); 168 if ( unifyInexact( newType, other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass .allowWidening, true ), indexer, common ) ) {167 if ( unifyInexact( newType, other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass->allowWidening, true ), indexer, common ) ) { 169 168 if ( common ) { 170 169 common->get_qualifiers() = Type::Qualifiers(); 171 curClass.type = common; 172 env.add( curClass ); 170 EqvClass newClass = *curClass; 171 newClass.type = common; 172 env.add( std::move(newClass) ); 173 173 } // if 174 174 return true; … … 177 177 } // if 178 178 } else { 179 curClass.type = other->clone(); 180 curClass.type->get_qualifiers() = Type::Qualifiers(); 181 curClass.allowWidening = widenMode.widenFirst && widenMode.widenSecond; 182 env.add( curClass ); 179 EqvClass newClass = *curClass; 180 newClass.type = other->clone(); 181 newClass.type->get_qualifiers() = Type::Qualifiers(); 182 newClass.allowWidening = widenMode.widenFirst && widenMode.widenSecond; 183 env.add( std::move(newClass) ); 183 184 } // if 184 185 } else { … … 196 197 bool bindVarToVar( TypeInstType *var1, TypeInstType *var2, const TypeDecl::Data & data, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widenMode, const SymTab::Indexer &indexer ) { 197 198 bool result = true; 198 EqvClass class1, class2;199 bool hasClass1 = false, hasClass2 = false;199 const EqvClass *class1 = env.lookup( var1->get_name() ); 200 const EqvClass *class2 = env.lookup( var2->get_name() ); 200 201 bool widen1 = false, widen2 = false; 201 Type *type1 = 0, *type2 = 0; 202 203 if ( env.lookup( var1->get_name(), class1 ) ) { 204 hasClass1 = true; 205 if ( class1.type ) { 206 if ( occurs( class1.type, var2->get_name(), env ) ) { 202 Type *type1 = nullptr, *type2 = nullptr; 203 204 if ( class1 ) { 205 if ( class1->type ) { 206 if ( occurs( class1->type, var2->get_name(), env ) ) { 207 207 return false; 208 208 } // if 209 type1 = class1.type->clone(); 210 } // if 211 widen1 = widenMode.widenFirst && class1.allowWidening; 212 } // if 213 if ( env.lookup( var2->get_name(), class2 ) ) { 214 hasClass2 = true; 215 if ( class2.type ) { 216 if ( occurs( class2.type, var1->get_name(), env ) ) { 209 type1 = class1->type->clone(); 210 } // if 211 widen1 = widenMode.widenFirst && class1->allowWidening; 212 } // if 213 if ( class2 ) { 214 if ( class2->type ) { 215 if ( occurs( class2->type, var1->get_name(), env ) ) { 217 216 return false; 218 217 } // if 219 type2 = class2 .type->clone();220 } // if 221 widen2 = widenMode.widenSecond && class2 .allowWidening;218 type2 = class2->type->clone(); 219 } // if 220 widen2 = widenMode.widenSecond && class2->allowWidening; 222 221 } // if 223 222 … … 227 226 Type *common = 0; 228 227 if ( unifyInexact( type1, type2, env, needAssertions, haveAssertions, openVars, newWidenMode, indexer, common ) ) { 229 class1.vars.insert( class2.vars.begin(), class2.vars.end() ); 230 class1.allowWidening = widen1 && widen2; 228 EqvClass newClass1 = *class1; 229 newClass1.vars.insert( class2->vars.begin(), class2->vars.end() ); 230 newClass1.allowWidening = widen1 && widen2; 231 231 if ( common ) { 232 232 common->get_qualifiers() = Type::Qualifiers(); 233 class1.type = common;233 newClass1.type = common; 234 234 } // if 235 env.add( class1);235 env.add( std::move(newClass1) ); 236 236 } else { 237 237 result = false; 238 238 } // if 239 } else if ( hasClass1 && hasClass2 ) {239 } else if ( class1 && class2 ) { 240 240 if ( type1 ) { 241 class1.vars.insert( class2.vars.begin(), class2.vars.end() ); 242 class1.allowWidening = widen1; 243 env.add( class1 ); 241 EqvClass newClass1 = *class1; 242 newClass1.vars.insert( class2->vars.begin(), class2->vars.end() ); 243 newClass1.allowWidening = widen1; 244 env.add( std::move(newClass1) ); 244 245 } else { 245 class2.vars.insert( class1.vars.begin(), class1.vars.end() ); 246 class2.allowWidening = widen2; 247 env.add( class2 ); 248 } // if 249 } else if ( hasClass1 ) { 250 class1.vars.insert( var2->get_name() ); 251 class1.allowWidening = widen1; 252 env.add( class1 ); 253 } else if ( hasClass2 ) { 254 class2.vars.insert( var1->get_name() ); 255 class2.allowWidening = widen2; 256 env.add( class2 ); 246 EqvClass newClass2 = *class2; 247 newClass2.vars.insert( class1->vars.begin(), class1->vars.end() ); 248 newClass2.allowWidening = widen2; 249 env.add( std::move(newClass2) ); 250 } // if 251 } else if ( class1 ) { 252 EqvClass newClass1 = *class1; 253 newClass1.vars.insert( var2->get_name() ); 254 newClass1.allowWidening = widen1; 255 env.add( std::move(newClass1) ); 256 } else if ( class2 ) { 257 EqvClass newClass2 = *class2; 258 newClass2.vars.insert( var1->get_name() ); 259 newClass2.allowWidening = widen2; 260 env.add( std::move(newClass2) ); 257 261 } else { 258 262 EqvClass newClass; … … 521 525 void premutate( TypeInstType * ) { visit_children = false; } 522 526 Type * postmutate( TypeInstType * typeInst ) { 523 EqvClass eqvClass; 524 if ( tenv.lookup( typeInst->get_name(), eqvClass ) ) { 525 if ( eqvClass.data.kind == TypeDecl::Ttype ) { 526 // expand ttype parameter into its actual type 527 if ( eqvClass.type ) { 528 return eqvClass.type->clone(); 529 } 527 if ( const EqvClass *eqvClass = tenv.lookup( typeInst->get_name() ) ) { 528 // expand ttype parameter into its actual type 529 if ( eqvClass->data.kind == TypeDecl::Ttype && eqvClass->type ) { 530 return eqvClass->type->clone(); 530 531 } 531 532 }
Note: See TracChangeset
for help on using the changeset viewer.