source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/include/Class.h @ 540

Last change on this file since 540 was 540, checked in by dai_9181, 15 years ago

StartCompileメソッドを廃止し、Usingメソッドのオーバーロードに差し替えた。

File size: 13.0 KB
Line 
1#pragma once
2
3class UserProc;
4class Delegate;
5
6class ClassPrototype : public Prototype, public DynamicMethodsPrototype
7{
8    // XMLシリアライズ用
9private:
10    friend class boost::serialization::access;
11    template<class Archive> void serialize(Archive& ar, const unsigned int version)
12    {
13        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Prototype );
14        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( DynamicMethodsPrototype );
15    }
16
17public:
18    ClassPrototype( const NamespaceScopes &namespaceScopes, const std::string &name )
19        : Prototype( namespaceScopes, name )
20        , DynamicMethodsPrototype()
21    {
22    }
23    ClassPrototype()
24        : Prototype()
25        , DynamicMethodsPrototype()
26    {
27    }
28};
29
30class CClass: public ClassPrototype, public Jenga::Common::ObjectInHashmap<CClass>
31{
32public:
33    // 型の種類
34    enum ClassType{
35        Class,
36        Interface,
37        ComInterface,
38        Enum,
39        Delegate,
40        Structure,
41    };
42
43private:
44    ClassType classType;
45
46    // importされている名前空間
47    NamespaceScopesCollection importedNamespaces;
48
49    // 型パラメータ
50    GenericTypes formalGenericTypes;
51
52    // 基底クラス
53    const CClass *pSuperClass;
54
55    // 基底クラスの型パラメータ(実パラメータ)
56    Types superClassActualTypeParameters;
57
58    // Blittable型情報
59    Type blittableType;
60
61    // 実装するインターフェイス
62    Interfaces interfaces;
63
64    // 動的メンバ
65    Members dynamicMembers;
66
67    // 静的メンバ
68    Members staticMembers;
69
70    // 動的メソッド
71    int ConstructorMemberSubIndex;
72    int DestructorMemberSubIndex;
73    int vtblNum;                    // 仮想関数の数
74
75    // 静的メソッド
76    Methods staticMethods;
77
78    //アラインメント値
79    int fixedAlignment;
80
81    // XMLシリアライズ用
82private:
83    friend class boost::serialization::access;
84    template<class Archive> void serialize(Archive& ar, const unsigned int version)
85    {
86        trace_for_serialize( "serializing - CClass" );
87
88        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( ClassPrototype );
89        ar & BOOST_SERIALIZATION_NVP( classType );
90        ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
91        ar & BOOST_SERIALIZATION_NVP( formalGenericTypes );
92        ar & boost::serialization::make_nvp( "pSuperClass", const_cast<CClass *&>(pSuperClass) );
93        ar & BOOST_SERIALIZATION_NVP( superClassActualTypeParameters );
94        ar & BOOST_SERIALIZATION_NVP( blittableType );
95        ar & BOOST_SERIALIZATION_NVP( interfaces );
96        ar & BOOST_SERIALIZATION_NVP( dynamicMembers );
97        ar & BOOST_SERIALIZATION_NVP( staticMembers );
98        ar & BOOST_SERIALIZATION_NVP( ConstructorMemberSubIndex );
99        ar & BOOST_SERIALIZATION_NVP( DestructorMemberSubIndex );
100        ar & BOOST_SERIALIZATION_NVP( vtblNum );
101        ar & BOOST_SERIALIZATION_NVP( staticMethods );
102        ar & BOOST_SERIALIZATION_NVP( fixedAlignment );
103    }
104
105    bool isReady;
106public:
107
108    CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const std::string &name )
109        : ClassPrototype( namespaceScopes, name )
110        , importedNamespaces( importedNamespaces )
111        , classType( Class )
112        , pSuperClass( NULL )
113        , blittableType( Type() )
114        , isReady( false )
115        , fixedAlignment( 0 )
116        , ConstructorMemberSubIndex( -1 )
117        , DestructorMemberSubIndex( -1 )
118        , vtblNum( 0 )
119        , vtbl_offset( -1 )
120        , comVtblOffset( 0 )
121        , isCompilingConstructor( false )
122        , isCompilingDestructor( false )
123        , cacheSize( 0 )
124    {
125    }
126    CClass()
127        : ClassPrototype()
128        , importedNamespaces()
129        , classType()
130        , pSuperClass( NULL )
131        , blittableType( Type() )
132        , isReady( false )
133        , fixedAlignment( 0 )
134        , ConstructorMemberSubIndex( -1 )
135        , DestructorMemberSubIndex( -1 )
136        , vtblNum( 0 )
137        , vtbl_offset( -1 )
138        , comVtblOffset( 0 )
139        , isCompilingConstructor( false )
140        , isCompilingDestructor( false )
141        , cacheSize( 0 )
142    {
143    }
144    ~CClass()
145    {
146        // 動的メンバ
147        BOOST_FOREACH( CMember *member, dynamicMembers )
148        {
149            delete member;
150        }
151
152        // 静的メンバ
153        BOOST_FOREACH( CMember *member, staticMembers )
154        {
155            delete member;
156        }
157
158        // インターフェイス
159        BOOST_FOREACH( ::Interface *pInterface, interfaces )
160        {
161            delete pInterface;
162        }
163    }
164
165    virtual const std::string &GetKeyName() const
166    {
167        return GetName();
168    }
169    virtual bool IsDuplication( const CClass *pClass ) const
170    {
171        if( pClass->IsEqualSymbol( *this ) )
172        {
173            return true;
174        }
175        return false;
176    }
177
178    virtual void Using() const;
179
180    void Readed(){
181        isReady = true;
182    }
183    bool IsReady() const{
184        return isReady;
185    }
186
187    const NamespaceScopesCollection &GetImportedNamespaces() const
188    {
189        return importedNamespaces;
190    }
191
192    // 型パラメータ
193    const GenericTypes &GetFormalGenericTypes() const
194    {
195        return formalGenericTypes;
196    }
197    void AddFormalGenericType( GenericType genericType )
198    {
199        this->formalGenericTypes.push_back( genericType );
200    }
201    int GetFormalGenericTypeParameterIndex( const std::string &name ) const
202    {
203        int i = 0;
204        BOOST_FOREACH( const GenericType &genericType, formalGenericTypes )
205        {
206            if( genericType.GetName() == name )
207            {
208                return i;
209            }
210            i++;
211        }
212        return -1;
213    }
214    bool IsExistFormalGenericTypeParameter( const std::string &name ) const
215    {
216        BOOST_FOREACH( const GenericType &genericType, formalGenericTypes )
217        {
218            if( genericType.GetName() == name )
219            {
220                return true;
221            }
222        }
223        return false;
224    }
225    bool IsGeneric() const
226    {
227        return ( this->formalGenericTypes.size() != 0 );
228    }
229
230    // 継承元クラス
231    bool HasSuperClass() const
232    {
233        return ( pSuperClass != NULL );
234    }
235    const CClass &GetSuperClass() const
236    {
237        return *pSuperClass;
238    }
239    void SetSuperClass( const CClass *pSuperClass )
240    {
241        this->pSuperClass = pSuperClass;
242    }
243    const Types &GetSuperClassActualTypeParameters() const
244    {
245        return superClassActualTypeParameters;
246    }
247    void SetSuperClassActualTypeParameters( const Types &actualTypeParameters )
248    {
249        this->superClassActualTypeParameters = actualTypeParameters;
250    }
251
252    // Blittable型
253    bool IsBlittableType() const
254    {
255        return !blittableType.IsNull();
256    }
257    const Type &GetBlittableType() const
258    {
259        return blittableType;
260    }
261    void SetBlittableType( const Type &type ){
262        blittableType = type;
263    }
264
265    bool IsClass() const;
266    bool IsInterface() const;
267    bool IsComInterface() const;
268    bool IsEnum() const;
269    bool IsDelegate() const;
270    bool IsStructure() const;
271    void SetClassType( ClassType classType )
272    {
273        this->classType = classType;
274    }
275
276
277    //コンストラクタをコンパイルしているかどうかのチェックフラグ
278private:
279    mutable bool isCompilingConstructor;
280public:
281    void NotifyStartConstructorCompile() const;
282    void NotifyFinishConstructorCompile() const;
283    bool IsCompilingConstructor() const;
284
285    //デストラクタをコンパイルしているかどうかのチェックフラグ
286private:
287    mutable bool isCompilingDestructor;
288public:
289    void NotifyStartDestructorCompile() const;
290    void NotifyFinishDestructorCompile() const;
291    bool IsCompilingDestructor() const;
292
293
294    //自身の派生クラスかどうかを確認
295    bool IsSubClass( const CClass *pClass ) const;
296
297    //自身と等しいまたは派生クラスかどうかを確認
298    bool IsEqualsOrSubClass( const CClass *pClass ) const;
299
300    // 自身と等しいまたは派生クラス、基底クラスかどうかを確認
301    bool IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const;
302
303    // インターフェイス
304    bool HasInterfaces() const
305    {
306        return ( interfaces.size() != 0 );
307    }
308    const Interfaces &GetInterfaces() const
309    {
310        return interfaces;
311    }
312    bool IsInheritsInterface( const CClass *pInterfaceClass ) const;
313
314    // クラス継承
315    bool InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine );
316
317    // インターフェイス実装
318    bool Implements( const CClass &interfaceClass, const Types &actualTypeParameters, int nowLine );
319
320    //メンバ、メソッドの追加
321    CMember *CreateMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine );
322    void AddMember( Prototype::Accessibility accessibility, bool idConst, bool isRef, char *buffer, int nowLine );
323    void AddStaticMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine );
324
325    //重複チェック
326    bool DupliCheckAll(const char *name) const;
327    bool DupliCheckMember(const char *name) const;
328
329    const Members &GetDynamicMembers() const
330    {
331        return dynamicMembers;
332    }
333    const Members &GetStaticMembers() const
334    {
335        return staticMembers;
336    }
337    Members &GetDynamicMembers()
338    {
339        return dynamicMembers;
340    }
341    Members &GetStaticMembers()
342    {
343        return staticMembers;
344    }
345   
346    const CMember *FindDynamicMember( const char *memberName ) const;
347    bool HasDynamicMember( const char *memberName ) const
348    {
349        return ( FindDynamicMember( memberName ) != NULL );
350    }
351
352    void EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
353    const CMethod *GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const;
354
355    const Methods &GetStaticMethods() const
356    {
357        return staticMethods;
358    }
359    Methods &GetStaticMethods()
360    {
361        return staticMethods;
362    }
363
364    //デフォルト コンストラクタ
365    const CMethod *GetConstructorMethod() const
366    {
367        if( ConstructorMemberSubIndex == -1 ) return NULL;
368        return GetDynamicMethods()[ConstructorMemberSubIndex];
369    }
370    void SetConstructorMemberSubIndex( int constructorMemberSubIndex )
371    {
372        this->ConstructorMemberSubIndex = constructorMemberSubIndex;
373    }
374
375    //デストラクタ メソッドを取得
376    const CMethod *GetDestructorMethod() const
377    {
378        if( DestructorMemberSubIndex == -1 ) return NULL;
379        return GetDynamicMethods()[DestructorMemberSubIndex];
380    }
381    void SetDestructorMemberSubIndex( int destructorMemberSubIndex )
382    {
383        this->DestructorMemberSubIndex = destructorMemberSubIndex;
384    }
385
386    // デリゲート情報を取得
387    const ::Delegate &GetDelegate() const;
388
389    // ユーザ指定のアラインメント固定値
390    int GetFixedAlignment() const
391    {
392        return fixedAlignment;
393    }
394    void SetFixedAlignment( int fixedAlignment )
395    {
396        this->fixedAlignment = fixedAlignment;
397    }
398
399    // メンバの総合サイズを取得
400private:
401    int cacheSize;
402public:
403    int GetSize() const;
404
405    // メンバのオフセットを取得
406    int GetMemberOffset( const char *memberName ) const;
407private:
408    // アラインメント値を取得
409    int GetAlignment() const;
410
411
412    /////////////////////////////////////////////////////////////////
413    // vtbl
414    /////////////////////////////////////////////////////////////////
415public:
416    // vtblに存在する仮想関数の数
417    int GetVtblNum() const
418    {
419        return vtblNum;
420    }
421    void SetVtblNum( int vtblNum )
422    {
423        this->vtblNum = vtblNum;
424    }
425    void AddVtblNum( int vtblNum )
426    {
427        this->vtblNum += vtblNum;
428    }
429    bool IsExistVirtualFunctions() const
430    {
431        // 構造体以外は仮想関数を持つ
432        return !IsStructure();
433    }
434   
435private:
436    long vtbl_offset;
437    long comVtblOffset;
438    long vtblMasterListOffset;
439    std::vector<long> vtblMasterList;
440public:
441    void GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const;
442    int GetVtblMasterListIndex( const CClass *pClass ) const;
443    long GetComVtblOffset() const;
444    long GetVtblMasterListOffset() const;
445    void GenerateVTableMasterList( const std::vector<long> &vtableMasterList, long &offset );
446    void GenerateFullVTables();
447    void ActionVtblSchedule( LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection );
448    bool IsAbstract() const;
449
450
451    // TypeInfo用
452    mutable int typeInfoDataTableOffset;
453    void SetTypeInfoDataTableOffset( int typeInfoDataTableOffset ) const
454    {
455        this->typeInfoDataTableOffset = typeInfoDataTableOffset;
456    }
457    int GetTypeInfoDataTableOffset() const
458    {
459        return typeInfoDataTableOffset;
460    }
461
462    // 動的型データ用のメンバデータを取得
463    std::string GetStaticDefiningStringAsMemberNames() const;
464    std::string GetStaticDefiningStringAsMemberTypeInfoNames() const;
465    std::string GetStaticDefiningStringAsMemberOffsets() const;
466    void GetReferenceOffsetsInitializeBuffer( std::string &referenceOffsetsBuffer, int &numOfReference, int baseOffset = 0 ) const;
467};
468
469class Classes : public Jenga::Common::Hashmap<CClass>
470{
471    // XMLシリアライズ用
472public:
473    Classes()
474        : pStringClass( NULL )
475        , pObjectClass( NULL )
476        , pInterfaceInfo( NULL )
477    {
478    }
479    ~Classes()
480    {
481    }
482
483    virtual CClass *Create( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name);
484    bool Insert( CClass *pClass, int nowLine );
485    CClass *Add( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name,int nowLine);
486
487    // vtblを一時的に生成
488    void GenerateVTables();
489
490    // vtblのを正規のオフセットで再構築
491    void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection );
492
493    virtual void InitStaticMember();
494
495    virtual void Compile_System_InitializeUserTypes();
496    virtual void Compile_System_InitializeUserTypesForBaseType();
497
498    const CClass *Find( const NamespaceScopes &namespaceScopes, const std::string &name ) const;
499    const CClass *Find( const std::string &fullName ) const;
500
501
502    /////////////////////////////
503    // 特殊クラス
504    /////////////////////////////
505    mutable const CClass *pStringClass;
506    mutable const CClass *pObjectClass;
507    mutable const CClass *pInterfaceInfo;
508    const CClass *GetStringClassPtr() const;
509    const CClass *GetObjectClassPtr() const;
510    const CClass *GetInterfaceInfoClassPtr() const;
511};
Note: See TracBrowser for help on using the repository browser.