Changes in src/GenPoly/GenPoly.cc [cf16f94:ffad73a]
- File:
-
- 1 edited
-
src/GenPoly/GenPoly.cc (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/GenPoly.cc
rcf16f94 rffad73a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Dec 1 15:18:54201513 // Update Count : 1 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Nov 24 15:23:08 2015 13 // Update Count : 11 14 14 // 15 15 16 16 #include "GenPoly.h" 17 18 #include "SymTab/Mangler.h" 19 #include "SynTree/Expression.h" 17 20 #include "SynTree/Type.h" 18 21 … … 21 24 22 25 namespace GenPoly { 23 // A function needs an adapter if it returns a polymorphic value or if any of its parameters have polymorphic type24 26 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) { 25 if ( ! adaptee->get_returnVals().empty() && isPoly Val( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {27 if ( ! adaptee->get_returnVals().empty() && isPolyType( adaptee->get_returnVals().front()->get_type(), tyVars ) ) { 26 28 return true; 27 29 } // if 28 30 for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); innerArg != adaptee->get_parameters().end(); ++innerArg ) { 29 if ( isPoly Val( (*innerArg)->get_type(), tyVars ) ) {31 if ( isPolyType( (*innerArg)->get_type(), tyVars ) ) { 30 32 return true; 31 33 } // if … … 65 67 } 66 68 67 bool isPolyVal( Type *type, const TyVarMap &tyVars ) { 68 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) { 69 namespace { 70 /// Checks a parameter list for polymorphic parameters 71 bool hasPolyParams( std::list< Expression* >& params, const TyVarMap &tyVars, const TypeSubstitution *env ) { 72 for ( std::list< Expression* >::iterator param = params.begin(); param != params.end(); ++param ) { 73 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param ); 74 assert(paramType && "Aggregate parameters should be type expressions"); 75 if ( isPolyType( paramType->get_type(), tyVars, env ) ) return true; 76 } 77 return false; 78 } 79 } 80 81 Type *isPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) { 82 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( type ) ) { 83 if ( env ) { 84 if ( Type *newType = env->lookup( typeInst->get_name() ) ) { 85 return isPolyType( newType, tyVars, env ); 86 } // if 87 } // if 69 88 if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) { 70 return true; 89 return type; 90 } 91 } else if ( StructInstType *structType = dynamic_cast< StructInstType* >( type ) ) { 92 if ( hasPolyParams( structType->get_parameters(), tyVars, env ) ) return type; 93 } else if ( UnionInstType *unionType = dynamic_cast< UnionInstType* >( type ) ) { 94 if ( hasPolyParams( unionType->get_parameters(), tyVars, env ) ) return type; 95 } 96 return 0; 97 } 98 99 Type *isPolyPtr( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) { 100 if ( PointerType *ptr = dynamic_cast< PointerType *>( type ) ) { 101 return isPolyType( ptr->get_base(), tyVars, env ); 102 } else if ( env ) { 103 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( type ) ) { 104 if ( Type *newType = env->lookup( typeInst->get_name() ) ) { 105 return isPolyPtr( newType, tyVars, env ); 106 } // if 71 107 } // if 72 108 } // if 73 return false; 74 } 75 76 bool isPolyObj( Type *type, const TyVarMap &tyVars ) { 77 if ( isPolyVal( type, tyVars ) ) { 78 return true; 79 } else if ( PointerType *pt = dynamic_cast<PointerType*>( type ) ) { 80 return isPolyObj( pt->get_base(), tyVars ); 81 } else { 82 return false; 83 } 109 return 0; 84 110 } 85 111 … … 90 116 os << std::endl; 91 117 } 118 119 std::string sizeofName( Type *ty ) { 120 return std::string( "_sizeof_" ) + SymTab::Mangler::mangle( ty, false, false ); 121 } 122 123 std::string alignofName( Type *ty ) { 124 return std::string( "_alignof_" ) + SymTab::Mangler::mangle( ty, false, false ); 125 } 92 126 } // namespace GenPoly 93 127
Note:
See TracChangeset
for help on using the changeset viewer.