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


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

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

File:
1 edited

Legend:

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

    r432 r449  
    288288{
    289289    extern int cp;
     290
     291    const Parameters *pBaseParams = NULL;
     292    const Type *pBaseReturnType = NULL;
     293    if( baseType.IsProcPtr() )
     294    {
     295        // 左辺で関数ポインタを要求されているとき
     296        const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()];
     297        pBaseParams = &pTempProcPointer->Params();
     298        pBaseReturnType = &pTempProcPointer->ReturnType();
     299    }
     300    else if( baseType.IsDelegate() )
     301    {
     302        // 左辺でデリゲートを要求されているとき
     303        const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate();
     304        pBaseParams = &pTempDelegate->Params();
     305        pBaseReturnType = &pTempDelegate->ReturnType();
     306    }
     307
    290308    const UserProc *pUserProc;
    291 
    292     const Parameters *pBaseParams = NULL;
    293     if( baseType.IsProcPtr() )
    294     {
    295         // 左辺で関数ポインタを要求されているとき
    296         pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params();
    297     }
    298     else if( baseType.IsDelegate() )
    299     {
    300         // 左辺でデリゲートを要求されているとき
    301         pBaseParams = &baseType.GetClass().GetDelegate().Params();
    302     }
    303 
    304     if( pBaseParams )
     309    if( pBaseParams && pBaseReturnType )
    305310    {
    306311        //左辺の型にのっとり、オーバーロードを解決
     
    316321        pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
    317322
    318         if( isCallOn && baseType.IsDelegate() )
     323        if( isCallOn )
    319324        {
    320325            // コード生成を伴う場合はエラーチェックを行う
    321             if( !pUserProc->Params().Equals( *pBaseParams )
    322                 || !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType() ) )
     326
     327            if( baseType.IsDelegate() )
    323328            {
    324                 if( baseType.IsDelegate() )
     329                // デリゲート
     330                // 共変戻り値、反変引数をサポート
     331                if( !(
     332                    pBaseParams->Equals( pUserProc->Params(), true )
     333                    && ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) )
     334                    ) )
    325335                {
    326336                    SetError(67, name, cp );
    327337                }
    328                 else
     338            }
     339            else
     340            {
     341                // 関数ポインタ
     342                if( !(
     343                    pBaseParams->Equals( pUserProc->Params() )
     344                    && pBaseReturnType->Equals( pUserProc->ReturnType() )
     345                    ) )
    329346                {
    330347                    SetError(66, name, cp );
Note: See TracChangeset for help on using the changeset viewer.