Changeset eba74ba for src/Tuples


Ignore:
Timestamp:
May 25, 2018, 2:51:06 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
new-env, with_gc
Children:
cdc4d43
Parents:
3ef35bd (diff), 58e822a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge remote-tracking branch 'origin/master' into with_gc

Location:
src/Tuples
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleAssignment.cc

    r3ef35bd reba74ba  
    154154                                                lhsAlt.expr = new CastExpr( lhsAlt.expr,
    155155                                                                new ReferenceType( Type::Qualifiers(),
    156                                                                         lhsAlt.expr->get_result()->clone() ) );
     156                                                                        lhsAlt.expr->result->clone() ) );
    157157                                        }
    158158
     
    231231
    232232                        ResolvExpr::AlternativeFinder finder{ currentFinder.get_indexer(),
    233                                 currentFinder.get_environ() };
     233                                matcher->compositeEnv };
     234
    234235                        try {
    235236                                finder.findWithAdjustment(*i);
     
    298299        ObjectDecl * TupleAssignSpotter::Matcher::newObject( UniqueName & namer, Expression * expr ) {
    299300                assert( expr->result && ! expr->get_result()->isVoid() );
    300                 ObjectDecl * ret = new ObjectDecl( namer.newName(), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, expr->get_result()->clone(), new SingleInit( expr->clone() ) );
     301                ObjectDecl * ret = new ObjectDecl( namer.newName(), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, expr->result->clone(), new SingleInit( expr->clone() ) );
    301302                // if expression type is a reference, don't need to construct anything, a simple initializer is sufficient.
    302                 if ( ! dynamic_cast< ReferenceType * >( expr->get_result() ) ) {
     303                if ( ! dynamic_cast< ReferenceType * >( expr->result ) ) {
    303304                        ConstructorInit * ctorInit = InitTweak::genCtorInit( ret );
    304305                        ret->init = ctorInit;
     
    318319                assert( (! lhs.empty() && rhs.size() <= 1) || (lhs.empty() && rhs.empty()) );
    319320
     321                // xxx - may need to split this up into multiple declarations, because potential conversion to references
     322                //  probably should not reference local variable - see MultipleAssignMatcher::match
    320323                ObjectDecl * rtmp = rhs.size() == 1 ? newObject( rhsNamer, rhs.front().expr ) : nullptr;
    321324                for ( ResolvExpr::Alternative & lhsAlt : lhs ) {
     
    336339                        std::list< ObjectDecl * > ltmp;
    337340                        std::list< ObjectDecl * > rtmp;
    338                         std::transform( lhs.begin(), lhs.end(), back_inserter( ltmp ), [&]( ResolvExpr::Alternative & alt ){
    339                                 return newObject( lhsNamer, alt.expr );
    340                         });
    341                         std::transform( rhs.begin(), rhs.end(), back_inserter( rtmp ), [&]( ResolvExpr::Alternative & alt ){
    342                                 return newObject( rhsNamer, alt.expr );
    343                         });
    344                         zipWith( ltmp.begin(), ltmp.end(), rtmp.begin(), rtmp.end(), back_inserter(out), [&](ObjectDecl * obj1, ObjectDecl * obj2 ) { return createFunc(spotter.fname, obj1, obj2); } );
     341                        for ( auto p : group_iterate( lhs, rhs ) ) {
     342                                ResolvExpr::Alternative & lhsAlt = std::get<0>(p);
     343                                ResolvExpr::Alternative & rhsAlt = std::get<1>(p);
     344                                // convert RHS to LHS type minus one reference -- important for the case where LHS is && and RHS is lvalue, etc.
     345                                ReferenceType * lhsType = strict_dynamic_cast<ReferenceType *>( lhsAlt.expr->result );
     346                                rhsAlt.expr = new CastExpr( rhsAlt.expr, lhsType->base->clone() );
     347                                ObjectDecl * lobj = newObject( lhsNamer, lhsAlt.expr );
     348                                ObjectDecl * robj = newObject( rhsNamer, rhsAlt.expr );
     349                                out.push_back( createFunc(spotter.fname, lobj, robj) );
     350                                ltmp.push_back( lobj );
     351                                rtmp.push_back( robj );
     352
     353                                // resolve the cast expression so that rhsAlt return type is bound by the cast type as needed, and transfer the resulting environment
     354                                ResolvExpr::AlternativeFinder finder{ spotter.currentFinder.get_indexer(), compositeEnv };
     355                                finder.findWithAdjustment( rhsAlt.expr );
     356                                assert( finder.get_alternatives().size() == 1 );
     357                                compositeEnv = std::move( finder.get_alternatives().front().env );
     358                        }
    345359                        tmpDecls.splice( tmpDecls.end(), ltmp );
    346360                        tmpDecls.splice( tmpDecls.end(), rtmp );
  • src/Tuples/TupleExpansion.cc

    r3ef35bd reba74ba  
    3030#include "SynTree/Type.h"         // for Type, Type::Qualifiers, TupleType
    3131#include "SynTree/Visitor.h"      // for Visitor
     32#include "Tuples.h"
    3233
    3334class CompoundStmt;
     
    119120                        Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor );
    120121                        // aggregate expressions which might be impure must be wrapped in unique expressions
    121                         // xxx - if there's a member-tuple expression nested in the aggregate, this currently generates the wrong code if a UniqueExpr is not used, and it's purely an optimization to remove the UniqueExpr
    122                         // if ( Tuples::maybeImpureIgnoreUnique( memberExpr->get_aggregate() ) ) aggr = new UniqueExpr( aggr );
    123                         aggr = new UniqueExpr( aggr );
     122                        if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr );
    124123                        for ( Expression *& expr : tupleExpr->exprs ) {
    125124                                expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
     
    214213
    215214        Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) {
    216                 Expression * tuple = tupleExpr->get_tuple();
     215                Expression * tuple = tupleExpr->tuple;
    217216                assert( tuple );
    218                 tupleExpr->set_tuple( nullptr );
    219                 unsigned int idx = tupleExpr->get_index();
    220                 TypeSubstitution * env = tupleExpr->get_env();
    221                 tupleExpr->set_env( nullptr );
    222 
    223                 StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->get_result() );
    224                 StructDecl * structDecl = type->get_baseStruct();
    225                 assert( structDecl->get_members().size() > idx );
    226                 Declaration * member = *std::next(structDecl->get_members().begin(), idx);
     217                tupleExpr->tuple = nullptr;
     218                unsigned int idx = tupleExpr->index;
     219                TypeSubstitution * env = tupleExpr->env;
     220                tupleExpr->env = nullptr;
     221                delete tupleExpr;
     222
     223                if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( tuple ) ) {
     224                        if ( ! maybeImpureIgnoreUnique( tupleExpr ) ) {
     225                                // optimization: definitely pure tuple expr => can reduce to the only relevant component.
     226                                assert( tupleExpr->exprs.size() > idx );
     227                                Expression *& expr = *std::next(tupleExpr->exprs.begin(), idx);
     228                                Expression * ret = expr;
     229                                ret->env = env;
     230                                expr = nullptr; // remove from list so it can safely be deleted
     231                                return ret;
     232                        }
     233                }
     234
     235                StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->result );
     236                StructDecl * structDecl = type->baseStruct;
     237                assert( structDecl->members.size() > idx );
     238                Declaration * member = *std::next(structDecl->members.begin(), idx);
    227239                MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple );
    228                 memExpr->set_env( env );
     240                memExpr->env = env;
    229241                return memExpr;
    230242        }
     
    262274
    263275                // remove data from shell
     276                tupleExpr->set_result( nullptr );
     277                tupleExpr->get_exprs().clear();
    264278                tupleExpr->set_env( nullptr );
    265279
Note: See TracChangeset for help on using the changeset viewer.