Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/GenPoly.cc

    re56cfdb0 r843054c2  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Nov 19 17:23:44 2015
    13 // Update Count     : 10
     12// Last Modified On : Tue May 19 07:37:46 2015
     13// Update Count     : 1
    1414//
    1515
     
    2121
    2222namespace GenPoly {
    23         // A function needs an adapter if it returns a polymorphic value or if any of its
    24         // parameters have polymorphic type
    25         bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) {
    26                 if ( ! adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
    27                         return true;
    28                 } // if
    29                 for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); innerArg != adaptee->get_parameters().end(); ++innerArg ) {
    30                         if ( isPolyVal( (*innerArg)->get_type(), tyVars ) ) {
     23        // interface functions
     24        bool isPolyVal( Type *type, const TyVarMap &tyVars ) {
     25                return isPolyVal( type, tyVars, false );
     26        }
     27
     28        bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) { 
     29                return needsAdapter( adaptee, tyVars, false );
     30        }
     31
     32        bool isPolyVal( Type *type, const TyVarMap &tyVars, bool considerAllTyVars ) {
     33                if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( type ) ) {
     34                        if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) {
    3135                                return true;
    3236                        } // if
    33                 } // for
     37                        return considerAllTyVars;
     38                } // if
    3439                return false;
    3540        }
    3641
    37         bool isPolyRet( FunctionType *function, std::string &name, const TyVarMap &otherTyVars ) {
    38                 bool doTransform = false;
    39                 if ( ! function->get_returnVals().empty() ) {
    40                         if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( function->get_returnVals().front()->get_type() ) ) {
    41        
    42                                 // figure out if the return type is specified by a type parameter
    43                                 for ( std::list< TypeDecl *>::const_iterator tyVar = function->get_forall().begin(); tyVar != function->get_forall().end(); ++tyVar ) {
    44                                         if ( (*tyVar)->get_name() == typeInst->get_name() ) {
    45                                                 doTransform = true;
    46                                                 name = typeInst->get_name();
    47                                                 break;
    48                                         } // if
    49                                 } // for
    50                                 if ( ! doTransform && otherTyVars.find( typeInst->get_name() ) != otherTyVars.end() ) {
    51                                         doTransform = true;
    52                                 } // if
     42        // A function needs an adapter if it returns a polymorphic value or if any of its
     43        // parameters have polymorphic type
     44        bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars, bool considerAllTyVars ) {
     45                bool needsAdapter = false;
     46                if ( ! adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars, considerAllTyVars ) ) {
     47                        needsAdapter = true;
     48                } // if
     49                for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); ! needsAdapter && innerArg != adaptee->get_parameters().end(); ++innerArg ) {
     50                        if ( isPolyVal( (*innerArg)->get_type(), tyVars, considerAllTyVars ) ) {
     51                                needsAdapter = true;
    5352                        } // if
    54                 } // if
    55                 return doTransform;
    56         }
    57 
    58         bool isPolyRet( FunctionType *function, std::string &name ) {
    59                 TyVarMap dummyTyVars;
    60                 return isPolyRet( function, name, dummyTyVars );
    61         }
    62 
    63         bool isPolyRet( FunctionType *function, const TyVarMap &otherTyVars ) {
    64                 std::string dummyString;
    65                 return isPolyRet( function, dummyString, otherTyVars );
    66         }
    67 
    68         bool isPolyVal( Type *type, const TyVarMap &tyVars ) {
    69                 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) {
    70                         if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) {
    71                                 return true;
    72                         } // if
    73                 } // if
    74                 return false;
     53                } // for
     54                return needsAdapter;
    7555        }
    7656
Note: See TracChangeset for help on using the changeset viewer.