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


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

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

Location:
trunk/ab5.0/abdev
Files:
4 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 );
  • 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 );
  • trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h

    r448 r449  
    1111{
    1212    friend Delegates;
     13
     14    // importされている名前空間
     15    NamespaceScopesCollection importedNamespaces;
    1316
    1417    std::string paramStr;
     
    2629
    2730        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
     31        ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
    2832        ar & BOOST_SERIALIZATION_NVP( dynamicParams );
    2933    }
    3034
    3135public:
    32     Delegate( const NamespaceScopes &namespaceScopes, const std::string &name, Procedure::Kind procKind, const char *paramStr, const std::string &returnTypeName, int sourceIndex )
     36    Delegate( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const std::string &name, Procedure::Kind procKind, const char *paramStr, const std::string &returnTypeName, int sourceIndex )
    3337        : Procedure( namespaceScopes, name, procKind, false )
     38        , importedNamespaces( importedNamespaces )
    3439        , paramStr( paramStr )
    3540        , returnTypeName( returnTypeName )
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp

    r448 r449  
    55void Delegate::RefleshParameterAndReturnType()
    66{
     7    compiler.GetNamespaceSupporter().SetImportedNamespaces( this->importedNamespaces );
     8    compiler.GetNamespaceSupporter().SetLivingNamespaceScopes( this->GetNamespaceScopes() );
     9
    710    // パラメータを解析
    811    params.Analyze( paramStr.c_str(), sourceIndex );
     
    151154            }
    152155
    153             this->Put( new Delegate( namespaceScopes, name, procKind, paramStr, returnTypeName, nowLine ) );
     156            this->Put( new Delegate( namespaceScopes, importedNamespaces, name, procKind, paramStr, returnTypeName, nowLine ) );
    154157        }
    155158    }
Note: See TracChangeset for help on using the changeset viewer.