Changeset d06010a
- Timestamp:
- Jun 29, 2016, 1:57:32 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 2fb2ad5
- Parents:
- 85f0713 (diff), 66999e7 (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
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r85f0713 rd06010a 19 19 #include <functional> 20 20 #include <cassert> 21 #include <unordered_map> 22 #include <utility> 23 #include <vector> 21 24 22 25 #include "AlternativeFinder.h" … … 408 411 } 409 412 410 static const int recursionLimit = 10; 413 /// Map of declaration uniqueIds (intended to be the assertions in an AssertionSet) to their parents and the number of times they've been included 414 typedef std::unordered_map< UniqueId, std::unordered_map< UniqueId, unsigned > > AssertionParentSet; 415 416 static const int recursionLimit = 10; ///< Limit to depth of recursion satisfaction 417 static const unsigned recursionParentLimit = 1; ///< Limit to the number of times an assertion can recursively use itself 411 418 412 419 void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) { … … 417 424 } 418 425 } 419 426 420 427 template< typename ForwardIterator, typename OutputIterator > 421 void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, int level, const SymTab::Indexer &indexer, OutputIterator out ) { 428 void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, const AssertionParentSet &needParents, 429 int level, const SymTab::Indexer &indexer, OutputIterator out ) { 422 430 if ( begin == end ) { 423 431 if ( newNeed.empty() ) { … … 432 440 printAssertionSet( newNeed, std::cerr, 8 ); 433 441 ) 434 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out );442 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, needParents, level+1, indexer, out ); 435 443 return; 436 444 } … … 439 447 ForwardIterator cur = begin++; 440 448 if ( ! cur->second ) { 441 inferRecursive( begin, end, newAlt, openVars, decls, newNeed, level, indexer, out );449 inferRecursive( begin, end, newAlt, openVars, decls, newNeed, needParents, level, indexer, out ); 442 450 } 443 451 DeclarationWithType *curDecl = cur->first; … … 456 464 std::cerr << std::endl; 457 465 ) 466 458 467 AssertionSet newHave, newerNeed( newNeed ); 459 468 TypeEnvironment newEnv( newAlt.env ); … … 478 487 newerAlt.env = newEnv; 479 488 assert( (*candidate)->get_uniqueId() ); 480 Expression *varExpr = new VariableExpr( static_cast< DeclarationWithType* >( Declaration::declFromId( (*candidate)->get_uniqueId() ) ) ); 489 DeclarationWithType *candDecl = static_cast< DeclarationWithType* >( Declaration::declFromId( (*candidate)->get_uniqueId() ) ); 490 AssertionParentSet newNeedParents( needParents ); 491 // skip repeatingly-self-recursive assertion satisfaction 492 if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue; 493 Expression *varExpr = new VariableExpr( candDecl ); 481 494 deleteAll( varExpr->get_results() ); 482 495 varExpr->get_results().clear(); … … 492 505 // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions 493 506 appExpr->get_inferParams()[ curDecl->get_uniqueId() ] = ParamEntry( (*candidate)->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr ); 494 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, level, indexer, out );507 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, newNeedParents, level, indexer, out ); 495 508 } else { 496 509 delete adjType; … … 514 527 addToIndexer( have, decls ); 515 528 AssertionSet newNeed; 516 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out ); 529 AssertionParentSet needParents; 530 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, needParents, 0, indexer, out ); 517 531 // PRINT( 518 532 // std::cerr << "declaration 14 is "; -
src/ResolvExpr/RenameVars.cc
r85f0713 rd06010a 45 45 void RenameVars::visit( PointerType *pointerType ) { 46 46 typeBefore( pointerType ); 47 /// std::cout << "do pointer" << std::endl;48 47 maybeAccept( pointerType->get_base(), *this ); 49 /// std::cout << "done pointer" << std::endl;50 48 typeAfter( pointerType ); 51 49 } … … 60 58 void RenameVars::visit( FunctionType *functionType ) { 61 59 typeBefore( functionType ); 62 /// std::cout << "return vals" << std::endl;63 60 acceptAll( functionType->get_returnVals(), *this ); 64 /// std::cout << functionType->get_parameters().size() << " parameters" << std::endl;65 61 acceptAll( functionType->get_parameters(), *this ); 66 /// std::cout << "done function" << std::endl;67 62 typeAfter( functionType ); 68 63 } … … 95 90 void RenameVars::visit( TypeInstType *instType ) { 96 91 typeBefore( instType ); 97 /// std::cout << "instance of type " << instType->get_name() << std::endl;98 92 std::map< std::string, std::string >::const_iterator i = mapStack.front().find( instType->get_name() ); 99 93 if ( i != mapStack.front().end() ) { 100 /// std::cout << "found name " << i->second << std::endl;101 94 instType->set_name( i->second ); 102 95 } else { 103 /// std::cout << "no name found" << std::endl;104 96 } // if 105 97 acceptAll( instType->get_parameters(), *this ); … … 120 112 void RenameVars::typeBefore( Type *type ) { 121 113 if ( ! type->get_forall().empty() ) { 122 /// std::cout << "type with forall: ";123 /// type->print( std::cout );124 /// std::cout << std::endl;125 114 // copies current name mapping into new mapping 126 115 mapStack.push_front( mapStack.front() ); -
src/ResolvExpr/typeops.h
r85f0713 rd06010a 54 54 55 55 // in AdjustExprType.cc 56 /// Replaces array types with the equivalent pointer, and function types with a pointer-to-function 56 57 void adjustExprType( Type *&type, const TypeEnvironment &env, const SymTab::Indexer &indexer ); 57 58 -
src/tests/test.py
r85f0713 rd06010a 21 21 return list 22 22 23 def sh(cmd, dry_run ):23 def sh(cmd, dry_run = False, print2stdout = True): 24 24 if dry_run : 25 25 print("cmd: %s" % cmd) 26 return 0 26 return 0, None 27 27 else : 28 proc = Popen(cmd, std err=STDOUT, shell=True)29 proc.communicate()30 return proc.returncode 28 proc = Popen(cmd, stdout=None if print2stdout else PIPE, stderr=STDOUT, shell=True) 29 out, err = proc.communicate() 30 return proc.returncode, out 31 31 32 32 def file_replace(fname, pat, s_after): … … 61 61 62 62 # build, skipping to next test on error 63 make_ret = sh("%s %s 2> %s 1> /dev/null" % (make_cmd, test, out_file), dry_run)63 make_ret, _ = sh("%s %s 2> %s 1> /dev/null" % (make_cmd, test, out_file), dry_run) 64 64 65 65 if make_ret == 0 : … … 71 71 72 72 retcode = 0 73 error = None 73 74 74 75 fix_MakeLevel(out_file) … … 76 77 if not generate : 77 78 # diff the output of the files 78 retcode = sh("diff .expect/%s.txt .out/%s.log" % (test, test), dry_run) 79 diff_cmd = ("diff --old-group-format='\t\tmissing lines :\n" 80 "%%<' \\\n" 81 "--new-group-format='\t\tnew lines :\n" 82 "%%>' \\\n" 83 "--unchanged-group-format='%%=' \\" 84 "--changed-group-format='\t\texpected :\n" 85 "%%<\n" 86 "\t\tgot :\n" 87 "%%>' \\\n" 88 "--new-line-format='\t\t%%dn\t%%L' \\\n" 89 "--old-line-format='\t\t%%dn\t%%L' \\\n" 90 "--unchanged-line-format='' \\\n" 91 ".expect/%s.txt .out/%s.log") 92 93 retcode, error = sh(diff_cmd % (test, test), dry_run, False) 79 94 80 95 # clean the executable 81 96 sh("rm -f %s > /dev/null 2>&1" % test, dry_run) 82 97 83 return retcode 98 return retcode, error 84 99 85 100 def run_tests(tests, generate, dry_run) : … … 94 109 print("%20s " % t, end="") 95 110 sys.stdout.flush() 96 test_failed = run_test_instance(t, generate, dry_run)111 test_failed, error = run_test_instance(t, generate, dry_run) 97 112 failed = test_failed or failed 98 113 99 114 if not generate : 100 115 print("FAILED" if test_failed else "PASSED") 116 if error : 117 print(error) 101 118 else : 102 119 print( "Done" )
Note: See TracChangeset
for help on using the changeset viewer.