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

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

pobj_NextClasstが不要だったので消去。

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    void Readed(){
179        isReady = true;
180    }
181    bool IsReady() const{
182        return isReady;
183    }
184
185    const NamespaceScopesCollection &GetImportedNamespaces() const
186    {
187        return importedNamespaces;
188    }
189
190    // 型パラメータ
191    const GenericTypes &GetFormalGenericTypes() const
192    {
193        return formalGenericTypes;
194    }
195    void AddFormalGenericType( GenericType genericType )
196    {
197        this->formalGenericTypes.push_back( genericType );
198    }
199    int GetFormalGenericTypeParameterIndex( const std::string &name ) const
200    {
201        int i = 0;
202        BOOST_FOREACH( const GenericType &genericType, formalGenericTypes )
203        {
204            if( genericType.GetName() == name )
205            {
206                return i;
207            }
208            i++;
209        }
210        return -1;
211    }
212    bool IsExistFormalGenericTypeParameter( const std::string &name ) const
213    {
214        BOOST_FOREACH( const GenericType &genericType, formalGenericTypes )
215        {
216            if( genericType.GetName() == name )
217            {
218                return true;
219            }
220        }
221        return false;
222    }
223    bool IsGeneric() const
224    {
225        return ( this->formalGenericTypes.size() != 0 );
226    }
227
228    // 継承元クラス
229    bool HasSuperClass() const
230    {
231        return ( pSuperClass != NULL );
232    }
233    const CClass &GetSuperClass() const
234    {
235        return *pSuperClass;
236    }
237    void SetSuperClass( const CClass *pSuperClass )
238    {
239        this->pSuperClass = pSuperClass;
240    }
241    const Types &GetSuperClassActualTypeParameters() const
242    {
243        return superClassActualTypeParameters;
244    }
245    void SetSuperClassActualTypeParameters( const Types &actualTypeParameters )
246    {
247        this->superClassActualTypeParameters = actualTypeParameters;
248    }
249
250    // Blittable型
251    bool IsBlittableType() const
252    {
253        return !blittableType.IsNull();
254    }
255    const Type &GetBlittableType() const
256    {
257        return blittableType;
258    }
259    void SetBlittableType( const Type &type ){
260        blittableType = type;
261    }
262
263    bool IsClass() const;
264    bool IsInterface() const;
265    bool IsComInterface() const;
266    bool IsEnum() const;
267    bool IsDelegate() const;
268    bool IsStructure() const;
269    void SetClassType( ClassType classType )
270    {
271        this->classType = classType;
272    }
273
274
275    //コンストラクタをコンパイルしているかどうかのチェックフラグ
276private:
277    mutable bool isCompilingConstructor;
278public:
279    void NotifyStartConstructorCompile() const;
280    void NotifyFinishConstructorCompile() const;
281    bool IsCompilingConstructor() const;
282
283    //デストラクタをコンパイルしているかどうかのチェックフラグ
284private:
285    mutable bool isCompilingDestructor;
286public:
287    void NotifyStartDestructorCompile() const;
288    void NotifyFinishDestructorCompile() const;
289    bool IsCompilingDestructor() const;
290
291
292    //自身の派生クラスかどうかを確認
293    bool IsSubClass( const CClass *pClass ) const;
294
295    //自身と等しいまたは派生クラスかどうかを確認
296    bool IsEqualsOrSubClass( const CClass *pClass ) const;
297
298    // 自身と等しいまたは派生クラス、基底クラスかどうかを確認
299    bool IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const;
300
301    // インターフェイス
302    bool HasInterfaces() const
303    {
304        return ( interfaces.size() != 0 );
305    }
306    const Interfaces &GetInterfaces() const
307    {
308        return interfaces;
309    }
310    bool IsInheritsInterface( const CClass *pInterfaceClass ) const;
311
312    // クラス継承
313    bool InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine );
314
315    // インターフェイス実装
316    bool Implements( const CClass &interfaceClass, const Types &actualTypeParameters, int nowLine );
317
318    //メンバ、メソッドの追加
319    CMember *CreateMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine );
320    void AddMember( Prototype::Accessibility accessibility, bool idConst, bool isRef, char *buffer, int nowLine );
321    void AddStaticMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine );
322
323    //重複チェック
324    bool DupliCheckAll(const char *name) const;
325    bool DupliCheckMember(const char *name) const;
326
327    const Members &GetDynamicMembers() const
328    {
329        return dynamicMembers;
330    }
331    const Members &GetStaticMembers() const
332    {
333        return staticMembers;
334    }
335    Members &GetDynamicMembers()
336    {
337        return dynamicMembers;
338    }
339    Members &GetStaticMembers()
340    {
341        return staticMembers;
342    }
343   
344    const CMember *FindDynamicMember( const char *memberName ) const;
345    bool HasDynamicMember( const char *memberName ) const
346    {
347        return ( FindDynamicMember( memberName ) != NULL );
348    }
349
350    void EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
351    const CMethod *GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const;
352
353    const Methods &GetStaticMethods() const
354    {
355        return staticMethods;
356    }
357    Methods &GetStaticMethods()
358    {
359        return staticMethods;
360    }
361
362    //デフォルト コンストラクタ
363    const CMethod *GetConstructorMethod() const
364    {
365        if( ConstructorMemberSubIndex == -1 ) return NULL;
366        return GetDynamicMethods()[ConstructorMemberSubIndex];
367    }
368    void SetConstructorMemberSubIndex( int constructorMemberSubIndex )
369    {
370        this->ConstructorMemberSubIndex = constructorMemberSubIndex;
371    }
372
373    //デストラクタ メソッドを取得
374    const CMethod *GetDestructorMethod() const
375    {
376        if( DestructorMemberSubIndex == -1 ) return NULL;
377        return GetDynamicMethods()[DestructorMemberSubIndex];
378    }
379    void SetDestructorMemberSubIndex( int destructorMemberSubIndex )
380    {
381        this->DestructorMemberSubIndex = destructorMemberSubIndex;
382    }
383
384    // デリゲート情報を取得
385    const ::Delegate &GetDelegate() const;
386
387    // ユーザ指定のアラインメント固定値
388    int GetFixedAlignment() const
389    {
390        return fixedAlignment;
391    }
392    void SetFixedAlignment( int fixedAlignment )
393    {
394        this->fixedAlignment = fixedAlignment;
395    }
396
397    // メンバの総合サイズを取得
398private:
399    int cacheSize;
400public:
401    int GetSize() const;
402
403    // メンバのオフセットを取得
404    int GetMemberOffset( const char *memberName ) const;
405private:
406    // アラインメント値を取得
407    int GetAlignment() const;
408
409
410    /////////////////////////////////////////////////////////////////
411    // vtbl
412    /////////////////////////////////////////////////////////////////
413public:
414    // vtblに存在する仮想関数の数
415    int GetVtblNum() const
416    {
417        return vtblNum;
418    }
419    void SetVtblNum( int vtblNum )
420    {
421        this->vtblNum = vtblNum;
422    }
423    void AddVtblNum( int vtblNum )
424    {
425        this->vtblNum += vtblNum;
426    }
427    bool IsExistVirtualFunctions() const
428    {
429        // 構造体以外は仮想関数を持つ
430        return !IsStructure();
431    }
432   
433private:
434    long vtbl_offset;
435    long comVtblOffset;
436    long vtblMasterListOffset;
437    std::vector<long> vtblMasterList;
438public:
439    void GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const;
440    int GetVtblMasterListIndex( const CClass *pClass ) const;
441    long GetComVtblOffset() const;
442    long GetVtblMasterListOffset() const;
443    void GenerateVTableMasterList( const std::vector<long> &vtableMasterList, long &offset );
444    void GenerateFullVTables();
445    void ActionVtblSchedule( LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection );
446    bool IsAbstract() const;
447
448
449    // TypeInfo用
450    mutable int typeInfoDataTableOffset;
451    void SetTypeInfoDataTableOffset( int typeInfoDataTableOffset ) const
452    {
453        this->typeInfoDataTableOffset = typeInfoDataTableOffset;
454    }
455    int GetTypeInfoDataTableOffset() const
456    {
457        return typeInfoDataTableOffset;
458    }
459
460    // 動的型データ用のメンバデータを取得
461    std::string GetStaticDefiningStringAsMemberNames() const;
462    std::string GetStaticDefiningStringAsMemberTypeInfoNames() const;
463    std::string GetStaticDefiningStringAsMemberOffsets() const;
464    void GetReferenceOffsetsInitializeBuffer( std::string &referenceOffsetsBuffer, int &numOfReference, int baseOffset = 0 ) const;
465};
466
467class Classes : public Jenga::Common::Hashmap<CClass>
468{
469    // XMLシリアライズ用
470public:
471    Classes()
472        : pStringClass( NULL )
473        , pObjectClass( NULL )
474        , pInterfaceInfo( NULL )
475    {
476    }
477    ~Classes()
478    {
479    }
480
481    virtual CClass *Create( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name);
482    bool Insert( CClass *pClass, int nowLine );
483    CClass *Add( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name,int nowLine);
484
485    // vtblを一時的に生成
486    void GenerateVTables();
487
488    // vtblのを正規のオフセットで再構築
489    void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection );
490
491    virtual void InitStaticMember();
492
493    virtual void Compile_System_InitializeUserTypes();
494    virtual void Compile_System_InitializeUserTypesForBaseType();
495
496    const CClass *Find( const NamespaceScopes &namespaceScopes, const std::string &name ) const;
497    const CClass *Find( const std::string &fullName ) const;
498
499    void StartCompile( const UserProc *pUserProc );
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.