Changes in src/ResolvExpr/CastCost.cc [bd0b6b62:150ec33]
- File:
-
- 1 edited
-
src/ResolvExpr/CastCost.cc (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CastCost.cc
rbd0b6b62 r150ec33 31 31 32 32 namespace ResolvExpr { 33 structCastCost : public ConversionCost {33 class CastCost : public ConversionCost { 34 34 public: 35 CastCost( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env , CostFunction costFunc);35 CastCost( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ); 36 36 37 using ConversionCost::previsit; 38 using ConversionCost::postvisit; 39 void postvisit( BasicType * basicType ); 40 void postvisit( PointerType * pointerType ); 37 virtual void visit( BasicType *basicType ); 38 virtual void visit( PointerType *pointerType ); 41 39 }; 42 40 … … 54 52 // all typedefs should be gone by this point 55 53 TypeDecl *type = strict_dynamic_cast< TypeDecl* >( namedType ); 56 if ( type-> base) {57 return castCost( src, type-> base, indexer, env ) + Cost::safe;54 if ( type->get_base() ) { 55 return castCost( src, type->get_base(), indexer, env ) + Cost::safe; 58 56 } // if 59 57 } // if … … 76 74 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) { 77 75 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 78 return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env) {76 return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const TypeEnvironment & env, const SymTab::Indexer & indexer) { 79 77 return ptrsCastable( t1, t2, env, indexer ); 80 78 }); 81 79 } else { 82 PassVisitor<CastCost> converter( dest, indexer, env, castCost);80 CastCost converter( dest, indexer, env ); 83 81 src->accept( converter ); 84 if ( converter. pass.get_cost() == Cost::infinity ) {82 if ( converter.get_cost() == Cost::infinity ) { 85 83 return Cost::infinity; 86 84 } else { 87 85 // xxx - why are we adding cost 0 here? 88 return converter. pass.get_cost() + Cost::zero;86 return converter.get_cost() + Cost::zero; 89 87 } // if 90 88 } // if 91 89 } 92 90 93 CastCost::CastCost( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env , CostFunction costFunc)94 : ConversionCost( dest, indexer, env , costFunc) {91 CastCost::CastCost( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) 92 : ConversionCost( dest, indexer, env ) { 95 93 } 96 94 97 void CastCost:: postvisit( BasicType *basicType ) {95 void CastCost::visit( BasicType *basicType ) { 98 96 PointerType *destAsPointer = dynamic_cast< PointerType* >( dest ); 99 97 if ( destAsPointer && basicType->isInteger() ) { … … 105 103 } 106 104 107 void CastCost:: postvisit( PointerType *pointerType ) {105 void CastCost::visit( PointerType *pointerType ) { 108 106 if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) { 109 if ( pointerType->get_qualifiers() <= destAsPtr->get_qualifiers() && typesCompatibleIgnoreQualifiers( pointerType-> base, destAsPtr->base, indexer, env ) ) {107 if ( pointerType->get_qualifiers() <= destAsPtr->get_qualifiers() && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) { 110 108 cost = Cost::safe; 111 109 } else { 112 110 TypeEnvironment newEnv( env ); 113 newEnv.add( pointerType-> forall);114 newEnv.add( pointerType-> base->forall);115 int castResult = ptrsCastable( pointerType-> base, destAsPtr->base, newEnv, indexer );111 newEnv.add( pointerType->get_forall() ); 112 newEnv.add( pointerType->get_base()->get_forall() ); 113 int castResult = ptrsCastable( pointerType->get_base(), destAsPtr->get_base(), newEnv, indexer ); 116 114 if ( castResult > 0 ) { 117 115 cost = Cost::safe;
Note:
See TracChangeset
for help on using the changeset viewer.