Changeset 77971f6 for src/Tuples


Ignore:
Timestamp:
Oct 27, 2016, 3:24:02 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:
3f0c6a5
Parents:
a1e67dd
git-author:
Rob Schluntz <rschlunt@…> (10/27/16 15:11:00)
git-committer:
Rob Schluntz <rschlunt@…> (10/27/16 15:24:02)
Message:

resolve ctor/dtors for UniqueExprs?

Location:
src/Tuples
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleAssignment.cc

    ra1e67dd r77971f6  
    179179
    180180                // explode the lhs so that each field of the tuple-valued-expr is assigned.
    181                 explode( lhsAlt, back_inserter(lhs) );
     181                explode( lhsAlt, spotter.currentFinder.get_indexer(), back_inserter(lhs) );
    182182                // and finally, re-add the cast to each lhs expr, so that qualified tuple fields can be constructed
    183183                if ( isCast ) {
     
    204204        TupleAssignSpotter::MultipleAssignMatcher::MultipleAssignMatcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList & alts ) : Matcher( spotter, alts ) {
    205205                // explode the rhs so that each field of the tuple-valued-expr is assigned.
    206                 explode( std::next(alts.begin(), 1), alts.end(), back_inserter(rhs) );
     206                explode( std::next(alts.begin(), 1), alts.end(), spotter.currentFinder.get_indexer(), back_inserter(rhs) );
    207207        }
    208208
  • src/Tuples/TupleExpansion.cc

    ra1e67dd r77971f6  
    141141
    142142        Expression * UniqueExprExpander::mutate( UniqueExpr * unqExpr ) {
    143                 static UniqueName tempNamer( "_unq_expr_" );
    144143                unqExpr = safe_dynamic_cast< UniqueExpr * > ( Parent::mutate( unqExpr ) );
    145144                if ( ! decls.count( unqExpr->get_id() ) ) {
     
    160159                        // }
    161160
    162                         // xxx - attach a resolved ConstructorInit node?
    163                         // xxx - is it possible to make the objDecl's type const?
    164                         ObjectDecl * objDecl = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, unqExpr->get_result()->clone(), nullptr );
    165                         // must be done on two lines because genCtorInit accesses objDecl's fields
    166                         objDecl->set_init( InitTweak::genCtorInit( objDecl ) );
    167 
     161                        ObjectDecl * objDecl = unqExpr->get_object();
     162                        unqExpr->set_object( nullptr );
    168163                        decls[unqExpr->get_id()] = objDecl;
    169164                        addDeclaration( objDecl );
  • src/Tuples/Tuples.h

    ra1e67dd r77971f6  
    2020#include <vector>
    2121#include "ResolvExpr/AlternativeFinder.h"
     22#include "ResolvExpr/Resolver.h"
    2223
    2324#include "SynTree/Expression.h"
     
    4849        /// helper function used by explode
    4950        template< typename OutputIterator >
    50         void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, OutputIterator out ) {
     51        void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out ) {
    5152                Type * res = expr->get_result();
    5253                if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) {
    5354                        ResolvExpr::AltList alts;
    54                         explodeUnique( addrExpr->get_arg(), alt, back_inserter( alts ) );
     55                        explodeUnique( addrExpr->get_arg(), alt, indexer, back_inserter( alts ) );
    5556                        for ( ResolvExpr::Alternative & alt : alts ) {
    5657                                // distribute '&' over all components
     
    6263                                // can open tuple expr and dump its exploded components
    6364                                for ( Expression * expr : tupleExpr->get_exprs() ) {
    64                                         explodeUnique( expr, alt, out );
     65                                        explodeUnique( expr, alt, indexer, out );
    6566                                }
    6667                        } else {
     
    6869                                Expression * arg = expr->clone();
    6970                                if ( Tuples::maybeImpure( arg ) ) {
    70                                         // expressions which may contain side effects require a single unique instance of the expression
     71                                        // expressions which may contain side effects require a single unique instance of the expression.
     72                                        // resolve the UniqueExpr (which should be relatively cheap, since the argument is already resolved)
     73                                        // so that its accompanying object is properly constructed and destructed.
    7174                                        arg = new UniqueExpr( arg );
     75                                        arg = ResolvExpr::resolveInVoidContext( arg, indexer );
    7276                                }
    7377                                for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
    7478                                        TupleIndexExpr * idx = new TupleIndexExpr( arg->clone(), i );
    75                                         explodeUnique( idx, alt, out );
     79                                        explodeUnique( idx, alt, indexer, out );
    7680                                        delete idx;
    7781                                }
     
    8690        /// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type
    8791        template< typename OutputIterator >
    88         void explode( const ResolvExpr::Alternative &alt, OutputIterator out ) {
    89                 explodeUnique( alt.expr, alt, out );
     92        void explode( const ResolvExpr::Alternative &alt, const SymTab::Indexer & indexer, OutputIterator out ) {
     93                explodeUnique( alt.expr, alt, indexer, out );
    9094        }
    9195
    9296        // explode list of alternatives
    9397        template< typename AltIterator, typename OutputIterator >
    94         void explode( AltIterator altBegin, AltIterator altEnd, OutputIterator out ) {
     98        void explode( AltIterator altBegin, AltIterator altEnd, const SymTab::Indexer & indexer, OutputIterator out ) {
    9599                for ( ; altBegin != altEnd; ++altBegin ) {
    96                         explode( *altBegin, out );
     100                        explode( *altBegin, indexer, out );
    97101                }
    98102        }
    99103
    100104        template< typename OutputIterator >
    101         void explode( const ResolvExpr::AltList & alts, OutputIterator out ) {
    102                 explode( alts.begin(), alts.end(), out );
     105        void explode( const ResolvExpr::AltList & alts, const SymTab::Indexer & indexer, OutputIterator out ) {
     106                explode( alts.begin(), alts.end(), indexer, out );
    103107        }
    104108} // namespace Tuples
Note: See TracChangeset for help on using the changeset viewer.