Changes in src/GenPoly/FindFunction.cc [c97b448:4da152a]
- File:
-
- 1 edited
-
src/GenPoly/FindFunction.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/FindFunction.cc
rc97b448 r4da152a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri Oct 7 17:05:20 202213 // Update Count : 711 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri Feb 05 12:22:20 2016 13 // Update Count : 6 14 14 // 15 15 … … 18 18 #include <utility> // for pair 19 19 20 #include "AST/Pass.hpp" // for Pass21 #include "AST/Type.hpp"22 20 #include "Common/PassVisitor.h" // for PassVisitor 23 21 #include "GenPoly/ErasableScopedMap.h" // for ErasableScopedMap<>::iterator … … 91 89 handleForall( pointerType->get_forall() ); 92 90 } 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 } // if130 } // for131 }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 } // if150 } // if151 return ret;152 }153 154 void FindFunctionCore::previsit( ast::PointerType const * /*type*/ ) {155 GuardScope( typeVars );156 //handleForall( type->forall );157 }158 159 } // namespace160 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 183 91 } // namespace GenPoly 184 92
Note:
See TracChangeset
for help on using the changeset viewer.