Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/FindFunction.cc

    rc97b448 r4da152a  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Oct  7 17:05:20 2022
    13 // Update Count     : 7
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Fri Feb 05 12:22:20 2016
     13// Update Count     : 6
    1414//
    1515
     
    1818#include <utility>                      // for pair
    1919
    20 #include "AST/Pass.hpp"                 // for Pass
    21 #include "AST/Type.hpp"
    2220#include "Common/PassVisitor.h"         // for PassVisitor
    2321#include "GenPoly/ErasableScopedMap.h"  // for ErasableScopedMap<>::iterator
     
    9189                handleForall( pointerType->get_forall() );
    9290        }
    93 
    94 namespace {
    95 
    96 struct FindFunctionCore :
    97                 public ast::WithGuards,
    98                 public ast::WithShortCircuiting,
    99                 public ast::WithVisitorRef<FindFunctionCore> {
    100         FindFunctionCore(
    101                 std::vector<ast::ptr<ast::FunctionType>> & functions,
    102                 const TypeVarMap & typeVars, FindFunctionPred predicate,
    103                 bool replaceMode );
    104 
    105         void previsit( ast::FunctionType const * type );
    106         ast::Type const * postvisit( ast::FunctionType const * type );
    107         void previsit( ast::PointerType const * type );
    108 private:
    109         void handleForall( const ast::FunctionType::ForallList & forall );
    110 
    111         std::vector<ast::ptr<ast::FunctionType>> &functions;
    112         TypeVarMap typeVars;
    113         FindFunctionPred predicate;
    114         bool replaceMode;
    115 };
    116 
    117 FindFunctionCore::FindFunctionCore(
    118                 std::vector<ast::ptr<ast::FunctionType>> & functions,
    119                 const TypeVarMap &typeVars, FindFunctionPred predicate,
    120                 bool replaceMode ) :
    121         functions( functions ), typeVars( typeVars ),
    122         predicate( predicate ), replaceMode( replaceMode ) {}
    123 
    124 void FindFunctionCore::handleForall( const ast::FunctionType::ForallList & forall ) {
    125         for ( const ast::ptr<ast::TypeInstType> & td : forall ) {
    126                 TypeVarMap::iterator var = typeVars.find( *td );
    127                 if ( var != typeVars.end() ) {
    128                         typeVars.erase( var->first );
    129                 } // if
    130         } // for
    131 }
    132 
    133 void FindFunctionCore::previsit( ast::FunctionType const * type ) {
    134         visit_children = false;
    135         GuardScope( typeVars );
    136         handleForall( type->forall );
    137         //ast::accept_all( type->returns, *visitor );
    138         // This might have to become ast::mutate_each with return.
    139         ast::accept_each( type->returns, *visitor );
    140 }
    141 
    142 ast::Type const * FindFunctionCore::postvisit( ast::FunctionType const * type ) {
    143         ast::Type const * ret = type;
    144         if ( predicate( type, typeVars ) ) {
    145                 functions.push_back( type );
    146                 if ( replaceMode ) {
    147                         // replace type parameters in function type with void*
    148                         ret = scrubTypeVars( ast::deepCopy( type ), typeVars );
    149                 } // if
    150         } // if
    151         return ret;
    152 }
    153 
    154 void FindFunctionCore::previsit( ast::PointerType const * /*type*/ ) {
    155         GuardScope( typeVars );
    156         //handleForall( type->forall );
    157 }
    158 
    159 } // namespace
    160 
    161 void findFunction( const ast::Type * type,
    162                 std::vector<ast::ptr<ast::FunctionType>> & functions,
    163                 const TypeVarMap & typeVars, FindFunctionPred predicate ) {
    164         ast::Pass<FindFunctionCore> pass( functions, typeVars, predicate, false );
    165         type->accept( pass );
    166         //(void)type;
    167         //(void)functions;
    168         //(void)typeVars;
    169         //(void)predicate;
    170 }
    171 
    172 const ast::Type * findAndReplaceFunction( const ast::Type * type,
    173                 std::vector<ast::ptr<ast::FunctionType>> & functions,
    174                 const TypeVarMap & typeVars, FindFunctionPred predicate ) {
    175         ast::Pass<FindFunctionCore> pass( functions, typeVars, predicate, true );
    176         return type->accept( pass );
    177         //(void)functions;
    178         //(void)typeVars;
    179         //(void)predicate;
    180         //return type;
    181 }
    182 
    18391} // namespace GenPoly
    18492
Note: See TracChangeset for help on using the changeset viewer.