Ignore:
Timestamp:
Sep 4, 2020, 2:14:10 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
14d8a9b
Parents:
56c44dc (diff), 2801829 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Pass.impl.hpp

    r56c44dc rce55a81  
    5757
    5858namespace ast {
     59        template<typename node_t>
     60        node_t * shallowCopy( const node_t * node );
     61
    5962        namespace __pass {
    6063                // Check if this is either a null pointer or a pointer to an empty container
     
    6265                static inline bool empty( T * ptr ) {
    6366                        return !ptr || ptr->empty();
     67                }
     68
     69                template< typename core_t, typename node_t >
     70                static inline node_t* mutate(const node_t *node) {
     71                        return std::is_base_of<PureVisitor, core_t>::value ? ::ast::shallowCopy(node) : ::ast::mutate(node);
    6472                }
    6573
     
    320328
    321329                if( __pass::differs(old_val, new_val) ) {
    322                         auto new_parent = mutate(parent);
     330                        auto new_parent = __pass::mutate<core_t>(parent);
    323331                        new_parent->*child = new_val;
    324332                        parent = new_parent;
     
    334342                        if ( node->forall.empty() ) return;
    335343
    336                         node_t * mut = mutate( node );
     344                        node_t * mut = __pass::mutate<core_t>( node );
    337345                        mut->forall = subs->clone( node->forall, *this );
    338346                        node = mut;
     
    894902
    895903                if(mutated) {
    896                         auto n = mutate(node);
     904                        auto n = __pass::mutate<core_t>(node);
    897905                        n->clauses = std::move( new_clauses );
    898906                        node = n;
     
    904912                        auto nval = call_accept( node->field ); \
    905913                        if(nval != node->field ) { \
    906                                 auto nparent = mutate(node); \
     914                                auto nparent = __pass::mutate<core_t>(node); \
    907915                                nparent->field = nval; \
    908916                                node = nparent; \
     
    16101618
    16111619                if(mutated) {
    1612                         auto n = mutate(node);
     1620                        auto n = __pass::mutate<core_t>(node);
    16131621                        n->associations = std::move( new_kids );
    16141622                        node = n;
     
    19401948                        }
    19411949                        if (mutated) {
    1942                                 auto new_node = mutate( node );
     1950                                auto new_node = __pass::mutate<core_t>( node );
    19431951                                new_node->typeEnv.swap( new_map );
    19441952                                node = new_node;
     
    19561964                        }
    19571965                        if (mutated) {
    1958                                 auto new_node = mutate( node );
     1966                                auto new_node = __pass::mutate<core_t>( node );
    19591967                                new_node->varEnv.swap( new_map );
    19601968                                node = new_node;
Note: See TracChangeset for help on using the changeset viewer.