Changeset 350 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Oct 14, 2007, 9:41:03 PM (17 years ago)
Author:
dai_9181
Message:

インターフェイスを実装

Location:
trunk/abdev/BasicCompiler_Common
Files:
12 edited

Legend:

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

    r322 r350  
    1111    extern HWND hMainDlg;
    1212    PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_STEPIT,0,0);
     13}
     14
     15void MakeMiddleCode( char *buffer )
     16{
     17    // 改行コードをCRLFからLFにする
     18    ChangeReturnCode( buffer );
     19
     20    // コメントを除去
     21    DeleteComment( buffer );
     22
     23    //エスケープシーケンス設定
     24    SetEscapeSequenceFormat( buffer );
     25
     26    //コマンド対応
     27    ChangeCommandToCode( buffer );
    1328}
    1429
     
    1833    lstrcpy(temp,buffer);
    1934
    20     // 改行コードをCRLFからLFにする
    21     ChangeReturnCode(temp);
    22 
    23     // コメントを除去
    24     DeleteComment( temp );
    25 
    26     //エスケープシーケンス設定
    27     SetEscapeSequenceFormat(temp);
    28 
    29     //コマンド対応
    30     ChangeCommandToCode(temp);
     35    MakeMiddleCode( temp );
    3136
    3237    //最後尾に貼り付け
  • trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp

    r347 r350  
    342342
    343343    vector<const UserProc *> userProcs;
    344     leftType.GetClass().EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
     344    leftType.GetClass().EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
    345345    if(userProcs.size()){
    346346        //オーバーロードを解決
     
    597597    if( expression[0] == '[' ){
    598598        if( !baseType.IsPointer() ){
    599             SetError(1,NULL,cp);
    600599            return false;
    601600        }
     
    716715StrLiteral:
    717716
    718                     if( baseType.IsObject() || baseType.IsNull() ){
     717                    if( !baseType.IsPointer() ){
    719718                        //要求タイプがオブジェクト、または未定のとき
    720719                        type_stack[sp]=DEF_OBJECT;
  • trunk/abdev/BasicCompiler_Common/common.h

    r331 r350  
    274274//MakeExe.cpp
    275275void StepCompileProgress(void);
     276void MakeMiddleCode( char *buffer );
    276277void AddSourceCode(const char *buffer);
    277278void OutputExe(void);
  • trunk/abdev/BasicCompiler_Common/hash.cpp

    r347 r350  
    9090            else{
    9191                //動的メソッドから列挙
    92                 pobj_c->EnumDynamicMethodsOfInterfaceMethods( NestMember, subs );
     92                pobj_c->EnumDynamicMethodsOrInterfaceMethods( NestMember, subs );
    9393            }
    9494
     
    105105
    106106        // 動的メソッド
    107         compiler.pCompilingClass->EnumDynamicMethodsOfInterfaceMethods( name, subs );
     107        compiler.pCompilingClass->EnumDynamicMethodsOrInterfaceMethods( name, subs );
    108108    }
    109109
     
    157157    if( pClass ){
    158158        vector<const UserProc *> userProcs;
    159         pClass->EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
     159        pClass->EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
    160160        if( userProcs.size() == 1 ){
    161161            return userProcs[0];
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r349 r350  
    386386
    387387    void AddMethod(CClass *pobj_c, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
    388         bool isVirtual, bool isOverride, char *buffer, int nowLine);
     388        bool isVirtual, bool isOverride, bool isAutoGeneration, char *buffer, int nowLine);
    389389
    390390    //重複チェック
     
    409409    }
    410410
    411     void EnumDynamicMethodsOfInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
    412     const CMethod *GetDynamicMethodOfInterfaceMethod( const UserProc *pUserProc ) const;
     411    void EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
     412    const CMethod *GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const;
    413413
    414414    const Methods &GetStaticMethods() const
     
    494494public:
    495495    void GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const;
     496    int GetVtblMasterListIndex( const CClass *pClass ) const;
    496497    long GetVtblMasterListOffset() const;
    497498    void GenerateVTableMasterList( const std::vector<long> &vtableMasterList, long &offset );
     
    513514        , pStringClass( NULL )
    514515        , pObjectClass( NULL )
     516        , pInterfaceInfo( NULL )
    515517    {
    516518    }
  • trunk/abdev/BasicCompiler_Common/include/Procedure.h

    r336 r350  
    323323
    324324    std::string GetFullName() const;
     325    bool IsCastOperator() const;
    325326
    326327    bool IsVirtual() const;
  • trunk/abdev/BasicCompiler_Common/include/Type.h

    r332 r350  
    189189    bool IsAny() const;
    190190    bool IsDelegate() const;
     191    bool IsInterface() const;
    191192
    192193    // オブジェクトや構造体など、メンバを持つ型かどうかを判別する
  • trunk/abdev/BasicCompiler_Common/include/option.h

    r312 r350  
    1919#ifdef USE_TRACE
    2020    // オーバーロードに関するログを生成する
    21     //#define USE_TRACE_FOR_OVERLOAD
     21    #define USE_TRACE_FOR_OVERLOAD
    2222
    2323    // モジュールサイズに関するログを生成する
    24     #define USE_TRACE_FOR_SIZE
     24    //#define USE_TRACE_FOR_SIZE
    2525
    2626    // XMLシリアライズに関するログを生成する
    27     #define USE_TRACE_FOR_SERIALIZE
     27    //#define USE_TRACE_FOR_SERIALIZE
    2828
    2929    // ソースコードステップに関するログを生成する
    30     #define USE_TRACE_FOR_SOURCECODESTEP
     30    //#define USE_TRACE_FOR_SOURCECODESTEP
    3131#endif
    3232
  • trunk/abdev/BasicCompiler_Common/include/ver.h

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

    r349 r350  
    449449    interfaces.push_back( new ::Interface( &interfaceClass ) );
    450450
     451    // キャストメソッドを追加(内部コードは自動生成すること)
     452    {
     453        // Function Operator() As ITest
     454
     455        char temporary[1024];
     456        sprintf(temporary,"%c%c%c%c()%c%c%s",
     457            1, ESC_FUNCTION,
     458            1, ESC_OPERATOR,
     459            1, ESC_AS,
     460            interfaceClass.GetName().c_str()
     461        );
     462
     463        this->AddMethod(this,
     464            Prototype::Public,
     465            0,
     466            false,          // isConst
     467            false,          // isAbstract
     468            false,          // isVirtual
     469            false,          // isOverride
     470            true,           // isAutoGeneration
     471            temporary,
     472            -1
     473        );
     474    }
     475
    451476    return true;
    452477}
     
    505530
    506531void CClass::AddMethod(CClass *pobj_c, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
    507                          bool isVirtual, bool isOverride, char *buffer, int nowLine){
     532                         bool isVirtual, bool isOverride, bool isAutoGeneration, char *buffer, int nowLine){
    508533    int i,i2;
    509534    char temporary[VN_SIZE];
     
    522547    UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Add( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,isVirtual,pobj_c, (bStatic!=0) );
    523548    if(!pUserProc) return;
     549
     550    if( isAutoGeneration )
     551    {
     552        // コード自動生成
     553        pUserProc->ThisIsAutoGenerationProc();
     554    }
    524555
    525556
     
    665696}
    666697
    667 void CClass::EnumDynamicMethodsOfInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const
     698void CClass::EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const
    668699{
    669700    // 動的メソッド
     
    676707    }
    677708}
    678 const CMethod *CClass::GetDynamicMethodOfInterfaceMethod( const UserProc *pUserProc ) const
     709const CMethod *CClass::GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const
    679710{
    680711    // 動的メソッド
     
    687718        {
    688719            result = pInterface->GetDynamicMethods().GetMethodPtr( pUserProc );
     720            if( result )
     721            {
     722                return result;
     723            }
    689724        }
    690725    }
     
    854889    SetError();
    855890    return;
     891}
     892int CClass::GetVtblMasterListIndex( const CClass *pClass ) const
     893{
     894    int result = 0;
     895
     896    BOOST_FOREACH( const ::Interface *pInterface, interfaces )
     897    {
     898        result++;
     899       
     900        if( &pInterface->GetClass() == pClass )
     901        {
     902            return result;
     903        }
     904    }
     905
     906    SetError();
     907    return 0;
    856908}
    857909long CClass::GetVtblMasterListOffset() const
     
    14281480                pobj_c->AddMethod(pobj_c,
    14291481                    Prototype::Public,  //Publicアクセス権
    1430                     0,                  //Static指定なし
    1431                     false,              //Constではない
    1432                     1,                  //Abstract
    1433                     1,                  //Virtual
    1434                     0,
     1482                    0,                  // bStatic
     1483                    false,              // isConst
     1484                    true,               // isAbstract
     1485                    true,               // isVirtual
     1486                    false,              // isOverride
     1487                    false,              // isAutoGeneration
    14351488                    temporary,
    14361489                    sub_address
     
    17191772                        isVirtual,
    17201773                        isOverride,
     1774                        false,
    17211775                        temporary,
    17221776                        sub_address);
     
    19462000        }
    19472001
    1948         pCompilingMethod = pParentClass->GetDynamicMethodOfInterfaceMethod( pUserProc );
     2002        pCompilingMethod = pParentClass->GetDynamicMethodOrInterfaceMethod( pUserProc );
    19492003        if( !pCompilingMethod ){
    19502004            pCompilingMethod = pParentClass->GetStaticMethods().GetMethodPtr( pUserProc );
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r336 r350  
    2424
    2525    return GetName();
     26}
     27bool UserProc::IsCastOperator() const
     28{
     29    if( GetName()[0] == 1 && GetName()[1] == ESC_OPERATOR && GetName()[2] == CALC_AS )
     30    {
     31        return true;
     32    }
     33    return false;
    2634}
    2735const NamespaceScopes &UserProc::GetNamespaceScopes() const
  • trunk/abdev/BasicCompiler_Common/src/Type.cpp

    r335 r350  
    211211    if( IsObject() )
    212212    {
    213         if( GetClass().IsInterface() ){
    214             // vtblOffsetのサイズを含める
    215             return PTR_SIZE*2;
    216         }
    217213        return PTR_SIZE;
    218214    }
     
    298294bool Type::IsPointer( int basicType )
    299295{
     296    if( basicType == DEF_NON )
     297    {
     298        return false;
     299    }
     300
    300301    if(PTR_LEVEL( basicType )|| basicType == DEF_PTR_VOID || basicType == DEF_PTR_PROC
    301302        || ( basicType & FLAG_PTR ) ){
     
    448449    return ( IsObject() && GetClass().IsDelegate() );
    449450}
     451bool Type::IsInterface() const
     452{
     453    return ( IsObject() && GetClass().IsInterface() );
     454}
     455
    450456
    451457bool Type::HasMember() const
Note: See TracChangeset for help on using the changeset viewer.