Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/Tuples.cc

    rc6b4432 re01eb4a  
    1919#include "AST/Inspect.hpp"
    2020#include "AST/LinkageSpec.hpp"
     21#include "Common/PassVisitor.h"
    2122#include "InitTweak/InitTweak.h"
    2223
     
    2425
    2526namespace {
     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        }
    2675
    2776        /// Determines if impurity (read: side-effects) may exist in a piece of code. Currently gives
     
    61110}
    62111
     112bool maybeImpure( const Expression * expr ) {
     113        return detectImpurity( expr, false );
     114}
     115
     116bool maybeImpureIgnoreUnique( const Expression * expr ) {
     117        return detectImpurity( expr, true );
     118}
     119
    63120} // namespace Tuples
    64121
Note: See TracChangeset for help on using the changeset viewer.