Changeset eba74ba for src/Tuples
- Timestamp:
- May 25, 2018, 2:51:06 PM (6 years ago)
- 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. - Location:
- src/Tuples
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleAssignment.cc
r3ef35bd reba74ba 154 154 lhsAlt.expr = new CastExpr( lhsAlt.expr, 155 155 new ReferenceType( Type::Qualifiers(), 156 lhsAlt.expr-> get_result()->clone() ) );156 lhsAlt.expr->result->clone() ) ); 157 157 } 158 158 … … 231 231 232 232 ResolvExpr::AlternativeFinder finder{ currentFinder.get_indexer(), 233 currentFinder.get_environ() }; 233 matcher->compositeEnv }; 234 234 235 try { 235 236 finder.findWithAdjustment(*i); … … 298 299 ObjectDecl * TupleAssignSpotter::Matcher::newObject( UniqueName & namer, Expression * expr ) { 299 300 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() ) ); 301 302 // 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 ) ) { 303 304 ConstructorInit * ctorInit = InitTweak::genCtorInit( ret ); 304 305 ret->init = ctorInit; … … 318 319 assert( (! lhs.empty() && rhs.size() <= 1) || (lhs.empty() && rhs.empty()) ); 319 320 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 320 323 ObjectDecl * rtmp = rhs.size() == 1 ? newObject( rhsNamer, rhs.front().expr ) : nullptr; 321 324 for ( ResolvExpr::Alternative & lhsAlt : lhs ) { … … 336 339 std::list< ObjectDecl * > ltmp; 337 340 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 } 345 359 tmpDecls.splice( tmpDecls.end(), ltmp ); 346 360 tmpDecls.splice( tmpDecls.end(), rtmp ); -
src/Tuples/TupleExpansion.cc
r3ef35bd reba74ba 30 30 #include "SynTree/Type.h" // for Type, Type::Qualifiers, TupleType 31 31 #include "SynTree/Visitor.h" // for Visitor 32 #include "Tuples.h" 32 33 33 34 class CompoundStmt; … … 119 120 Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor ); 120 121 // 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 ); 124 123 for ( Expression *& expr : tupleExpr->exprs ) { 125 124 expr = reconstructMemberExpr( expr, aggr, memberExpr->location ); … … 214 213 215 214 Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) { 216 Expression * tuple = tupleExpr-> get_tuple();215 Expression * tuple = tupleExpr->tuple; 217 216 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); 227 239 MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple ); 228 memExpr-> set_env( env );240 memExpr->env = env; 229 241 return memExpr; 230 242 } … … 262 274 263 275 // remove data from shell 276 tupleExpr->set_result( nullptr ); 277 tupleExpr->get_exprs().clear(); 264 278 tupleExpr->set_env( nullptr ); 265 279
Note: See TracChangeset
for help on using the changeset viewer.