Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/GenPoly.cc

    rcf16f94 rffad73a  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Dec  1 15:18:54 2015
    13 // Update Count     : 12
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Nov 24 15:23:08 2015
     13// Update Count     : 11
    1414//
    1515
    1616#include "GenPoly.h"
     17
     18#include "SymTab/Mangler.h"
     19#include "SynTree/Expression.h"
    1720#include "SynTree/Type.h"
    1821
     
    2124
    2225namespace GenPoly {
    23         // A function needs an adapter if it returns a polymorphic value or if any of its parameters have polymorphic type
    2426        bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) {
    25                 if ( ! adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
     27                if ( ! adaptee->get_returnVals().empty() && isPolyType( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
    2628                        return true;
    2729                } // if
    2830                for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); innerArg != adaptee->get_parameters().end(); ++innerArg ) {
    29                         if ( isPolyVal( (*innerArg)->get_type(), tyVars ) ) {
     31                        if ( isPolyType( (*innerArg)->get_type(), tyVars ) ) {
    3032                                return true;
    3133                        } // if
     
    6567        }
    6668
    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
    6988                        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
    71107                        } // if
    72108                } // 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;
    84110        }
    85111
     
    90116                os << std::endl;
    91117        }
     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        }
    92126} // namespace GenPoly
    93127
Note: See TracChangeset for help on using the changeset viewer.