- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/ConversionCost.cc
r5ccb10d r0c6596f 15 15 16 16 #include "ConversionCost.h" 17 #include "typeops.h" 18 #include "SynTree/Type.h" 19 #include "SynTree/Visitor.h" 20 #include "SymTab/Indexer.h" 17 18 #include <cassert> // for assert 19 #include <list> // for list, list<>::const_iterator 20 #include <string> // for operator==, string 21 22 #include "ResolvExpr/Cost.h" // for Cost 23 #include "ResolvExpr/TypeEnvironment.h" // for EqvClass, TypeEnvironment 24 #include "SymTab/Indexer.h" // for Indexer 25 #include "SynTree/Declaration.h" // for TypeDecl, NamedTypeDecl 26 #include "SynTree/Type.h" // for Type, BasicType, TypeInstType 27 #include "typeops.h" // for typesCompatibleIgnoreQualifiers 21 28 22 29 namespace ResolvExpr { … … 33 40 #define PRINT(x) 34 41 #endif 35 36 42 Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 37 43 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { … … 71 77 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) { 72 78 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 73 return convertToReferenceCost( src, refType, indexer, env ); 79 return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const TypeEnvironment & env, const SymTab::Indexer &){ 80 return ptrsAssignable( t1, t2, env ); 81 }); 74 82 } else { 75 83 ConversionCost converter( dest, indexer, env ); … … 83 91 } 84 92 85 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {93 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 86 94 PRINT( std::cerr << "convert to reference cost..." << std::endl; ) 87 95 if ( diff > 0 ) { 88 96 // TODO: document this 89 Cost cost = convertToReferenceCost( safe_dynamic_cast< ReferenceType * >( src )->get_base(), dest, diff-1, indexer, env );97 Cost cost = convertToReferenceCost( safe_dynamic_cast< ReferenceType * >( src )->get_base(), dest, diff-1, indexer, env, func ); 90 98 cost.incReference(); 91 99 return cost; 92 100 } else if ( diff < -1 ) { 93 101 // TODO: document this 94 Cost cost = convertToReferenceCost( src, safe_dynamic_cast< ReferenceType * >( dest )->get_base(), diff+1, indexer, env );102 Cost cost = convertToReferenceCost( src, safe_dynamic_cast< ReferenceType * >( dest )->get_base(), diff+1, indexer, env, func ); 95 103 cost.incReference(); 96 104 return cost; … … 103 111 return Cost::safe; 104 112 } else { // xxx - this discards reference qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right? 105 int assignResult = ptrsAssignable( srcAsRef->get_base(), destAsRef->get_base(), env);113 int assignResult = func( srcAsRef->get_base(), destAsRef->get_base(), env, indexer ); 106 114 PRINT( std::cerr << "comparing references: " << assignResult << " " << srcAsRef << " " << destAsRef << std::endl; ) 107 115 if ( assignResult < 0 ) { … … 150 158 } 151 159 152 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {160 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 153 161 int sdepth = src->referenceDepth(), ddepth = dest->referenceDepth(); 154 return convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env );162 return convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env, func ); 155 163 } 156 164
Note: See TracChangeset
for help on using the changeset viewer.