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?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.