Changeset d5556a3 for src/Tuples


Ignore:
Timestamp:
Dec 13, 2016, 5:37:15 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:
31f379c
Parents:
1d2b64f
Message:

change rework TupleAssignExpr? and StmtExpr?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleExpansion.cc

    r1d2b64f rd5556a3  
    194194                                new CommaExpr( new CommaExpr( assignUnq, assignFinished ), var->clone() ) );
    195195                        condExpr->set_result( var->get_result()->clone() );
     196                        condExpr->set_env( maybeClone( unqExpr->get_env() ) );
    196197                        decls[id] = condExpr;
    197198                }
     
    202203        Expression * TupleAssignExpander::mutate( TupleAssignExpr * assnExpr ) {
    203204                assnExpr = safe_dynamic_cast< TupleAssignExpr * >( Parent::mutate( assnExpr ) );
    204                 CompoundStmt * compoundStmt = new CompoundStmt( noLabels );
    205                 std::list< Statement * > & stmts = compoundStmt->get_kids();
    206                 for ( ObjectDecl * obj : assnExpr->get_tempDecls() ) {
    207                         stmts.push_back( new DeclStmt( noLabels, obj ) );
    208                 }
    209                 TupleExpr * tupleExpr = new TupleExpr( assnExpr->get_assigns() );
    210                 assert( tupleExpr->get_result() );
    211                 stmts.push_back( new ExprStmt( noLabels, tupleExpr ) );
    212                 assnExpr->get_tempDecls().clear();
    213                 assnExpr->get_assigns().clear();
     205                StmtExpr * ret = assnExpr->get_stmtExpr();
     206                assnExpr->set_stmtExpr( nullptr );
     207                // move env to StmtExpr
     208                ret->set_env( assnExpr->get_env() );
     209                assnExpr->set_env( nullptr );
    214210                delete assnExpr;
    215                 return new StmtExpr( compoundStmt );
     211                return ret;
    216212        }
    217213
     
    221217                if ( ! typeMap.count( mangleName ) ) {
    222218                        // generate struct type to replace tuple type
     219                        // xxx - should fix this to only generate one tuple struct for each number of type parameters
    223220                        StructDecl * decl = new StructDecl( "_tuple_type_" + mangleName );
    224221                        decl->set_body( true );
     
    247244                tupleExpr->set_tuple( nullptr );
    248245                unsigned int idx = tupleExpr->get_index();
     246                TypeSubstitution * env = tupleExpr->get_env();
     247                tupleExpr->set_env( nullptr );
    249248                delete tupleExpr;
    250249
     
    253252                assert( structDecl->get_members().size() > idx );
    254253                Declaration * member = *std::next(structDecl->get_members().begin(), idx);
    255                 return new MemberExpr( safe_dynamic_cast< DeclarationWithType * >( member ), tuple );
    256         }
    257 
    258         Expression * replaceTupleExpr( Type * result, const std::list< Expression * > & exprs ) {
     254                MemberExpr * memExpr = new MemberExpr( safe_dynamic_cast< DeclarationWithType * >( member ), tuple );
     255                memExpr->set_env( env );
     256                return memExpr;
     257        }
     258
     259        Expression * replaceTupleExpr( Type * result, const std::list< Expression * > & exprs, TypeSubstitution * env ) {
    259260                if ( result->isVoid() ) {
    260261                        // void result - don't need to produce a value for cascading - just output a chain of comma exprs
    261262                        assert( ! exprs.empty() );
    262263                        std::list< Expression * >::const_iterator iter = exprs.begin();
    263                         Expression * expr = *iter++;
     264                        Expression * expr = new CastExpr( *iter++ );
    264265                        for ( ; iter != exprs.end(); ++iter ) {
    265                                 expr = new CommaExpr( expr, *iter );
    266                         }
     266                                expr = new CommaExpr( expr, new CastExpr( *iter ) );
     267                        }
     268                        expr->set_env( env );
    267269                        return expr;
    268270                } else {
     
    274276                                inits.push_back( new SingleInit( expr ) );
    275277                        }
    276                         return new CompoundLiteralExpr( result, new ListInit( inits ) );
     278                        Expression * expr = new CompoundLiteralExpr( result, new ListInit( inits ) );
     279                        expr->set_env( env );
     280                        return expr;
    277281                }
    278282        }
     
    284288                std::list< Expression * > exprs = tupleExpr->get_exprs();
    285289                assert( result );
     290                TypeSubstitution * env = tupleExpr->get_env();
    286291
    287292                // remove data from shell and delete it
    288293                tupleExpr->set_result( nullptr );
    289294                tupleExpr->get_exprs().clear();
     295                tupleExpr->set_env( nullptr );
    290296                delete tupleExpr;
    291297
    292                 return replaceTupleExpr( result, exprs );
     298                return replaceTupleExpr( result, exprs, env );
    293299        }
    294300
Note: See TracChangeset for help on using the changeset viewer.