Changeset bc92bee for src


Ignore:
Timestamp:
Jun 18, 2019, 9:44:23 AM (5 years ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
c8e4d2f8
Parents:
07ca4dd
Message:

Implemented Tuples::maybeImpure while it was fresh in my mind.

Location:
src/Tuples
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/Tuples.cc

    r07ca4dd rbc92bee  
    1010// Created On       : Mon Jun 17 14:41:00 2019
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jun 12 15:43:00 2019
    13 // Update Count     : 0
     12// Last Modified On : Tue Jun 18  9:31:00 2019
     13// Update Count     : 1
    1414//
    1515
     
    2727        /// impure.
    2828    struct ImpurityDetector : public ast::WithShortCircuiting {
    29                 ImpurityDetector( bool ignoreUnique ) : ignoreUnique( ignoreUnique ) {}
    3029                bool maybeImpure = false;
    31                 bool ignoreUnique;
    3230
    3331                void previsit( ast::ApplicationExpr const * appExpr ) {
    34                         visit_children = false;
    3532                        if ( ast::DeclWithType const * function = InitTweak::getFunction( appExpr ) ) {
    3633                                if ( function->linkage == ast::Linkage::Intrinsic
    3734                                                && ( function->name == "*?" || function->name == "?[?]" ) ) {
    38                                         visit_children = true;
    3935                                        return;
    4036                                }
    4137                        }
    42                         maybeImpure = true;
     38                        maybeImpure = true; visit_children = false;
    4339                }
    4440                void previsit( ast::UntypedExpr const * ) {
    4541                        maybeImpure = true; visit_children = false;
    4642                }
     43        };
     44        struct ImpurityDetectorIgnoreUnique : public ImpurityDetector {
    4745                void previsit( ast::UniqueExpr const * ) {
    48                         if ( ignoreUnique ) {
    49                                 visit_children = false;
    50                         }
     46                        visit_children = false;
    5147                }
    5248        };
    5349
    54         bool detectImpurity( const ast::Expr * expr, bool ignoreUnique ) {
    55                 ast::Pass<ImpurityDetector> detector( ignoreUnique );
     50        template<typename Detector>
     51        bool detectImpurity( const ast::Expr * expr ) {
     52                ast::Pass<Detector> detector;
    5653                expr->accept( detector );
    5754                return detector.pass.maybeImpure;
     
    5956} // namespace
    6057
     58bool maybeImpure( const ast::Expr * expr ) {
     59        return detectImpurity<ImpurityDetector>( expr );
     60}
     61
    6162bool maybeImpureIgnoreUnique( const ast::Expr * expr ) {
    62         return detectImpurity( expr, true );
     63        return detectImpurity<ImpurityDetectorIgnoreUnique>( expr );
    6364}
    6465
  • src/Tuples/Tuples.h

    r07ca4dd rbc92bee  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jun 12 10:39:00 2017
    13 // Update Count     : 17
     12// Last Modified On : Tue Jun 18 09:36:00 2019
     13// Update Count     : 18
    1414//
    1515
     
    5656        /// returns true if the expression may contain side-effects.
    5757        bool maybeImpure( Expression * expr );
     58        bool maybeImpure( const ast::Expr * expr );
    5859
    5960        /// Returns true if the expression may contain side-effect,
Note: See TracChangeset for help on using the changeset viewer.