- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (28 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r43bd69d r5af7306 21 21 #include <list> // for _List_iterator, list, _List_const_... 22 22 #include <map> // for _Rb_tree_iterator, map, _Rb_tree_c... 23 #include <memory> // for allocator_traits<>::value_type , unique_ptr23 #include <memory> // for allocator_traits<>::value_type 24 24 #include <utility> // for pair 25 25 #include <vector> // for vector … … 35 35 #include "ResolveTypeof.h" // for resolveTypeof 36 36 #include "Resolver.h" // for resolveStmtExpr 37 #include "Common/GC.h" // for new_static_root 37 38 #include "SymTab/Indexer.h" // for Indexer 38 39 #include "SymTab/Mangler.h" // for Mangler … … 101 102 void addAnonConversions( const Alternative & alt ); 102 103 /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member 103 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member);104 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name ); 104 105 /// Adds alternatives for member expressions where the left side has tuple type 105 106 void addTupleMembers( TupleType * tupleType, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ); … … 165 166 candidate->env.apply( newType ); 166 167 mangleName = SymTab::Mangler::mangle( newType ); 167 delete newType;168 168 } 169 169 std::map< std::string, PruneStruct >::iterator mapPlace = selected.find( mangleName ); … … 297 297 // adds anonymous member interpretations whenever an aggregate value type is seen. 298 298 // it's okay for the aggregate expression to have reference type -- cast it to the base type to treat the aggregate as the referenced value 299 std::unique_ptr<Expression> aggrExpr( alt.expr->clone());299 Expression* aggrExpr = alt.expr->clone(); 300 300 alt.env.apply( aggrExpr->get_result() ); 301 301 Type * aggrType = aggrExpr->get_result(); 302 302 if ( dynamic_cast< ReferenceType * >( aggrType ) ) { 303 303 aggrType = aggrType->stripReferences(); 304 aggrExpr .reset( new CastExpr( aggrExpr.release(), aggrType->clone() ) );304 aggrExpr = new CastExpr{ aggrExpr, aggrType->clone() }; 305 305 } 306 306 307 307 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) { 308 NameExpr nameExpr( "" ); 309 addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr ); 308 addAggMembers( structInst, aggrExpr, alt.cost+Cost::safe, alt.env, "" ); 310 309 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) { 311 NameExpr nameExpr( "" ); 312 addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr ); 310 addAggMembers( unionInst, aggrExpr, alt.cost+Cost::safe, alt.env, "" ); 313 311 } // if 314 312 } 315 313 316 314 template< typename StructOrUnionType > 317 void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) { 318 // by this point, member must be a name expr 319 NameExpr * nameExpr = dynamic_cast< NameExpr * >( member ); 320 if ( ! nameExpr ) return; 321 const std::string & name = nameExpr->get_name(); 315 void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name ) { 322 316 std::list< Declaration* > members; 323 317 aggInst->lookup( name, members ); … … 459 453 /// Adds type variables to the open variable set and marks their assertions 460 454 void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions ) { 461 for ( Type::ForallList::const_iterator tyvar = type-> forall.begin(); tyvar != type->forall.end(); ++tyvar ) {455 for ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) { 462 456 unifiableVars[ (*tyvar)->get_name() ] = TypeDecl::Data{ *tyvar }; 463 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)-> assertions.begin(); assert != (*tyvar)->assertions.end(); ++assert ) {457 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)->get_assertions().begin(); assert != (*tyvar)->get_assertions().end(); ++assert ) { 464 458 needAssertions[ *assert ].isUsed = true; 465 459 } … … 568 562 569 563 Expression *varExpr = data.combine( newerAlt.cvtCost ); 570 delete varExpr->get_result();571 564 varExpr->set_result( adjType->clone() ); 572 565 PRINT( … … 585 578 (*inferParameters)[ curDecl->get_uniqueId() ] = ParamEntry( candidate->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr ); 586 579 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, /*newNeedParents,*/ level, indexer, out ); 587 } else {588 delete adjType;589 580 } 590 581 } … … 634 625 struct ArgPack { 635 626 std::size_t parent; ///< Index of parent pack 636 std::unique_ptr<Expression> expr;///< The argument stored here627 Expression* expr; ///< The argument stored here 637 628 Cost cost; ///< The cost of this argument 638 629 TypeEnvironment env; ///< Environment for this pack … … 681 672 std::list<Expression*> exprs; 682 673 const ArgPack* pack = this; 683 if ( expr ) { exprs.push_front( expr .release()); }674 if ( expr ) { exprs.push_front( expr ); } 684 675 while ( pack->tupleStart == 0 ) { 685 676 pack = &packs[pack->parent]; … … 688 679 } 689 680 // reset pack to appropriate tuple 690 expr .reset( new TupleExpr( exprs ) );681 expr = new TupleExpr{ exprs }; 691 682 tupleStart = pack->tupleStart - 1; 692 683 parent = pack->parent; … … 740 731 741 732 results.emplace_back( 742 i, expl.exprs[results[i].nextExpl] .get(), copy(results[i].env),733 i, expl.exprs[results[i].nextExpl], copy(results[i].env), 743 734 copy(results[i].need), copy(results[i].have), 744 735 copy(results[i].openVars), nextArg, nTuples, Cost::zero, nextExpl, … … 761 752 newResult.parent = i; 762 753 std::list<Expression*> emptyList; 763 newResult.expr .reset( new TupleExpr( emptyList ) );754 newResult.expr = new TupleExpr{ emptyList }; 764 755 argType = newResult.expr->get_result(); 765 756 } else { … … 768 759 newResult.cost = results[i].cost; 769 760 newResult.tupleStart = results[i].tupleStart; 770 newResult.expr .reset( results[i].expr->clone());761 newResult.expr = results[i].expr->clone(); 771 762 argType = newResult.expr->get_result(); 772 763 … … 818 809 // add new result 819 810 results.emplace_back( 820 i, expl.exprs.front() .get(), move(env), copy(results[i].need),811 i, expl.exprs.front(), move(env), copy(results[i].need), 821 812 copy(results[i].have), move(openVars), nextArg + 1, 822 813 nTuples, expl.cost, expl.exprs.size() == 1 ? 0 : 1, j ); … … 844 835 if ( results[i].hasExpl() ) { 845 836 const ExplodedActual& expl = results[i].getExpl( args ); 846 Expression* expr = expl.exprs[results[i].nextExpl] .get();837 Expression* expr = expl.exprs[results[i].nextExpl]; 847 838 848 839 TypeEnvironment env = results[i].env; … … 915 906 916 907 // consider only first exploded actual 917 Expression* expr = expl.exprs.front() .get();908 Expression* expr = expl.exprs.front(); 918 909 Type* actualType = expr->get_result()->clone(); 919 910 … … 1018 1009 1019 1010 results.emplace_back( 1020 i, expl.exprs[results[i].nextExpl] .get(), copy(results[i].env),1011 i, expl.exprs[results[i].nextExpl], copy(results[i].env), 1021 1012 copy(results[i].need), copy(results[i].have), 1022 1013 copy(results[i].openVars), nextArg, 0, Cost::zero, nextExpl, … … 1054 1045 // add new result 1055 1046 results.emplace_back( 1056 i, expl.exprs.front() .get(), move(env), copy(results[i].need),1047 i, expl.exprs.front(), move(env), copy(results[i].need), 1057 1048 copy(results[i].have), move(openVars), nextArg + 1, 0, 1058 1049 expl.cost, expl.exprs.size() == 1 ? 0 : 1, j ); … … 1088 1079 1089 1080 // find function operators 1090 static NameExpr *opExpr = new NameExpr( "?()" );1081 static auto *opExpr = new_static_root<NameExpr>( "?()" ); 1091 1082 AlternativeFinder funcOpFinder( indexer, env ); 1092 1083 // it's ok if there aren't any defined function ops 1093 funcOpFinder.maybeFind( opExpr );1084 funcOpFinder.maybeFind( opExpr ); 1094 1085 PRINT( 1095 1086 std::cerr << "known function ops:" << std::endl; … … 1247 1238 } 1248 1239 1249 Expression * restructureCast( Expression * argExpr, Type * toType , bool isGenerated) {1240 Expression * restructureCast( Expression * argExpr, Type * toType ) { 1250 1241 if ( argExpr->get_result()->size() > 1 && ! toType->isVoid() && ! dynamic_cast<ReferenceType *>( toType ) ) { 1251 1242 // Argument expression is a tuple and the target type is not void and not a reference type. … … 1262 1253 // cast each component 1263 1254 TupleIndexExpr * idx = new TupleIndexExpr( argExpr->clone(), i ); 1264 componentExprs.push_back( restructureCast( idx, toType->getComponent( i ), isGenerated ) ); 1265 } 1266 delete argExpr; 1255 componentExprs.push_back( restructureCast( idx, toType->getComponent( i ) ) ); 1256 } 1267 1257 assert( componentExprs.size() > 0 ); 1268 1258 // produce the tuple of casts … … 1270 1260 } else { 1271 1261 // handle normally 1272 CastExpr * ret = new CastExpr( argExpr, toType->clone() ); 1273 ret->isGenerated = isGenerated; 1274 return ret; 1262 return new CastExpr( argExpr, toType->clone() ); 1275 1263 } 1276 1264 } … … 1316 1304 // count one safe conversion for each value that is thrown away 1317 1305 thisCost.incSafe( discardedValues ); 1318 Alternative newAlt( restructureCast( alt.expr->clone(), toType , castExpr->isGenerated), alt.env,1306 Alternative newAlt( restructureCast( alt.expr->clone(), toType ), alt.env, 1319 1307 alt.cost, thisCost ); 1320 1308 inferParameters( needAssertions, haveAssertions, newAlt, openVars, … … 1343 1331 } 1344 1332 1333 namespace { 1334 /// Gets name from untyped member expression (member must be NameExpr) 1335 const std::string& get_member_name( UntypedMemberExpr *memberExpr ) { 1336 NameExpr * nameExpr = dynamic_cast< NameExpr * >( memberExpr->get_member() ); 1337 assert( nameExpr ); 1338 return nameExpr->get_name(); 1339 } 1340 } 1341 1345 1342 void AlternativeFinder::Finder::postvisit( UntypedMemberExpr *memberExpr ) { 1346 1343 AlternativeFinder funcFinder( indexer, env ); … … 1351 1348 Expression * aggrExpr = agg->expr->clone(); 1352 1349 referenceToRvalueConversion( aggrExpr, cost ); 1353 std::unique_ptr<Expression> guard( aggrExpr );1354 1350 1355 1351 // find member of the given type 1356 1352 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) { 1357 addAggMembers( structInst, aggrExpr, cost, agg->env, memberExpr->get_member() );1353 addAggMembers( structInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) ); 1358 1354 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) { 1359 addAggMembers( unionInst, aggrExpr, cost, agg->env, memberExpr->get_member() );1355 addAggMembers( unionInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) ); 1360 1356 } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( aggrExpr->get_result() ) ) { 1361 1357 addTupleMembers( tupleType, aggrExpr, cost, agg->env, memberExpr->get_member() ); … … 1602 1598 alternatives.push_back( Alternative( new CommaExpr( newFirstArg->clone(), alt.expr->clone() ), alt.env, alt.cost ) ); 1603 1599 } // for 1604 delete newFirstArg;1605 1600 } 1606 1601 … … 1732 1727 // count one safe conversion for each value that is thrown away 1733 1728 thisCost.incSafe( discardedValues ); 1734 Alternative newAlt( new InitExpr( restructureCast( alt.expr->clone(), toType , true), initAlt.designation->clone() ), newEnv, alt.cost, thisCost );1729 Alternative newAlt( new InitExpr( restructureCast( alt.expr->clone(), toType ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost ); 1735 1730 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) ); 1736 1731 }
Note:
See TracChangeset
for help on using the changeset viewer.