Ignore:
Timestamp:
Sep 22, 2016, 8:14:56 AM (7 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:
ac9ca96
Parents:
1132b62
git-author:
Rob Schluntz <rschlunt@…> (09/21/16 23:43:37)
git-committer:
Rob Schluntz <rschlunt@…> (09/22/16 08:14:56)
Message:

replace multiple-returning functions with tuple-returning functions, implement tuple ctor/dtor, allow N-arg tuple assignment

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/Tuples.h

    r1132b62 r65660bd  
    1515
    1616#ifndef _TUPLES_H_
    17 #define _TUPLE_H_
     17#define _TUPLES_H_
    1818
    1919#include <string>
     
    2727namespace Tuples {
    2828        // TupleAssignment.cc
    29         void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * assign, std::list<ResolvExpr::AltList> & possibilities );
     29        void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * assign, const std::list<ResolvExpr::AltList> & possibilities );
    3030
    3131        // TupleExpansion.cc
     
    3434  void expandUniqueExpr( std::list< Declaration * > & translationUnit );
    3535
    36   TupleType * makeTupleType( const std::list< Expression * > & exprs );
     36  /// returns VoidType if any of the expressions have Voidtype, otherwise TupleType of the Expression result types
     37  Type * makeTupleType( const std::list< Expression * > & exprs );
     38
     39  bool maybeImpure( Expression * expr );
     40
     41
     42        /// helper function used by explode
     43        template< typename OutputIterator >
     44        void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, OutputIterator out ) {
     45                Type * res = expr->get_result();
     46                if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) {
     47                        ResolvExpr::AltList alts;
     48                        explodeUnique( addrExpr->get_arg(), alt, back_inserter( alts ) );
     49                        for ( ResolvExpr::Alternative & alt : alts ) {
     50                                // distribute '&' over all components
     51                                alt.expr = new AddressExpr( alt.expr );
     52                                *out++ = alt;
     53                        }
     54                } else if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
     55                        if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) {
     56                                // can open tuple expr and dump its exploded components
     57                                for ( Expression * expr : tupleExpr->get_exprs() ) {
     58                                        explodeUnique( expr, alt, out );
     59                                }
     60                        } else {
     61                                // tuple type, but not tuple expr - recursively index into its components
     62                                Expression * arg = expr->clone();
     63                                if ( Tuples::maybeImpure( arg ) ) {
     64                                        // expressions which may contain side effects require a single unique instance of the expression
     65                                        arg = new UniqueExpr( arg );
     66                                }
     67                                for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
     68                                        TupleIndexExpr * idx = new TupleIndexExpr( arg->clone(), i );
     69                                        explodeUnique( idx, alt, out );
     70                                        delete idx;
     71                                }
     72                                delete arg;
     73                        }
     74                } else {
     75                        // atomic (non-tuple) type - output a clone of the expression in a new alternative
     76                        *out++ = ResolvExpr::Alternative( expr->clone(), alt.env, alt.cost, alt.cvtCost );
     77                }
     78        }
     79
     80        /// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type
     81        template< typename OutputIterator >
     82        void explode( const ResolvExpr::Alternative &alt, OutputIterator out ) {
     83                explodeUnique( alt.expr, alt, out );
     84        }
     85
     86        // explode list of alternatives
     87        template< typename AltIterator, typename OutputIterator >
     88        void explode( AltIterator altBegin, AltIterator altEnd, OutputIterator out ) {
     89                for ( ; altBegin != altEnd; ++altBegin ) {
     90                        explode( *altBegin, out );
     91                }
     92        }
     93
     94        template< typename OutputIterator >
     95        void explode( const ResolvExpr::AltList & alts, OutputIterator out ) {
     96                explode( alts.begin(), alts.end(), out );
     97        }
    3798} // namespace Tuples
    3899
Note: See TracChangeset for help on using the changeset viewer.