Changeset 449 in dev for trunk/ab5.0/abdev/BasicCompiler32


Ignore:
Timestamp:
Mar 22, 2008, 1:56:31 AM (17 years ago)
Author:
dai_9181
Message:

・デリゲートの共変戻り値、反変引数に対応した。
・core.libで定義されたデリゲートがアプリケーションプロジェクトで利用できないバグを修正。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler32/Compile_Func.cpp

    r431 r449  
    436436{
    437437    extern int cp;
     438
     439    const Parameters *pBaseParams = NULL;
     440    const Type *pBaseReturnType = NULL;
     441    if( baseType.IsProcPtr() )
     442    {
     443        // 左辺で関数ポインタを要求されているとき
     444        const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()];
     445        pBaseParams = &pTempProcPointer->Params();
     446        pBaseReturnType = &pTempProcPointer->ReturnType();
     447    }
     448    else if( baseType.IsDelegate() )
     449    {
     450        // 左辺でデリゲートを要求されているとき
     451        const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate();
     452        pBaseParams = &pTempDelegate->Params();
     453        pBaseReturnType = &pTempDelegate->ReturnType();
     454    }
     455
    438456    const UserProc *pUserProc;
    439 
    440     const Parameters *pBaseParams = NULL;
    441     if( baseType.IsProcPtr() )
    442     {
    443         // 左辺で関数ポインタを要求されているとき
    444         pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params();
    445     }
    446     else if( baseType.IsDelegate() )
    447     {
    448         // 左辺でデリゲートを要求されているとき
    449         pBaseParams = &baseType.GetClass().GetDelegate().Params();
    450     }
    451 
    452     if( pBaseParams )
     457    if( pBaseParams && pBaseReturnType )
    453458    {
    454459        //左辺の型にのっとり、オーバーロードを解決
     
    464469        pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
    465470
    466         if( isCallOn && baseType.IsDelegate() )
     471        if( isCallOn )
    467472        {
    468473            // コード生成を伴う場合はエラーチェックを行う
    469             if( !pUserProc->Params().Equals( *pBaseParams )
    470                 || !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType() ) )
     474
     475            if( baseType.IsDelegate() )
    471476            {
    472                 if( baseType.IsDelegate() )
     477                // デリゲート
     478                // 共変戻り値、反変引数をサポート
     479                if( !(
     480                    pBaseParams->Equals( pUserProc->Params(), true )
     481                    && ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) )
     482                    ) )
    473483                {
    474484                    SetError(67, name, cp );
    475485                }
    476                 else
     486            }
     487            else
     488            {
     489                // 関数ポインタ
     490                if( !(
     491                    pBaseParams->Equals( pUserProc->Params() )
     492                    && pBaseReturnType->Equals( pUserProc->ReturnType() )
     493                    ) )
    477494                {
    478495                    SetError(66, name, cp );
Note: See TracChangeset for help on using the changeset viewer.