Ignore:
Timestamp:
Oct 18, 2016, 4:23:04 PM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
f0121d7
Parents:
848ce71
Message:

implement transformation for MemberTupleExprs?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleExpansion.cc

    r848ce71 rbf32bb8  
    3131namespace Tuples {
    3232        namespace {
     33                class MemberTupleExpander : public Mutator {
     34                public:
     35                        typedef Mutator Parent;
     36                        virtual Expression * mutate( UntypedMemberExpr * memberExpr );
     37                };
     38
    3339                class UniqueExprExpander : public GenPoly::DeclMutator {
    3440                public:
    3541                        typedef GenPoly::DeclMutator Parent;
    3642                        virtual Expression * mutate( UniqueExpr * unqExpr );
    37                         std::map< Expression *, ObjectDecl * > decls;
     43                        std::map< int, ObjectDecl * > decls; // not vector, because order added may not be increasing order
    3844                };
    3945
     
    7379        }
    7480
     81        void expandMemberTuples( std::list< Declaration * > & translationUnit ) {
     82                MemberTupleExpander expander;
     83                mutateAll( translationUnit, expander );
     84        }
     85
    7586        void expandUniqueExpr( std::list< Declaration * > & translationUnit ) {
    7687                UniqueExprExpander unqExpander;
     
    92103        }
    93104
     105        namespace {
     106                /// given a expression representing the member and an expression representing the aggregate,
     107                /// reconstructs a flattened UntypedMemberExpr with the right precedence
     108                Expression * reconstructMemberExpr( Expression * member, UniqueExpr * aggr ) {
     109                        if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * >( member ) ) {
     110                                // construct a new UntypedMemberExpr with the correct structure , and recursively
     111                                // expand that member expression.
     112                                MemberTupleExpander expander;
     113                                UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() ) );
     114
     115                                memberExpr->set_member(nullptr);
     116                                memberExpr->set_aggregate(nullptr);
     117                                delete memberExpr;
     118                                return newMemberExpr->acceptMutator( expander );
     119                        } else {
     120                                // not a member expression, so there is nothing to do but attach and return
     121                                return new UntypedMemberExpr( member, aggr->clone() );
     122                        }
     123                }
     124        }
     125
     126        Expression * MemberTupleExpander::mutate( UntypedMemberExpr * memberExpr ) {
     127                if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( memberExpr->get_member() ) ) {
     128                        UniqueExpr * unqExpr = new UniqueExpr( memberExpr->get_aggregate()->clone() );
     129                        for ( Expression *& expr : tupleExpr->get_exprs() ) {
     130                                expr = reconstructMemberExpr( expr, unqExpr );
     131                        }
     132                        delete unqExpr;
     133                        return tupleExpr;
     134                } else {
     135                        return memberExpr;
     136                }
     137        }
     138
    94139        Expression * UniqueExprExpander::mutate( UniqueExpr * unqExpr ) {
    95140                static UniqueName tempNamer( "_unq_expr_" );
    96141                unqExpr = safe_dynamic_cast< UniqueExpr * > ( Parent::mutate( unqExpr ) );
    97                 if ( ! decls.count( unqExpr->get_expr() ) ) {
     142                if ( ! decls.count( unqExpr->get_id() ) ) {
    98143                        // xxx - it's possible (likely?) that expressions can appear in the wrong order because of this. Need to ensure they're placed in the correct location.
     144                        // xxx - is it possible to make the decl's type const?
    99145                        ObjectDecl * decl = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, unqExpr->get_result()->clone(), new SingleInit( unqExpr->get_expr()->clone() ) );
    100                         decls[unqExpr->get_expr()] = decl;
     146                        decls[unqExpr->get_id()] = decl;
    101147                        addDeclaration( decl );
    102148                }
    103                 return new VariableExpr( decls[unqExpr->get_expr()] );
     149                return new VariableExpr( decls[unqExpr->get_id()] );
    104150        }
    105151
     
    176222
    177223        Expression * TupleExprExpander::mutate( TupleExpr * tupleExpr ) {
     224                // recursively expand sub-tuple-expressions
     225                tupleExpr = safe_dynamic_cast<TupleExpr *>(Parent::mutate(tupleExpr));
    178226                Type * result = tupleExpr->get_result();
    179227                std::list< Expression * > exprs = tupleExpr->get_exprs();
    180228                assert( result );
    181229
     230                // remove data from shell and delete it
    182231                tupleExpr->set_result( nullptr );
    183232                tupleExpr->get_exprs().clear();
Note: See TracChangeset for help on using the changeset viewer.