Ignore:
Timestamp:
Oct 9, 2007, 1:10:33 AM (17 years ago)
Author:
dai_9181
Message:

vtblの構造を変更。vtblMasterListをはさんでvtblを表現した。
その他メンバ名変更。
ClassPrototypeクラスを追加。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r340 r342  
    1212class Delegate;
    1313
    14 class InheritedInterface
     14class ClassPrototype : public Prototype
    1515{
    16     CClass *pInterfaceClass;
    17     int vtblOffset;
    18 public:
    19     InheritedInterface( CClass *pInterfaceClass, int vtblOffset )
     16    // 動的メソッド
     17    Methods dynamicMethods;
     18
     19    // XMLシリアライズ用
     20private:
     21    friend class boost::serialization::access;
     22    template<class Archive> void serialize(Archive& ar, const unsigned int version)
     23    {
     24        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Prototype );
     25        ar & BOOST_SERIALIZATION_NVP( dynamicMethods );
     26    }
     27
     28public:
     29    ClassPrototype( const NamespaceScopes &namespaceScopes, const string &name )
     30        : Prototype( namespaceScopes, name )
     31    {
     32    }
     33    ClassPrototype()
     34        : Prototype()
     35    {
     36    }
     37    const Methods &GetDynamicMethods() const
     38    {
     39        return dynamicMethods;
     40    }
     41    Methods &GetDynamicMethods()
     42    {
     43        return dynamicMethods;
     44    }
     45};
     46
     47class Interface : public ClassPrototype
     48{
     49    const CClass *pInterfaceClass;
     50    mutable int vtblOffset;
     51public:
     52    Interface( const CClass *pInterfaceClass )
    2053        : pInterfaceClass( pInterfaceClass )
    21         , vtblOffset( vtblOffset )
    22     {
    23     }
    24 
    25     CClass &GetInterfaceClass() const{
     54        , vtblOffset( -1 )
     55    {
     56    }
     57
     58    const CClass &GetClass() const{
    2659        return *pInterfaceClass;
    2760    }
    28     int GetVtblOffset() const
     61    LONG_PTR GetVtblOffset() const
    2962    {
    3063        return vtblOffset;
    3164    }
     65    void SetVtblOffset( LONG_PTR vtblOffset ) const
     66    {
     67        this->vtblOffset = vtblOffset;
     68    }
    3269};
    33 typedef vector<InheritedInterface> Interfaces;
    34 
    35 class CClass: public Prototype, public Jenga::Common::ObjectInHashmap<CClass>
     70typedef std::vector<Interface> Interfaces;
     71
     72class CClass: public ClassPrototype, public Jenga::Common::ObjectInHashmap<CClass>
    3673{
    3774public:
     
    73110
    74111    // 動的メソッド
    75     Methods methods;
    76112    int ConstructorMemberSubIndex;
    77113    int DestructorMemberSubIndex;
     
    92128        trace_for_serialize( "serializing - CClass" );
    93129
    94         ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Prototype );
     130        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( ClassPrototype );
    95131        ar & BOOST_SERIALIZATION_NVP( classType );
    96132        ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
     
    102138        ar & BOOST_SERIALIZATION_NVP( dynamicMembers );
    103139        ar & BOOST_SERIALIZATION_NVP( staticMembers );
    104         ar & BOOST_SERIALIZATION_NVP( methods );
    105140        ar & BOOST_SERIALIZATION_NVP( ConstructorMemberSubIndex );
    106141        ar & BOOST_SERIALIZATION_NVP( DestructorMemberSubIndex );
     
    114149
    115150    CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name )
    116         : Prototype( namespaceScopes, name )
     151        : ClassPrototype( namespaceScopes, name )
    117152        , importedNamespaces( importedNamespaces )
    118153        , classType( Class )
     
    131166    }
    132167    CClass()
    133         : Prototype()
     168        : ClassPrototype()
    134169        , importedNamespaces()
    135170        , classType()
     
    292327        return ( interfaces.size() != 0 );
    293328    }
     329    const Interfaces &GetInterfaces() const
     330    {
     331        return interfaces;
     332    }
    294333    bool IsInheritsInterface( const CClass *pInterfaceClass ) const;
    295334
     
    300339
    301340    // インターフェイス実装
     341    bool Implements( const CClass &interfaceClass, int nowLine );
    302342    bool Implements( const char *interfaceNames, int nowLine );
    303343
     
    331371    }
    332372
    333     const Methods &GetMethods() const
    334     {
    335         return methods;
    336     }
    337373    const Methods &GetStaticMethods() const
    338374    {
    339375        return staticMethods;
    340     }
    341     Methods &GetMethods()
    342     {
    343         return methods;
    344376    }
    345377    Methods &GetStaticMethods()
     
    352384    {
    353385        if( ConstructorMemberSubIndex == -1 ) return NULL;
    354         return methods[ConstructorMemberSubIndex];
     386        return GetDynamicMethods()[ConstructorMemberSubIndex];
    355387    }
    356388    void SetConstructorMemberSubIndex( int constructorMemberSubIndex )
     
    363395    {
    364396        if( DestructorMemberSubIndex == -1 ) return NULL;
    365         return methods[DestructorMemberSubIndex];
     397        return GetDynamicMethods()[DestructorMemberSubIndex];
    366398    }
    367399    void SetDestructorMemberSubIndex( int destructorMemberSubIndex )
     
    373405    const ::Delegate &GetDelegate() const;
    374406
     407    // ユーザ指定のアラインメント固定値
     408    int GetFixedAlignment() const
     409    {
     410        return fixedAlignment;
     411    }
     412    void SetFixedAlignment( int fixedAlignment )
     413    {
     414        this->fixedAlignment = fixedAlignment;
     415    }
     416
     417    // メンバの総合サイズを取得
     418    int GetSize() const;
     419
     420    // メンバのオフセットを取得
     421    int GetMemberOffset( const char *memberName, int *pMemberNum = NULL ) const;
     422private:
     423    // アラインメント値を取得
     424    int GetAlignment() const;
     425
     426
     427    /////////////////////////////////////////////////////////////////
     428    // vtbl
     429    /////////////////////////////////////////////////////////////////
     430public:
    375431    // vtblに存在する仮想関数の数
    376432    int GetVtblNum() const
     
    390446        return ( vtblNum > 0 );
    391447    }
    392 
    393     // ユーザ指定のアラインメント固定値
    394     int GetFixedAlignment() const
    395     {
    396         return fixedAlignment;
    397     }
    398     void SetFixedAlignment( int fixedAlignment )
    399     {
    400         this->fixedAlignment = fixedAlignment;
    401     }
    402 
    403     // メンバの総合サイズを取得
    404     int GetSize() const;
    405 
    406     // メンバのオフセットを取得
    407     int GetMemberOffset( const char *memberName, int *pMemberNum = NULL ) const;
    408 private:
    409     // アラインメント値を取得
    410     int GetAlignment() const;
    411 
    412     //vtbl
    413 protected:
    414     mutable long vtbl_offset;
    415 public:
     448   
     449private:
     450    long vtbl_offset;
     451    long vtblMasterListOffset;
     452    std::vector<LONG_PTR> vtblMasterList;
     453public:
     454    int GetVtblMasterListIndex( const UserProc *pUserProc ) const;
    416455    int GetFuncNumInVtbl( const UserProc *pUserProc ) const;
    417     LONG_PTR GetVtblGlobalOffset(void) const;
    418     void GenerateVTables();
    419     void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
     456    LONG_PTR GetVtblMasterListOffset() const;
     457    void GenerateVTablePart( LONG_PTR &vtableDataTableOffset ) const;
     458    void GenerateVTableMasterList( const std::vector<LONG_PTR> &vtableMasterList, LONG_PTR &offset );
     459    void GenerateFullVTables();
     460    void ActionVtblSchedule( LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection );
    420461    bool IsAbstract() const;
    421462
     
    444485    virtual void CollectClassesForNameOnly( const BasicSource &source );
    445486
     487    // vtblを一時的に生成
    446488    void GenerateVTables();
    447     void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
     489
     490    // vtblのを正規のオフセットで再構築
     491    void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection );
    448492
    449493    virtual void InitStaticMember();
Note: See TracChangeset for help on using the changeset viewer.