Changeset 353 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Oct 21, 2007, 3:37:31 PM (17 years ago)
Author:
dai_9181
Message:

インターフェイス実装周りの仕様整備

Location:
trunk/abdev/BasicCompiler_Common
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/ParamImpl.cpp

    r319 r353  
    204204
    205205const UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType ){
    206     int sw=0;
    207     const UserProc *pUserProc;
    208     pUserProc=0;
     206    const UserProc *pUserProc = NULL;
    209207
    210208    for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
     
    213211
    214212            if(EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type() )){
    215                 trace_for_overload( "レベル" << level <<   " ○適合..." << pTempUserProc->_paramStr );
    216 
    217                 if(sw){
     213                trace_for_overload( "レベル" << level << " ○適合..." << pTempUserProc->_paramStr );
     214
     215                if( pUserProc ){
    218216                    if( isEnabledReturnType ){
    219217                        SetError(52,name,cp);
    220 
    221                         return 0;
    222218                    }
    223219                    else{
     
    229225                    }
    230226                }
    231                 sw=1;
    232227
    233228                pUserProc = pTempUserProc;
     
    235230            else
    236231            {
    237                 trace_for_overload( "レベル" << level <<   " ×不適合..." << pTempUserProc->_paramStr );
    238             }
    239         }
    240 
    241         if( sw ) break;
    242     }
    243 
    244     if(!sw){
     232                trace_for_overload( "レベル" << level << " ×不適合..." << pTempUserProc->_paramStr );
     233            }
     234        }
     235
     236        if( pUserProc ) break;
     237    }
     238
     239    if( !pUserProc ){
    245240        BOOST_FOREACH( const UserProc *pTempUserProc, subs ){
    246241
    247242            //エラーチェック
    248243            if(pTempUserProc->Params().size()==this->ParmsNum){
    249                 if(sw){
    250                     sw=0;
    251                     break;
    252                 }
    253                 sw=1;
     244                if( pUserProc ){
     245                    SetError(52,name,cp);
     246                }
    254247
    255248                pUserProc=pTempUserProc;
     
    258251    }
    259252
    260     if(!sw){
    261         SetError(52,name,cp);
    262 
    263         return 0;
    264     }
    265 
     253    if( !pUserProc )
     254    {
     255        SetError();
     256    }
    266257
    267258    return pUserProc;
  • trunk/abdev/BasicCompiler_Common/Subroutine.cpp

    r342 r353  
    428428                if(source[i]=='\0') break;
    429429            }
    430             userProcs.Add(namespaceScopes, importedNamespaces, temporary,i,false,NULL,false);
     430            userProcs.AddUserProc(namespaceScopes, importedNamespaces, temporary,i,false,NULL,false);
    431431
    432432            /*  Sub ~ End Sub
     
    461461    compiler.globalAreaProcName = "_System_GlobalArea_" + compiler.GetModuleName();
    462462    sprintf(temporary,"%c%c%s()",1,ESC_SUB,compiler.globalAreaProcName.c_str());
    463     userProcs.Add( namespaceScopes, importedNamespaces, temporary,0,false,NULL,false);
     463    userProcs.AddUserProc( namespaceScopes, importedNamespaces, temporary,0,false,NULL,false);
    464464}
    465465
  • trunk/abdev/BasicCompiler_Common/error.cpp

    r351 r353  
    147147    if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています。");
    148148    if(num==50) sprintf(msg,"%sに変換できません。",tempKeyWord);
    149     if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は1,2,4,8,16のいずれかでなければなりません。");
     149    if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は 1, 2, 4, 8, 16 のいずれかでなければなりません。");
    150150    if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません。",tempKeyWord);
    151151    if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります。",tempKeyWord);
     
    164164    if(num==66) sprintf(msg,"%s 要求されている関数ポインタのパラメータまたは戻り値が一致しません。", tempKeyWord );
    165165    if(num==67) sprintf(msg,"%s 要求されているデリゲートのパラメータまたは戻り値が一致しません。", tempKeyWord );
     166    if(num==68) sprintf(msg,"\"%s\" 不正な関数名です。", tempKeyWord);
     167    if(num==69) sprintf(msg,"\"%s\" 不正なメソッド名です。", tempKeyWord);
    166168
    167169
     
    204206    if(num==137) lstrcpy(msg,"ImplementsはClass定義内の先頭に記述する必要があります。");
    205207    if(num==138) sprintf(msg,"%s はインターフェイスではありません。Implementsできるのはインターフェイスに限ります。",tempKeyWord);
     208    if(num==139) sprintf(msg,"%s はインターフェイスではありません。",tempKeyWord);
    206209
    207210    //Enum関連
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r350 r353  
    7777    mutable LONG_PTR vtblOffset;
    7878
     79    // XMLシリアライズ用
     80private:
     81    friend class boost::serialization::access;
     82    template<class Archive> void serialize(Archive& ar, const unsigned int version)
     83    {
     84        trace_for_serialize( "serializing - Interface" );
     85
     86        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( DynamicMethodsPrototype );
     87        ar & boost::serialization::make_nvp("pInterfaceClass", const_cast<CClass *&>(pInterfaceClass) );
     88        ar & BOOST_SERIALIZATION_NVP( vtblOffset );
     89    }
     90
    7991public:
    8092    Interface( const CClass *pInterfaceClass );
     
    8395        , pInterfaceClass( objInterface.pInterfaceClass )
    8496        , vtblOffset( objInterface.vtblOffset )
     97    {
     98    }
     99    Interface()
    85100    {
    86101    }
     
    151166
    152167    // XMLシリアライズ用
    153     // TODO: xml未完成
    154168private:
    155169    friend class boost::serialization::access;
     
    165179        ar & BOOST_SERIALIZATION_NVP( superClassActualTypeParameters );
    166180        ar & BOOST_SERIALIZATION_NVP( blittableType );
    167         //ar & BOOST_SERIALIZATION_NVP( interfaces );
     181        ar & BOOST_SERIALIZATION_NVP( interfaces );
    168182        ar & BOOST_SERIALIZATION_NVP( dynamicMembers );
    169183        ar & BOOST_SERIALIZATION_NVP( staticMembers );
  • trunk/abdev/BasicCompiler_Common/include/Method.h

    r352 r353  
    11#pragma once
    2 
    3 #include <string>
    4 #include <vector>
    5 
    6 #include <option.h>
    7 #include <Program.h>
    8 #include <Class.h>
    9 #include <Procedure.h>
    10 
    11 #include <windows.h>
    122
    133using namespace std;
  • trunk/abdev/BasicCompiler_Common/include/Procedure.h

    r351 r353  
    1313
    1414class CClass;
     15class Interface;
    1516class CMethod;
    1617
     
    122123    // 親クラスと対応するメソッド
    123124    const CClass *pParentClass;
     125    const Interface *pInterface;
    124126    CMethod *pMethod;
    125127
     
    160162        ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
    161163        ar & boost::serialization::make_nvp("pParentClass", const_cast<CClass *&>(pParentClass) );
     164        ar & boost::serialization::make_nvp("pInterface", const_cast<Interface *&>(pInterface) );
    162165        ar & BOOST_SERIALIZATION_NVP( pMethod );
    163166        ar & BOOST_SERIALIZATION_NVP( isMacro );
     
    182185        , importedNamespaces( importedNamespaces )
    183186        , pParentClass( NULL )
     187        , pInterface( NULL )
    184188        , pMethod( NULL )
    185189        , isMacro( isMacro )
     
    211215    {
    212216        if( this->GetParentClassPtr() == pUserProc->GetParentClassPtr() // 親クラスが等しい
     217            && this->pInterface == pUserProc->pInterface                // インターフェイスが等しい
    213218            && pUserProc->IsEqualSymbol( *this )                        // 名前空間及び名前が等しい
    214219            && this->Params().Equals( pUserProc->Params() )             // パラメータが等しい
     
    358363        return ( pParentClass == NULL );
    359364    }
     365    void SetInterface( const Interface *pInterface )
     366    {
     367        this->pInterface = pInterface;
     368    }
    360369    void SetMethod( CMethod *pMethod ){
    361370        this->pMethod = pMethod;
     
    417426    bool Insert( UserProc *pUserProc, int nowLine );
    418427
    419     UserProc *Add( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic);
     428    UserProc *AddUserProc( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic, char *interfaceName = NULL );
    420429
    421430    void EnumGlobalProcs( const char *simpleName, const char *localName, std::vector<const UserProc *> &subs );
  • trunk/abdev/BasicCompiler_Common/include/option.h

    r350 r353  
    1414    #define USE_TRACE
    1515#else
    16     //#define USE_TRACE
     16    #define USE_TRACE
    1717#endif
    1818
     
    2828
    2929    // ソースコードステップに関するログを生成する
    30     //#define USE_TRACE_FOR_SOURCECODESTEP
     30    #define USE_TRACE_FOR_SOURCECODESTEP
    3131#endif
    3232
  • trunk/abdev/BasicCompiler_Common/include/ver.h

    r350 r353  
    66// バージョン付加文字列
    77#ifdef _AMD64_
    8 #define VER_INFO        "(x64) (rev.356)"
     8#define VER_INFO        "(x64) (rev.357)"
    99#else
    10 #define VER_INFO        "(rev.356)"
     10#define VER_INFO        "(rev.357)"
    1111#endif
  • trunk/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp

    r322 r353  
    3434
    3535#include <BoostSerializationSupport.h>
     36#include <Hashmap.h>
    3637#include <Compiler.h>
    3738
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r352 r353  
    573573
    574574    //関数ハッシュへ登録
    575     UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Add( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,isVirtual,pobj_c, (bStatic!=0) );
     575    char interfaceName[VN_SIZE] = "";
     576    UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().AddUserProc( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,isVirtual,pobj_c, (bStatic!=0), interfaceName );
    576577    if(!pUserProc) return;
    577578
     
    657658        BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
    658659        {
     660            if( interfaceName[0] )
     661            {
     662                if( pInterface->GetClass().GetName() != interfaceName )
     663                {
     664                    // 指定されたインターフェイス名と整合しないとき
     665                    continue;
     666                }
     667            }
     668
    659669            CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pUserProc );
    660670            if( pMethodForOverride )
     
    665675            }
    666676        }
     677    }
     678
     679    if( interfaceName[0] )
     680    {
     681        SetError(139,interfaceName,nowLine);
    667682    }
    668683
  • trunk/abdev/BasicCompiler_Common/src/Method.cpp

    r352 r353  
    7777    BOOST_FOREACH( CMethod *pMethod, methods )
    7878    {
    79         if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
     79        if( !pMethod->IsNotUse() && pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
    8080        {
    8181            return pMethod;
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r350 r353  
    451451    return true;
    452452}
    453 UserProc *UserProcs::Add( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic)
     453UserProc *UserProcs::AddUserProc( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic, char *interfaceName )
    454454{
    455455    int i2,i3;
     
    545545            temporary[i2]=buffer[i];
    546546        }
     547
     548        char parentName[VN_SIZE], memberName[VN_SIZE];
     549        ReferenceKind refKind;
     550        if( SplitMemberName( temporary, parentName, memberName, refKind ) )
     551        {
     552            if( pobj_c )
     553            {
     554                if( interfaceName )
     555                {
     556                    lstrcpy( interfaceName, parentName );
     557                }
     558                else
     559                {
     560                    SetError();
     561                    return NULL;
     562                }
     563
     564                char dummyMemberName[VN_SIZE];
     565                if( SplitMemberName( memberName, parentName, dummyMemberName, refKind ) )
     566                {
     567                    SetError(69,temporary,nowLine);
     568                    return NULL;
     569                }
     570            }
     571            else
     572            {
     573                SetError(68,temporary,nowLine);
     574                return NULL;
     575            }
     576
     577            lstrcpy( temporary, memberName );
     578        }
    547579    }
    548580
     
    573605        // すべての関数・メソッドをコンパイルする
    574606        pUserProc->Using();
     607    }
     608
     609    // 親インターフェイスをセット
     610    if( interfaceName && interfaceName[0] )
     611    {
     612        ::Interface *pTargetInterface = NULL;
     613        BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
     614        {
     615            if( pInterface->GetClass().GetName() == interfaceName )
     616            {
     617                pTargetInterface = pInterface;
     618                break;
     619            }
     620        }
     621        pUserProc->SetInterface( pTargetInterface );
    575622    }
    576623
Note: See TracChangeset for help on using the changeset viewer.