Changes in src/Tuples/Tuples.cc [c6b4432:e01eb4a]
- File:
-
- 1 edited
-
src/Tuples/Tuples.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/Tuples.cc
rc6b4432 re01eb4a 19 19 #include "AST/Inspect.hpp" 20 20 #include "AST/LinkageSpec.hpp" 21 #include "Common/PassVisitor.h" 21 22 #include "InitTweak/InitTweak.h" 22 23 … … 24 25 25 26 namespace { 27 /// Checks if impurity (read: side-effects) may exist in a piece of code. 28 /// Currently gives a very crude approximation, wherein any function 29 /// call expression means the code may be impure. 30 struct ImpurityDetector_old : public WithShortCircuiting { 31 bool const ignoreUnique; 32 bool maybeImpure; 33 34 ImpurityDetector_old( bool ignoreUnique ) : 35 ignoreUnique( ignoreUnique ), maybeImpure( false ) 36 {} 37 38 void previsit( const ApplicationExpr * appExpr ) { 39 visit_children = false; 40 if ( const DeclarationWithType * function = 41 InitTweak::getFunction( appExpr ) ) { 42 if ( function->linkage == LinkageSpec::Intrinsic ) { 43 if ( function->name == "*?" || function->name == "?[?]" ) { 44 // intrinsic dereference, subscript are pure, 45 // but need to recursively look for impurity 46 visit_children = true; 47 return; 48 } 49 } 50 } 51 maybeImpure = true; 52 } 53 54 void previsit( const UntypedExpr * ) { 55 maybeImpure = true; 56 visit_children = false; 57 } 58 59 void previsit( const UniqueExpr * ) { 60 if ( ignoreUnique ) { 61 // bottom out at unique expression. 62 // The existence of a unique expression doesn't change the purity of an expression. 63 // That is, even if the wrapped expression is impure, the wrapper protects the rest of the expression. 64 visit_children = false; 65 return; 66 } 67 } 68 }; 69 70 bool detectImpurity( const Expression * expr, bool ignoreUnique ) { 71 PassVisitor<ImpurityDetector_old> detector( ignoreUnique ); 72 expr->accept( detector ); 73 return detector.pass.maybeImpure; 74 } 26 75 27 76 /// Determines if impurity (read: side-effects) may exist in a piece of code. Currently gives … … 61 110 } 62 111 112 bool maybeImpure( const Expression * expr ) { 113 return detectImpurity( expr, false ); 114 } 115 116 bool maybeImpureIgnoreUnique( const Expression * expr ) { 117 return detectImpurity( expr, true ); 118 } 119 63 120 } // namespace Tuples 64 121
Note:
See TracChangeset
for help on using the changeset viewer.