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, 16 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.