Ignore:
Timestamp:
Jan 2, 2008, 12:50:34 AM (16 years ago)
Author:
dai_9181
Message:

ジェネリクスインターフェイス実装時のオーバーロード解決ロジックを改良。(型パラメータを戻り値に持つメソッドのオーバーロードをミスしてしまうバグを修正)

Location:
trunk/abdev/BasicCompiler_Common/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r380 r382  
    340340    BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() )
    341341    {
    342         CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( &pMethod->GetUserProc() );
     342        CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( pDestInterface->GetActualTypeParameters(), &pMethod->GetUserProc() );
    343343        if( pMethodForOverride )
    344344        {
     
    524524        if( pMethod->GetInheritsClassPtr() ) continue;
    525525
    526         if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
     526        if( pMethod->GetUserProc().IsEqualForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ) )
    527527        {
    528528            //関数名、パラメータ、戻り値が合致したとき
     
    536536
    537537    // メソッドのオーバーライド
    538     CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pUserProc );
     538    CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
    539539    if( pMethodForOverride )
    540540    {
     
    545545    else
    546546    {
     547   
     548        if( pUserProc->GetName() == "GenericProc" )
     549        {
     550            int test=0;
     551        }
     552
    547553        // インターフェイス メソッドのオーバーライド
    548554        BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
     
    562568            }
    563569
    564             CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pUserProc );
     570            CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
    565571            if( pMethodForOverride )
    566572            {
  • trunk/abdev/BasicCompiler_Common/src/Method.cpp

    r370 r382  
    7171}
    7272
    73 CMethod *Methods::FindForOverride( const UserProc *pUserProc )
     73CMethod *Methods::FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc )
    7474{
    7575    //メソッドのオーバーライド
     
    7777    BOOST_FOREACH( CMethod *pMethod, methods )
    7878    {
    79         if( !pMethod->IsNotUse() && pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
     79        if( !pMethod->IsNotUse() && pMethod->GetUserProc().IsEqualForOverride( actualTypeParametersForThisMethods, pUserProc ) )
    8080        {
    8181            return pMethod;
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r364 r382  
    1616#endif
    1717
     18
     19bool UserProc::IsEqualForOverride( const Types &actualTypeParametersForThisProc, const UserProc *pUserProc ) const
     20{
     21    if( this->GetName() == pUserProc->GetName()                     // 名前空間及び名前が等しい
     22        && this->Params().Equals( pUserProc->Params() ) )           // パラメータが等しい
     23    {
     24        if( this->returnType.Equals( pUserProc->returnType ) )
     25        {
     26            // 戻り値が等しい
     27            return true;
     28        }
     29
     30        if( this->returnType.IsTypeParameter() )
     31        {
     32            // 型パラメータだったとき
     33            if( actualTypeParametersForThisProc[this->returnType.GetFormalTypeIndex()].Equals( pUserProc->returnType ) )
     34            {
     35                // 戻り値が等しい
     36                return true;
     37            }
     38        }
     39    }
     40    return false;
     41}
     42   
    1843
    1944std::string UserProc::GetFullName() const
Note: See TracChangeset for help on using the changeset viewer.