Changeset b1a6d6b for translator/GenPoly
- Timestamp:
- May 14, 2015, 12:19:46 PM (9 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, string, with_gc
- Children:
- 4bf5298
- Parents:
- d4778a6
- Location:
- translator/GenPoly
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
translator/GenPoly/Box.cc
rd4778a6 rb1a6d6b 7 7 8 8 #include <set> 9 #include <stack> 9 10 #include <string> 10 11 #include <iterator> … … 50 51 virtual Type *mutate( FunctionType *pointerType ); 51 52 53 virtual void doBeginScope(); 52 54 virtual void doEndScope(); 53 55 private: … … 66 68 67 69 std::map< std::string, DeclarationWithType *> assignOps; 68 std::map< std::string, FunctionDecl *> adapters; 70 typedef std::map< std::string, FunctionDecl *> AdapterMap; 71 std::stack< AdapterMap > adapters; 69 72 DeclarationWithType *retval; 70 73 bool useRetval; … … 126 129 127 130 namespace { 131 std::string makeAdapterName( const std::string &mangleName ) { 132 return "_adapter" + mangleName; 133 } 134 128 135 bool isPolyRet( FunctionType *function, std::string &name, const TyVarMap &otherTyVars ) { 129 136 bool doTransform = false; … … 219 226 retval = oldRetval; 220 227 useRetval = oldUseRetval; 221 doEndScope();228 // doEndScope(); 222 229 } // if 223 230 return functionDecl; … … 316 323 Type *concrete = env->lookup( typeName ); 317 324 if ( concrete == 0 ) { 318 throw SemanticError( "Unbound type variable " + typeName + " in ", appExpr );325 throw SemanticError( "Unbound type variable " + typeName + " in ", appExpr ); 319 326 } // if 320 327 return addRetParam( appExpr, function, concrete, arg ); … … 326 333 ret = addRetParam( appExpr, function, function->get_returnVals().front()->get_type(), arg ); 327 334 } // if 335 std::string mangleName = SymTab::Mangler::mangle( function ); 336 std::string adapterName = makeAdapterName( mangleName ); 337 328 338 appExpr->get_args().push_front( appExpr->get_function() ); 329 appExpr->set_function( new NameExpr( "_adapter" + SymTab::Mangler::mangle( function )) );339 appExpr->set_function( new NameExpr( adapterName ) ); 330 340 331 341 return ret; … … 337 347 TypeInstType *typeInst = dynamic_cast< TypeInstType *>( param ); 338 348 if ( typeInst && exprTyVars.find( typeInst->get_name() ) != exprTyVars.end() ) { 339 if ( arg->get_results().front()->get_isLvalue() ) { 349 if ( dynamic_cast< TypeInstType *>( arg->get_results().front() ) ) { 350 // if the argument's type is a type parameter, we don't need to box again! 351 return; 352 } else if ( arg->get_results().front()->get_isLvalue() ) { 353 // VariableExpr and MemberExpr are lvalues 340 354 arg = new AddressExpr( arg ); 341 355 } else { … … 371 385 for ( std::list< DeclarationWithType *>::const_iterator param = function->get_parameters().begin(); param != function->get_parameters().end(); ++param, ++arg ) { 372 386 /// std::cout << "parameter is "; 373 /// (*param)->print( std:: cout );387 /// (*param)->print( std::fcout ); 374 388 /// std::cout << std::endl << "argument is "; 375 389 /// (*arg)->print( std::cout ); … … 448 462 } 449 463 464 465 450 466 FunctionDecl *Pass1::makeAdapter( FunctionType *adaptee, FunctionType *realType, const std::string &mangleName, const TyVarMap &tyVars ) { 451 467 FunctionType *adapterType = makeAdapterType( adaptee, tyVars ); … … 496 512 CompoundStmt *adapterBody = new CompoundStmt( noLabels ); 497 513 adapterBody->get_kids().push_back( bodyStmt ); 498 return new FunctionDecl( "_adapter" + mangleName, Declaration::NoStorageClass, LinkageSpec::C, adapterType, adapterBody, false ); 514 std::string adapterName = makeAdapterName( mangleName ); 515 return new FunctionDecl( adapterName, Declaration::NoStorageClass, LinkageSpec::C, adapterType, adapterBody, false ); 499 516 } 500 517 … … 515 532 assert( env ); 516 533 env->apply( realFunction ); 534 517 535 std::string mangleName = SymTab::Mangler::mangle( realFunction ); 518 536 if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) { 519 std::map< std::string, FunctionDecl *>::iterator adapter = adapters.find( mangleName ); 520 if ( adapter == adapters.end() ) { 521 FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars ); 537 AdapterMap & adapters = Pass1::adapters.top(); 538 AdapterMap::iterator adapter = adapters.find( mangleName ); 539 540 if ( needsAdapter( realFunction, exprTyVars, true ) ) { 541 // the function still contains type variables, which means we are in a polymorphic 542 // context and the adapter function is a parameter - call the parameter and don't 543 // create a new adapter. 544 appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) ); 545 continue; 546 } else if ( adapter == adapters.end() ) { 547 FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars ); 522 548 adapter = adapters.insert( adapters.begin(), std::pair< std::string, FunctionDecl *>( mangleName, newAdapter ) ); 523 549 stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) ); … … 525 551 assert( adapter != adapters.end() ); 526 552 appExpr->get_args().push_front( new VariableExpr( adapter->second ) ); 553 // appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) ); 527 554 adaptersDone.insert( adaptersDone.begin(), mangleName ); 528 555 } // if … … 845 872 } 846 873 874 void Pass1::doBeginScope() { 875 adapters.push(AdapterMap()); 876 } 877 847 878 void Pass1::doEndScope() { 848 adapters. clear();879 adapters.pop(); 849 880 } 850 881 … … 865 896 std::string mangleName = SymTab::Mangler::mangle( *funType ); 866 897 if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) { 867 paramList.push_front( new ObjectDecl( "_adapter" + mangleName, Declaration::NoStorageClass, LinkageSpec::C, 0, new PointerType( Type::Qualifiers(), makeAdapterType( *funType, scopeTyVars ) ), 0 ) ); 898 std::string adapterName = makeAdapterName( mangleName ); 899 paramList.push_front( new ObjectDecl( adapterName, Declaration::NoStorageClass, LinkageSpec::C, 0, new PointerType( Type::Qualifiers(), makeAdapterType( *funType, scopeTyVars ) ), 0 ) ); 868 900 adaptersDone.insert( adaptersDone.begin(), mangleName ); 869 901 } -
translator/GenPoly/GenPoly.cc
rd4778a6 rb1a6d6b 9 9 #include "SynTree/Type.h" 10 10 11 #include <iostream> 12 using namespace std; 11 13 12 14 namespace GenPoly { 13 15 16 // interface functions 17 bool isPolyVal( Type *type, const TyVarMap &tyVars ) { 18 return isPolyVal( type, tyVars, false ); 19 } 20 21 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) { 22 return needsAdapter( adaptee, tyVars, false ); 23 } 24 14 25 bool 15 isPolyVal( Type *type, const TyVarMap &tyVars )26 isPolyVal( Type *type, const TyVarMap &tyVars, bool considerAllTyVars ) 16 27 { 17 28 if( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( type ) ) { … … 19 30 return true; 20 31 } 32 return considerAllTyVars; 21 33 } 22 34 return false; … … 26 38 // parameters have polymorphic type 27 39 bool 28 needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars )40 needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars, bool considerAllTyVars ) 29 41 { 30 42 bool needsAdapter = false; 31 if( !adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {43 if( !adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars, considerAllTyVars ) ) { 32 44 needsAdapter = true; 33 45 } 34 46 for( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); !needsAdapter && innerArg != adaptee->get_parameters().end(); ++innerArg ) { 35 if( isPolyVal( (*innerArg)->get_type(), tyVars ) ) {47 if( isPolyVal( (*innerArg)->get_type(), tyVars, considerAllTyVars ) ) { 36 48 needsAdapter = true; 37 49 } -
translator/GenPoly/GenPoly.h
rd4778a6 rb1a6d6b 5 5 * 6 6 */ 7 8 #ifndef GENPOLY_H 9 #define GENPOLY_H 7 10 8 11 #include <map> … … 15 18 typedef std::map< std::string, TypeDecl::Kind > TyVarMap; 16 19 17 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ); 20 // considerAllTyVars allows ignoring the contents of the TyVarMap parameter, for the situations where 21 // it is important only that a TypeInstType node exists. 22 23 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVarr ); 24 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars, bool considerAllTyVars ); 18 25 bool isPolyFun( FunctionType *fun, const TyVarMap &tyVars ); 19 26 bool isPolyVal( Type *type, const TyVarMap &tyVars ); 27 bool isPolyVal( Type *type, const TyVarMap &tyVars, bool considerAllTyVars ); 20 28 void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ); 21 29 22 30 } // namespace GenPoly 31 32 #endif -
translator/GenPoly/PolyMutator.cc
rd4778a6 rb1a6d6b 51 51 compound->get_kids().push_back( newStmt ); 52 52 compound->get_kids().splice( compound->get_kids().end(), stmtsToAddAfter ); 53 doEndScope();53 // doEndScope(); 54 54 return compound; 55 55 } else { … … 74 74 PolyMutator::mutate(CompoundStmt *compoundStmt) 75 75 { 76 doBeginScope(); 76 77 mutateStatementList( compoundStmt->get_kids() ); 77 78 doEndScope(); -
translator/GenPoly/PolyMutator.h
rd4778a6 rb1a6d6b 41 41 42 42 // template method 43 virtual void doBeginScope() {} 43 44 virtual void doEndScope() {} 44 45
Note: See TracChangeset
for help on using the changeset viewer.