Ignore:
Timestamp:
Jan 2, 2008, 1:21:43 AM (16 years ago)
Author:
dai_9181
Message:

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

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

Legend:

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

    r325 r383  
    11#include "stdafx.h"
    22
     3
     4bool Parameter::Equals( const Parameter &param ) const
     5{
     6    if( Type::Equals( param ) )
     7    {
     8        return true;
     9    }
     10    else
     11    {
     12        if( this->isRef && this->GetBasicType() == DEF_ANY &&
     13            param.isRef == false && param.IsPointer()
     14            ||
     15            this->isRef == false && this->IsPointer() &&
     16            param.isRef && param.GetBasicType() == DEF_ANY )
     17        {
     18            /* ByRef var As Any
     19                    と
     20                var As VoidPtr
     21                は同等
     22            */
     23            return true;
     24        }
     25    }
     26
     27    return false;
     28}
     29bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter &param ) const
     30{
     31    if( Equals( param ) )
     32    {
     33        return true;
     34    }
     35   
     36    if( this->IsTypeParameter() )
     37    {
     38        // 型パラメータだったとき
     39        if( actualTypeParametersForThisProc[this->GetFormalTypeIndex()].Equals( param ) )
     40        {
     41            // 戻り値が等しい
     42            return true;
     43        }
     44    }
     45
     46    return false;
     47}
     48
     49bool Parameters::Equals( const Parameters &params ) const
     50{
     51    if( this->size() != params.size() ){
     52        return false;
     53    }
     54
     55    int max = (int)this->size();
     56    for( int i=0; i<max; i++ ){
     57        if( !(*this)[i]->Equals( *params[i] ) ){
     58            return false;
     59        }
     60    }
     61
     62    return true;
     63}
     64bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters &params ) const
     65{
     66    if( this->size() != params.size() ){
     67        return false;
     68    }
     69
     70    int max = (int)this->size();
     71    for( int i=0; i<max; i++ ){
     72        if( !(*this)[i]->Equals( actualTypeParametersForThisProc, *params[i] ) ){
     73            return false;
     74        }
     75    }
     76
     77    return true;
     78}
    379
    480bool Parameters::Analyze( const char *sourceOfParams, int nowLine )
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r382 r383  
    2020{
    2121    if( this->GetName() == pUserProc->GetName()                     // 名前空間及び名前が等しい
    22         && this->Params().Equals( pUserProc->Params() ) )           // パラメータが等しい
     22        && this->Params().Equals( actualTypeParametersForThisProc, pUserProc->Params() ) )          // パラメータが等しい
    2323    {
    2424        if( this->returnType.Equals( pUserProc->returnType ) )
Note: See TracChangeset for help on using the changeset viewer.