Ignore:
Timestamp:
Mar 10, 2008, 5:39:36 PM (17 years ago)
Author:
dai_9181
Message:

・ジェネリックな型をパラメータに持つメソッドのオーバーロード解決に対応した。
・型パラメータの制約クラス指定に対応した。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/ParamImpl.cpp

    r364 r424  
    107107}
    108108
    109 bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, bool &isErrored ){
     109bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, const Type &leftType, const UserProc &userProc, bool &isErrored ){
    110110    //パラメータを識別してオーバーロードを解決
    111111
     
    124124    for(int i=0;i<max;i++){
    125125        Parameter &param = *targetParms[i];
     126
     127        Type paramType( param );
     128        ResolveFormalGenericTypeParameter( paramType, leftType, &userProc );
    126129
    127130        if( i >= ParmsNum ){
     
    140143
    141144            if( !NumOpe_GetType(Parms[i],
    142                 ( level <= OVERLOAD_LEVEL3 )? nullParam : param,
     145                ( level <= OVERLOAD_LEVEL3 )? nullParam : paramType,
    143146                argType) )
    144147            {
     
    151154        }
    152155
    153         if(argType.GetBasicType()!=param.GetBasicType()){
     156        if( ( argType.IsObject() && paramType.IsObject() ) || argType.GetBasicType() == paramType.GetBasicType() )
     157        {
     158            if( argType.IsStruct() ){
     159                if(argType.GetIndex()!=paramType.GetIndex()){
     160                    return false;
     161                }
     162            }
     163            else if( argType.IsObject() ){
     164                if( level == OVERLOAD_LEVEL0 ){
     165                    if( !paramType.GetClass().IsEquals( &argType.GetClass() ) ){
     166                        return false;
     167                    }
     168                }
     169                else{
     170                    if( !paramType.GetClass().IsEqualsOrSubClass( &argType.GetClass() ) ){
     171                        return false;
     172                    }
     173                }
     174            }
     175        }
     176        else
     177        {
    154178            if( level == OVERLOAD_LEVEL0 || level == OVERLOAD_LEVEL1 || level==OVERLOAD_LEVEL4 ){
    155179                return false;
    156180            }
    157181            else if( level == OVERLOAD_LEVEL2 ){
    158                 if( !(argType.IsWhole() && param.IsWhole() && argType.GetBasicSize() == param.GetBasicSize() ) ){
     182                if( !(argType.IsWhole() && paramType.IsWhole() && argType.GetBasicSize() == paramType.GetBasicSize() ) ){
    159183                    // サイズ違い
    160184                    return false;
     
    163187            else if( level == OVERLOAD_LEVEL3 || level==OVERLOAD_LEVEL5){
    164188                if(!(
    165                     argType.IsWhole()&&param.IsWhole()||
    166                     argType.IsReal()&&param.IsReal()
     189                    argType.IsWhole()&&paramType.IsWhole()||
     190                    argType.IsReal()&&paramType.IsReal()
    167191                    )){
    168192                        return false;
    169193                }
    170                 if( argType.IsPointer() || param.IsPointer() )
     194                if( argType.IsPointer() || paramType.IsPointer() )
    171195                {
    172196                    // ポインタ型の不整合は認めない
     
    175199            }
    176200            else if(level==OVERLOAD_LEVEL6){
    177                 if(argType.IsObject()||param.IsObject()) return false;
    178             }
    179         }
    180         else{
    181             if( NATURAL_TYPE(argType.GetBasicType())==DEF_STRUCT){
    182                 if(argType.GetIndex()!=param.GetIndex()){
    183                     return false;
    184                 }
    185             }
    186             else if( NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT ){
    187                 if( level == OVERLOAD_LEVEL0 ){
    188                     if( !param.GetClass().IsEquals( &argType.GetClass() ) ){
    189                         return false;
    190                     }
    191                 }
    192                 else{
    193                     if( !param.GetClass().IsEqualsOrSubClass( &argType.GetClass() ) ){
    194                         return false;
    195                     }
    196                 }
     201                if(argType.IsObject()||paramType.IsObject()) return false;
    197202            }
    198203        }
     
    209214}
    210215
    211 const UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType ){
     216const UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType ){
    212217    const UserProc *pUserProc = NULL;
    213218
     
    218223            bool isErrored = false;
    219224            bool isHit = false;
    220             isHit = EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type(), isErrored );
     225            isHit = EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type(), leftType, *pTempUserProc, isErrored );
    221226            if( isErrored )
    222227            {
     
    239244                        trace_for_overload( "戻り値も比較するモードに切り替えてオーバーロード解決を試みる" );
    240245
    241                         return OverloadSolution(name,subs, true);
     246                        return OverloadSolution( name, subs, leftType, true);
    242247                    }
    243248                }
     
    278283    return pUserProc;
    279284}
    280 const UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType ){
     285const UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType ){
    281286    trace_for_overload( "" );
    282287    trace_for_overload( "■■■■■■■■■■■■■■■■■■" );
    283288    trace_for_overload( "■■■ オーバーロード解決(" << name << ")" );
    284289
    285     const UserProc *result = _OverloadSolution( name, subs, isEnabledReturnType );
     290    const UserProc *result = _OverloadSolution( name, subs, leftType, isEnabledReturnType );
    286291
    287292    trace_for_overload( "■■■ ここまで" );
Note: See TracChangeset for help on using the changeset viewer.