Changes in translator/GenPoly/Box.cc [bdd516a:b1a6d6b]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
translator/GenPoly/Box.cc
rbdd516a 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 }
Note: See TracChangeset
for help on using the changeset viewer.