Ignore:
Timestamp:
Jun 15, 2007, 4:00:25 AM (17 years ago)
Author:
dai_9181
Message:

traceログ機能を搭載
動的メンバをstl::vectorにまとめた
シンボルをクラス化した

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/ParamImpl.cpp

    r116 r140  
    9898}
    9999
    100 bool ParamImpl::_overload_check( int level, const Parameters &targetParms, const Type &targetResultType ){
     100bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType ){
    101101    //パラメータを識別してオーバーロードを解決
    102102
     
    153153                        return false;
    154154                }
     155                if( argType.IsPointer() || param.IsPointer() )
     156                {
     157                    // ポインタ型の不整合は認めない
     158                    return false;
     159                }
    155160            }
    156161            else if(level==OVERLOAD_LEVEL6){
     
    190195}
    191196
    192 UserProc *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs ){
    193     int sw=0;
    194     UserProc *pUserProc = NULL;
    195 
    196     for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
    197         foreach( UserProc *pTempUserProc, subs ){
    198 
    199             //エラーチェック
    200             if(_overload_check( level, pTempUserProc->Params(), pTempUserProc->ReturnType() )){
    201                 if(sw){
    202                     SetError(52,name,cp);
    203                     return 0;
    204                 }
    205                 sw=1;
    206 
    207                 pUserProc = pTempUserProc;
    208             }
    209         }
    210 
    211         if( sw ) break;
    212     }
    213 
    214     if(!sw){
    215         SetError(52,name,cp);
    216         return 0;
    217     }
    218 
    219     return pUserProc;
    220 }
    221 UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs ){
     197UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType ){
    222198    int sw=0;
    223199    UserProc *pUserProc;
     
    228204        foreach( UserProc *pTempUserProc, subs ){
    229205
    230             //エラーチェック
    231             if(_overload_check( level, pTempUserProc->Params(), Type() )){
     206            if(EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type() )){
     207                trace( "レベル" << level <<    " ○適合..." << pTempUserProc->_paramStr );
     208
    232209                if(sw){
    233                     return OverloadSolutionWithReturnType(name,subs);
     210                    if( isEnabledReturnType ){
     211                        SetError(52,name,cp);
     212
     213                        return 0;
     214                    }
     215                    else{
     216                        // 戻り値も比較するモードにして再びオーバーロード解決を試みる
     217
     218                        trace( "戻り値も比較するモードに切り替えてオーバーロード解決を試みる" );
     219
     220                        return OverloadSolution(name,subs, true);
     221                    }
    234222                }
    235223                sw=1;
    236224
    237225                pUserProc = pTempUserProc;
     226            }
     227            else
     228            {
     229                trace( "レベル" << level <<    " ×不適合..." << pTempUserProc->_paramStr );
    238230            }
    239231        }
     
    260252    if(!sw){
    261253        SetError(52,name,cp);
     254
    262255        return 0;
    263256    }
    264257
     258
    265259    return pUserProc;
     260}
     261UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType ){
     262    trace( "" );
     263    trace( "■■■■■■■■■■■■■■■■■■" );
     264    trace( "■■■ オーバーロード解決(" << name << ")" );
     265
     266    UserProc *result = _OverloadSolution( name, subs, isEnabledReturnType );
     267
     268    trace( "■■■ ここまで" );
     269    trace( "■■■■■■■■■■■■■■■■■■" );
     270    trace( "" );
     271
     272    return result;
    266273}
    267274
Note: See TracChangeset for help on using the changeset viewer.