source: dev/BasicCompiler_Common/Class.h@ 28

Last change on this file since 28 was 28, checked in by dai_9181, 17 years ago

・【32ビットコンパイラ】戻り値に実態オブジェクトを持つインデクサを呼び出すと強制終了してしまうバグを修正。
・仮想関数のオーバーロードが正常に動作しないバグを修正。
・純仮想関数(抽象メソッド)が仮想関数でオーバーロードされていると、クラスのインスタンスが生成できてしまうバグを修正。

File size: 4.3 KB
Line 
1
2
3class CClass;
4struct SUBINFO;
5
6//データ型
7struct TYPEINFO{
8 int type;
9 union{
10 LONG_PTR lpIndex;
11 CClass *pobj_Class;
12 }u;
13};
14
15#define ACCESS_NON 0
16#define ACCESS_PRIVATE 1
17#define ACCESS_PUBLIC 2
18#define ACCESS_PROTECTED 3
19
20class CMember{
21 bool isConst;
22public:
23 char *name;
24 int SubScripts[MAX_ARRAYDIM];
25 TYPEINFO TypeInfo;
26
27 DWORD dwAccess;
28
29 char *InitBuf;
30 char *ConstractParameter;
31
32 int source_code_address;
33
34
35 CMember( CClass *pobj_c, DWORD access, bool idConst, char *buffer, int NowLine=-1 );
36 CMember( CMember *pobj );
37 CMember();
38 ~CMember();
39
40 bool IsConst();
41
42
43 static void InitStaticMember(void);
44};
45class CMethod{
46public:
47 SUBINFO *psi;
48 DWORD dwAccess;
49 BOOL bAbstract;
50 BOOL bVirtual;
51 bool isConst;
52
53 CClass *pobj_InheritsClass;
54
55 CMethod(CMethod *pobj);
56 CMethod();
57 ~CMethod();
58};
59class CClass{
60public:
61 //クラス名
62 char *name;
63
64 //継承クラスへのポインタ
65 CClass *pobj_InheritsClass;
66
67 //メンバ情報
68 CMember **ppobj_Member;
69 int iMemberNum;
70
71 //メソッド情報
72 CMethod **ppobj_Method;
73 int iMethodNum;
74 int ConstructorMemberSubIndex;
75 int DestructorMemberSubIndex;
76 int CopyConstructorMemberSubIndex;
77
78 //静的メンバ情報
79 CMember **ppobj_StaticMember;
80 int iStaticMemberNum;
81
82 //静的メソッド情報
83 CMethod **ppobj_StaticMethod;
84 int iStaticMethodNum;
85
86 //仮想関数の数
87 int vtbl_num;
88
89 //アラインメント値
90 int iAlign;
91
92
93public:
94 CClass(char *name);
95 ~CClass();
96
97 void AddMember( DWORD dwAccess, bool idConst, char *buffer );
98 void AddStaticMember( DWORD dwAccess, bool isConst, char *buffer, int NowLine );
99 void AddMethod( SUBINFO *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual );
100 void AddStaticMethod(SUBINFO *psi,DWORD dwAccess);
101
102 BOOL DupliCheckAll(char *name);
103 BOOL DupliCheckMember(char *name);
104
105 //メソッド取得
106 CMethod *GetMethodInfo( SUBINFO *psi );
107 CMethod *GetStaticMethodInfo( SUBINFO *psi );
108
109 //メソッドの存在を確認
110 bool IsExistMethod( char *name );
111 bool IsExistStaticMethod( char *name );
112
113
114 //vtbl
115private:
116 long vtbl_offset;
117 LONG_PTR AddVtblDataTable(SUBINFO **ppsi,int length);
118public:
119 LONG_PTR GetVtblGlobalOffset(void);
120 void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
121 bool IsAbstract();
122
123
124 //オペレータ関数の取得
125 SUBINFO **GetOperatorSubInfo(BYTE idCalc,int &num);
126
127
128 //コンストラクタをコンパイルしているかどうかのチェックフラグ
129private:
130 bool isCompilingConstructor;
131public:
132 void NotifyStartConstructorCompile();
133 void NotifyFinishConstructorCompile();
134 bool IsCompilingConstructor();
135
136 //デストラクタをコンパイルしているかどうかのチェックフラグ
137private:
138 bool isCompilingDestructor;
139public:
140 void NotifyStartDestructorCompile();
141 void NotifyFinishDestructorCompile();
142 bool IsCompilingDestructor();
143
144
145 //自身と等しいクラスかどうかを確認
146 bool IsEquals( CClass *pClass );
147
148 //自身の派生クラスかどうかを確認
149 bool IsSubClass( CClass *pClass );
150
151
152 //線形リスト用
153 CClass *pobj_NextClass;
154};
155
156#define MAX_CLASS_HASH 65535
157class CDBClass{
158 int hash(char *name);
159 void DestroyClass(CClass *pobj_c);
160public:
161 CClass *pobj_ClassHash[MAX_CLASS_HASH];
162
163 CDBClass();
164 ~CDBClass();
165
166 CClass *check(char *name);
167
168 CClass *AddClass(char *name,int NowLine);
169
170 void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
171
172private:
173 void AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, BOOL bAbstract,
174 BOOL bVirtual, BOOL bOverride, char *buffer, int NowLine);
175 BOOL MemberVar_LoopRefCheck(CClass *pobj_c);
176public:
177 void InitNames(void);
178 void GetClass_recur(char *lpszInheritsClass);
179 void GetObjectClassInfo(void);
180
181
182 /////////////////////////////
183 // 現在コンパイル中の情報
184 /////////////////////////////
185private:
186 CClass *pCompilingClass;
187 CMethod *pCompilingMethod;
188public:
189 //コンパイル開始の通知を受け取るメソッド
190 void StartCompile( SUBINFO *psi );
191
192 //現在コンパイル中のメソッド情報を取得
193 CClass *GetNowCompilingClass();
194 CMethod *GetNowCompilingMethodInfo();
195
196
197 /////////////////////
198 // イテレータ
199 /////////////////////
200private:
201 CClass **ppobj_IteClass;
202 int iIteMaxNum;
203 int iIteNextNum;
204public:
205 void Iterator_Reset(void);
206 BOOL Iterator_HasNext(void);
207 CClass *Iterator_GetNext(void);
208 int Iterator_GetMaxCount(void);
209};
210
211
212extern CDBClass *pobj_DBClass;
213extern CClass *pobj_CompilingClass;
Note: See TracBrowser for help on using the repository browser.