Changeset 33a7b6d for src/GenPoly


Ignore:
Timestamp:
Nov 15, 2016, 5:30:52 PM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
d9fa60a
Parents:
8f9cc50
Message:

changed use of formal types to actual types for boxing return parameters and passing type variables, fix bug where generic struct's members would change types when a member is accessed on a concrete instantiation

Location:
src/GenPoly
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    r8f9cc50 r33a7b6d  
    12881288                        TyVarMap exprTyVars( (TypeDecl::Kind)-1 );
    12891289                        makeTyVarMap( function, exprTyVars );
     1290                        ReferenceToType *concRetType = dynamic_cast< ReferenceToType* >( appExpr->get_result() ); // xxx - is concRetType a good name?
    12901291                        ReferenceToType *dynRetType = isDynRet( function, exprTyVars );
    12911292
    12921293                        if ( dynRetType ) {
    1293                                 ret = addDynRetParam( appExpr, function, dynRetType, arg );
     1294                                ret = addDynRetParam( appExpr, function, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType
    12941295                        } else if ( needsAdapter( function, scopeTyVars ) ) {
    12951296                                // std::cerr << "needs adapter: ";
     
    13011302                        arg = appExpr->get_args().begin();
    13021303
    1303                         passTypeVars( appExpr, dynRetType, arg, exprTyVars );
     1304                        passTypeVars( appExpr, concRetType, arg, exprTyVars ); // xxx - used to use dynRetType instead of concRetType
    13041305                        addInferredParams( appExpr, function, arg, exprTyVars );
    13051306
     
    13641365                        // line below cloned from FixFunction.cc
    13651366                        // xxx - functionObj is never added to a list of declarations...
     1367                        // alternatively, this function could return a new VariableExpr( functionDecl ) and change the result type of the new expression
    13661368                        ObjectDecl *functionObj = new ObjectDecl( functionDecl->get_name(), functionDecl->get_storageClass(), functionDecl->get_linkage(), 0,
    13671369                                                                  new PointerType( Type::Qualifiers(), functionDecl->get_type()->clone() ), 0 );
  • src/GenPoly/GenPoly.cc

    r8f9cc50 r33a7b6d  
    9292        }
    9393
    94         Type *isDynType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) {
     94        ReferenceToType *isDynType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) {
    9595                type = replaceTypeInst( type, env );
    9696
     
    9898                        auto var = tyVars.find( typeInst->get_name() );
    9999                        if ( var != tyVars.end() && var->second == TypeDecl::Any ) {
    100                                 return type;
     100                                return typeInst;
    101101                        }
    102102                } else if ( StructInstType *structType = dynamic_cast< StructInstType* >( type ) ) {
    103                         if ( hasDynParams( structType->get_parameters(), tyVars, env ) ) return type;
     103                        if ( hasDynParams( structType->get_parameters(), tyVars, env ) ) return structType;
    104104                } else if ( UnionInstType *unionType = dynamic_cast< UnionInstType* >( type ) ) {
    105                         if ( hasDynParams( unionType->get_parameters(), tyVars, env ) ) return type;
     105                        if ( hasDynParams( unionType->get_parameters(), tyVars, env ) ) return unionType;
    106106                }
    107107                return 0;
  • src/GenPoly/GenPoly.h

    r8f9cc50 r33a7b6d  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // GenPoly.h -- 
     7// GenPoly.h --
    88//
    99// Author           : Richard C. Bilson
     
    3434        /// Replaces a TypeInstType by its referrent in the environment, if applicable
    3535        Type* replaceTypeInst( Type* type, const TypeSubstitution* env );
    36        
     36
    3737        /// returns polymorphic type if is polymorphic type, NULL otherwise; will look up substitution in env if provided
    3838        Type *isPolyType( Type *type, const TypeSubstitution *env = 0 );
    39        
     39
    4040        /// returns polymorphic type if is polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided
    4141        Type *isPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
    4242
    4343        /// returns dynamic-layout type if is dynamic-layout type in tyVars, NULL otherwise; will look up substitution in env if provided
    44         Type *isDynType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
     44        ReferenceToType *isDynType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
    4545
    4646        /// true iff function has dynamic-layout return type under the given type variable map
     
    5555        /// returns polymorphic type if is pointer to polymorphic type, NULL otherwise; will look up substitution in env if provided
    5656        Type *isPolyPtr( Type *type, const TypeSubstitution *env = 0 );
    57        
     57
    5858        /// returns polymorphic type if is pointer to polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided
    5959        Type *isPolyPtr( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
     
    7676        /// Adds the declarations in the forall list of type (and its pointed-to type if it's a pointer type) to `tyVarMap`
    7777        void makeTyVarMap( Type *type, TyVarMap &tyVarMap );
    78        
     78
    7979        /// Prints type variable map
    8080        void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap );
     
    8282        /// Gets the mangled name of this type; alias for SymTab::Mangler::mangleType().
    8383        inline std::string mangleType( Type *ty ) { return SymTab::Mangler::mangleType( ty ); }
    84        
     84
    8585        /// Gets the name of the sizeof parameter for the type, given its mangled name
    8686        inline std::string sizeofName( const std::string &name ) { return std::string( "_sizeof_" ) + name; }
     
    9494        /// Gets the name of the layout function for a given aggregate type, given its declaration
    9595        inline std::string layoutofName( AggregateDecl *decl ) { return std::string( "_layoutof_" ) + decl->get_name(); }
    96        
     96
    9797} // namespace GenPoly
    9898
Note: See TracChangeset for help on using the changeset viewer.