Changeset 3c13c03 for src/ResolvExpr


Ignore:
Timestamp:
Sep 17, 2016, 8:27:51 AM (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:
8c49c0e
Parents:
12bc63a
Message:

expand TupleExpr? and TupleIndexExpr?, add UniqueExpr?

Location:
src/ResolvExpr
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Alternative.cc

    r12bc63a r3c13c03  
    2020
    2121namespace ResolvExpr {
    22         Alternative::Alternative() : expr( 0 ) {}
     22        Alternative::Alternative() : cost( Cost::zero ), cvtCost( Cost::zero ), expr( 0 ) {}
    2323
    2424        Alternative::Alternative( Expression *expr, const TypeEnvironment &env, const Cost& cost )
  • src/ResolvExpr/Alternative.h

    r12bc63a r3c13c03  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Alternative.h -- 
     7// Alternative.h --
    88//
    99// Author           : Richard C. Bilson
     
    1212// Last Modified On : Sat May 16 23:54:39 2015
    1313// Update Count     : 2
    14 // 
     14//
    1515
    1616#ifndef ALTERNATIVE_H
     
    3333                Alternative &operator=( const Alternative &other );
    3434                ~Alternative();
    35  
     35
    3636                void initialize( const Alternative &src, Alternative &dest );
    37  
     37
    3838                void print( std::ostream &os, int indent = 0 ) const;
    39  
     39
    4040                Cost cost;
    4141                Cost cvtCost;
     
    4343                TypeEnvironment env;
    4444        };
     45
     46        /// helper function used by explode
     47        template< typename OutputIterator >
     48        void explodeUnique( Expression * expr, const Alternative & alt, OutputIterator out ) {
     49                Type * res = expr->get_result();
     50                if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
     51                        if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( alt.expr ) ) {
     52                                for ( Expression * expr : tupleExpr->get_exprs() ) {
     53                                        explodeUnique( expr, alt, out );
     54                                }
     55                        } else {
     56                                UniqueExpr * unq = new UniqueExpr( expr->clone() );
     57                                for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
     58                                        TupleIndexExpr * idx = new TupleIndexExpr( unq->clone(), i );
     59                                        explodeUnique( idx, alt, out );
     60                                        delete idx;
     61                                }
     62                                delete unq;
     63                        }
     64                } else {
     65                        *out++ = Alternative( expr->clone(), alt.env, alt.cost, alt.cvtCost );
     66                }
     67        }
     68
     69        /// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type
     70        template< typename OutputIterator >
     71        void explode( Alternative &alt, OutputIterator out ) {
     72                explodeUnique( alt.expr, alt, out );
     73        }
     74
     75        // explode list of alternatives
     76        template< typename OutputIterator >
     77        void explode( AltList & alts, OutputIterator out ) {
     78                for ( Alternative & alt : alts ) {
     79                        explode( alt, out );
     80                }
     81        }
    4582} // namespace ResolvExpr
    4683
  • src/ResolvExpr/AlternativeFinder.cc

    r12bc63a r3c13c03  
    380380
    381381                std::list< DeclarationWithType* >::iterator formal = formals.begin();
     382
     383                AltList newActuals;
     384                explode( actuals, back_inserter( newActuals ) );
    382385
    383386                std::list< Type * > formalTypes;
     
    994997                        TupleExpr *newExpr = new TupleExpr;
    995998                        makeExprList( *i, newExpr->get_exprs() );
    996                         TupleType *tupleType = new TupleType( Type::Qualifiers(true, true, true, true, true, true) );
    997                         Type::Qualifiers &qualifiers = tupleType->get_qualifiers();
    998                         for ( Expression * resultExpr : newExpr->get_exprs() ) {
    999                                 Type * type = resultExpr->get_result()->clone();
    1000                                 tupleType->get_types().push_back( type );
    1001                                 qualifiers &= type->get_qualifiers();
    1002                         } // for
    1003                         newExpr->set_result( tupleType );
     999                        newExpr->set_result( Tuples::makeTupleType( newExpr->get_exprs() ) );
    10041000
    10051001                        TypeEnvironment compositeEnv;
Note: See TracChangeset for help on using the changeset viewer.