Ignore:
Timestamp:
Dec 16, 2015, 3:21:05 PM (9 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
Children:
7754cde
Parents:
8360977
Message:

Added unfiltered version of isPoly{Type,Ptr}

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/GenPoly.cc

    r8360977 r0f889a77  
    6868
    6969        namespace {
    70                 /// Checks a parameter list for polymorphic parameters
     70                /// Checks a parameter list for polymorphic parameters; will substitute according to env if present
     71                bool hasPolyParams( std::list< Expression* >& params, 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(), env ) ) return true;
     76                        }
     77                        return false;
     78                }
     79
     80                /// Checks a parameter list for polymorphic parameters from tyVars; will substitute according to env if present
    7181                bool hasPolyParams( std::list< Expression* >& params, const TyVarMap &tyVars, const TypeSubstitution *env ) {
    7282                        for ( std::list< Expression* >::iterator param = params.begin(); param != params.end(); ++param ) {
     
    7888                }
    7989        }
     90
     91        Type *isPolyType( Type *type, const TypeSubstitution *env ) {
     92                if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) {
     93                        if ( env ) {
     94                                if ( Type *newType = env->lookup( typeInst->get_name() ) ) {
     95                                        return isPolyType( newType, env );
     96                                } // if
     97                        } // if
     98                        return type;
     99                } else if ( StructInstType *structType = dynamic_cast< StructInstType* >( type ) ) {
     100                        if ( hasPolyParams( structType->get_parameters(), env ) ) return type;
     101                } else if ( UnionInstType *unionType = dynamic_cast< UnionInstType* >( type ) ) {
     102                        if ( hasPolyParams( unionType->get_parameters(), env ) ) return type;
     103                }
     104                return 0;
     105        }
    80106       
    81107        Type *isPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) {
     
    84110                                if ( Type *newType = env->lookup( typeInst->get_name() ) ) {
    85111                                        return isPolyType( newType, tyVars, env );
     112                                } // if
    86113                        } // if
    87                 } // if
    88114                        if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) {
    89115                                return type;
    90         }
     116                        }
    91117                } else if ( StructInstType *structType = dynamic_cast< StructInstType* >( type ) ) {
    92118                        if ( hasPolyParams( structType->get_parameters(), tyVars, env ) ) return type;
     
    97123        }
    98124
     125        Type *isPolyPtr( Type *type, const TypeSubstitution *env ) {
     126                if ( PointerType *ptr = dynamic_cast< PointerType *>( type ) ) {
     127                        return isPolyType( ptr->get_base(), env );
     128                } else if ( env ) {
     129                        if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( type ) ) {
     130                                if ( Type *newType = env->lookup( typeInst->get_name() ) ) {
     131                                        return isPolyPtr( newType, env );
     132                                } // if
     133                        } // if
     134                } // if
     135                return 0;
     136        }
     137       
    99138        Type *isPolyPtr( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) {
    100139                if ( PointerType *ptr = dynamic_cast< PointerType *>( type ) ) {
Note: See TracChangeset for help on using the changeset viewer.