Ignore:
Timestamp:
Aug 27, 2018, 4:40:34 PM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
b7c89aa
Parents:
f9feab8 (diff), 305581d (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' into cleanup-dtors

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleExpansion.cc

    rf9feab8 r90152a4  
    3030#include "SynTree/Type.h"         // for Type, Type::Qualifiers, TupleType
    3131#include "SynTree/Visitor.h"      // for Visitor
     32#include "Tuples.h"
    3233
    3334class CompoundStmt;
     
    3637namespace Tuples {
    3738        namespace {
    38                 struct MemberTupleExpander final : public Mutator {
    39                         typedef Mutator Parent;
    40                         using Parent::mutate;
    41 
    42                         virtual Expression * mutate( UntypedMemberExpr * memberExpr ) override;
     39                struct MemberTupleExpander final : public WithShortCircuiting, public WithVisitorRef<MemberTupleExpander> {
     40                        void premutate( UntypedMemberExpr * ) { visit_children = false; }
     41                        Expression * postmutate( UntypedMemberExpr * memberExpr );
    4342                };
    4443
     
    7978
    8079        void expandMemberTuples( std::list< Declaration * > & translationUnit ) {
    81                 MemberTupleExpander expander;
     80                PassVisitor<MemberTupleExpander> expander;
    8281                mutateAll( translationUnit, expander );
    8382        }
     
    109108                                // construct a new UntypedMemberExpr with the correct structure , and recursively
    110109                                // expand that member expression.
    111                                 MemberTupleExpander expander;
    112                                 UntypedMemberExpr * inner = new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() );
    113                                 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), inner );
     110                                PassVisitor<MemberTupleExpander> expander;
     111                                UntypedMemberExpr * inner = new UntypedMemberExpr( memberExpr->aggregate, aggr->clone() );
     112                                UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->member, inner );
    114113                                inner->location = newMemberExpr->location = loc;
    115                                 memberExpr->set_member(nullptr);
    116                                 memberExpr->set_aggregate(nullptr);
     114                                memberExpr->member = nullptr;
     115                                memberExpr->aggregate = nullptr;
    117116                                delete memberExpr;
    118117                                return newMemberExpr->acceptMutator( expander );
     
    126125        }
    127126
    128         Expression * MemberTupleExpander::mutate( UntypedMemberExpr * memberExpr ) {
    129                 if ( UntypedTupleExpr * tupleExpr = dynamic_cast< UntypedTupleExpr * > ( memberExpr->get_member() ) ) {
    130                         Expression * aggr = memberExpr->get_aggregate()->clone()->acceptMutator( *this );
     127        Expression * MemberTupleExpander::postmutate( UntypedMemberExpr * memberExpr ) {
     128                if ( UntypedTupleExpr * tupleExpr = dynamic_cast< UntypedTupleExpr * > ( memberExpr->member ) ) {
     129                        Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor );
    131130                        // aggregate expressions which might be impure must be wrapped in unique expressions
    132                         // xxx - if there's a member-tuple expression nested in the aggregate, this currently generates the wrong code if a UniqueExpr is not used, and it's purely an optimization to remove the UniqueExpr
    133                         // if ( Tuples::maybeImpureIgnoreUnique( memberExpr->get_aggregate() ) ) aggr = new UniqueExpr( aggr );
    134                         aggr = new UniqueExpr( aggr );
    135                         for ( Expression *& expr : tupleExpr->get_exprs() ) {
     131                        if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr );
     132                        for ( Expression *& expr : tupleExpr->exprs ) {
    136133                                expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
    137134                                expr->location = memberExpr->location;
     
    143140                        // there may be a tuple expr buried in the aggregate
    144141                        // xxx - this is a memory leak
    145                         UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member()->clone(), memberExpr->get_aggregate()->acceptMutator( *this ) );
     142                        UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->member->clone(), memberExpr->aggregate->acceptMutator( *visitor ) );
    146143                        newMemberExpr->location = memberExpr->location;
    147144                        return newMemberExpr;
     
    202199                        // generate struct type to replace tuple type based on the number of components in the tuple
    203200                        StructDecl * decl = new StructDecl( toString( "_tuple", tupleSize, "_" ) );
     201                        decl->location = tupleType->location;
    204202                        decl->set_body( true );
    205203                        for ( size_t i = 0; i < tupleSize; ++i ) {
     
    228226
    229227        Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) {
    230                 Expression * tuple = tupleExpr->get_tuple();
     228                Expression * tuple = tupleExpr->tuple;
    231229                assert( tuple );
    232                 tupleExpr->set_tuple( nullptr );
    233                 unsigned int idx = tupleExpr->get_index();
    234                 TypeSubstitution * env = tupleExpr->get_env();
    235                 tupleExpr->set_env( nullptr );
     230                tupleExpr->tuple = nullptr;
     231                unsigned int idx = tupleExpr->index;
     232                TypeSubstitution * env = tupleExpr->env;
     233                tupleExpr->env = nullptr;
    236234                delete tupleExpr;
    237235
    238                 StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->get_result() );
    239                 StructDecl * structDecl = type->get_baseStruct();
    240                 assert( structDecl->get_members().size() > idx );
    241                 Declaration * member = *std::next(structDecl->get_members().begin(), idx);
     236                if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( tuple ) ) {
     237                        if ( ! maybeImpureIgnoreUnique( tupleExpr ) ) {
     238                                // optimization: definitely pure tuple expr => can reduce to the only relevant component.
     239                                assert( tupleExpr->exprs.size() > idx );
     240                                Expression *& expr = *std::next(tupleExpr->exprs.begin(), idx);
     241                                Expression * ret = expr;
     242                                ret->env = env;
     243                                expr = nullptr; // remove from list so it can safely be deleted
     244                                delete tupleExpr;
     245                                return ret;
     246                        }
     247                }
     248
     249                StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->result );
     250                StructDecl * structDecl = type->baseStruct;
     251                assert( structDecl->members.size() > idx );
     252                Declaration * member = *std::next(structDecl->members.begin(), idx);
    242253                MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple );
    243                 memExpr->set_env( env );
     254                memExpr->env = env;
    244255                return memExpr;
    245256        }
Note: See TracChangeset for help on using the changeset viewer.