source: dev/BasicCompiler_Common/Procedure.h@ 98

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

関数の戻り値オブジェクトのメンバ・メソッドを一時オブジェクトを介さずに参照できるようにした。

File size: 5.4 KB
RevLine 
[78]1#pragma once
[74]2
[75]3class Procedure{
[74]4public:
[75]5 // 種類
6 enum Kind{
7 Sub,
8 Function,
9 };
[74]10
[75]11private:
12 const string name;
[74]13
[75]14 Kind kind;
[74]15
[75]16 bool isCdecl;
17 bool isUsing;
[74]18
[75]19protected:
[74]20
[75]21 // パラメータ
[74]22 Parameters params;
[75]23
24 // 戻り値の型
25 Type returnType;
26
27 // ソースコードの位置
28 int codePos;
29
30public:
31 Procedure( const string &name, Kind kind, bool isCdecl ):
32 name( name ),
33 kind( kind ),
34 isCdecl( isCdecl ),
35 isUsing( false ),
36 codePos( -1 )
37 {}
38 ~Procedure(){
39 foreach( Parameter *pParam, params ){
40 delete pParam;
41 }
42 }
43
44 const string &GetName() const
45 {
46 return name;
47 }
48
49 bool IsSub() const
50 {
51 return ( kind == Sub );
52 }
53 bool IsFunction() const
54 {
55 return ( kind == Function );
56 }
57
58 bool IsCdecl() const
59 {
60 return isCdecl;
61 }
62 void Using(){
63 isUsing = true;
64 }
65 bool IsUsing() const
66 {
67 return isUsing;
68 }
69
70 int GetCodePos() const
71 {
72 return codePos;
73 }
74
75 const Parameters &Params() const
76 {
77 return params;
78 }
79 const Type &ReturnType() const
80 {
81 return returnType;
82 }
83};
84
85class UserProc : public Procedure
86{
[97]87#ifdef _DEBUG
88public:
89 string _paramStr;
90#endif
[75]91
92private:
93 bool isMacro;
94
95 // パラメータの追加情報
96 int secondParmNum;
[74]97 Parameters realParams;
[75]98 int realSecondParmNum;
[74]99
[75]100 // 親クラスと対応するメソッド
101 CClass *pParentClass;
102 CMethod *pMethod;
[74]103
[75]104 // 各種フラグ
105 bool isExport;
106 bool isSystem;
[90]107 bool isAutoGeneration;
[75]108 bool isCompiled;
[74]109
[75]110public:
111 // ハッシュリスト用
112 UserProc *pNextData;
[74]113
[75]114 UserProc( const string &name, Kind kind, bool isMacro, bool isCdecl, bool isExport ):
115 Procedure( name, kind, isCdecl ),
116 isMacro( isMacro ),
117 pParentClass( NULL ),
118 pMethod( NULL ),
119 isExport( isExport ),
120 isSystem( false ),
[90]121 isAutoGeneration( false ),
[75]122 isCompiled( false ),
[92]123 pNextData( NULL ),
124 beginOpAddress( 0 ),
125 endOpAddress( 0 )
[75]126 {
127 }
128 ~UserProc(){
129 foreach( Parameter *pParam, realParams ){
130 delete pParam;
131 }
132 }
133
[91]134 string GetFullName() const
135 {
136 if( HasParentClass() ){
137 return (string)GetParentClass().name + "." + GetName();
138 }
139
140 return GetName();
141 }
142
[75]143 bool IsMacro() const
144 {
145 return isMacro;
146 }
147
148 virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic );
149
150 int GetSecondParmNum() const
151 {
152 return secondParmNum;
153 }
154 const Parameters &RealParams() const
155 {
156 return realParams;
157 }
158 int GetRealSecondParmNum() const
159 {
160 return realSecondParmNum;
161 }
162
163 void SetParentClass( CClass *pParentClass ){
164 this->pParentClass = pParentClass;
165 }
166 CClass *GetParentClassPtr()
167 {
168 return pParentClass;
169 }
170 const CClass &GetParentClass() const
171 {
172 return *pParentClass;
173 }
[89]174 bool HasParentClass() const
175 {
176 return ( pParentClass != NULL );
177 }
[75]178 void SetMethod( CMethod *pMethod ){
179 this->pMethod = pMethod;
180 }
181
182 void ExportOff(){
183 isExport = false;
184 }
185 bool IsExport() const
186 {
187 return isExport;
188 }
189 void ThisIsSystemProc(){
190 isSystem = true;
191 }
192 bool IsSystem() const
193 {
194 return isSystem;
195 }
[90]196 void ThisIsAutoGenerationProc(){
197 isAutoGeneration = true;
198 }
199 bool IsAutoGeneration(){
200 return isAutoGeneration;
201 }
[75]202 void CompleteCompile(){
203 isCompiled = true;
204 }
205 void KillCompileStatus(){
206 isCompiled = false;
207 }
208 bool IsCompiled() const
209 {
210 return isCompiled;
211 }
212 bool IsDestructor() const
213 {
214 return ( GetName()[0] == '~' );
215 }
216 bool IsVirtual() const
217 {
218 if( pMethod == NULL ){
219 return false;
220 }
221 return ( pMethod->bVirtual != 0 );
222 }
223
224
225 // バイナリコードの位置
226 DWORD beginOpAddress;
227 DWORD endOpAddress;
[91]228 int GetCodeSize() const
229 {
230 return endOpAddress - beginOpAddress;
231 }
[75]232
233 // ローカル変数
234 Variables localVars;
235
236 // TODO: 適切なコードへ直す
237 long id;
238
239
240 /////////////////////////////////////////////////////////////////
241 // コンパイル中の関数を管理
242 /////////////////////////////////////////////////////////////////
243private:
244 static UserProc *pCompilingUserProc;
245public:
246 static void CompileStartForGlobalArea(){
247 pCompilingUserProc = NULL;
248 }
249 static void CompileStartForUserProc( UserProc *pUserProc ){
250 pCompilingUserProc = pUserProc;
251 }
252 static bool IsGlobalAreaCompiling(){
253 return ( pCompilingUserProc == NULL );
254 }
255 static bool IsLocalAreaCompiling(){
256 return ( pCompilingUserProc != NULL );
257 }
258 static UserProc &CompilingUserProc(){
259 return *pCompilingUserProc;
260 }
[74]261};
[75]262
263class DllProc : public Procedure
264{
265 const string dllFileName;
266 const string alias;
267 int lookupAddress;
268
269public:
270 // ハッシュリスト用
271 DllProc *pNextData;
272
273 DllProc( const string &name, Kind kind, bool isCdecl, const string &dllFileName, const string &alias ):
274 Procedure( name, kind, isCdecl ),
275 dllFileName( dllFileName ),
276 alias( alias ),
277 lookupAddress( 0 ),
278 pNextData( NULL )
279 {
280 }
281 ~DllProc(){}
282
283 virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine );
284
285 const string &GetDllFileName() const
286 {
287 return dllFileName;
288 }
289 const string &GetAlias() const
290 {
291 return alias;
292 }
293
294 void SetLookupAddress( int lookupAddress ){
295 this->lookupAddress = lookupAddress;
296 }
297 int GetLookupAddress() const
298 {
299 return lookupAddress;
300 }
301
302};
303
304class ProcPointer : public Procedure
305{
306public:
307 ProcPointer( Kind kind ):
308 Procedure( "", kind, false )
309 {
310 }
311 ~ProcPointer(){}
312
313 virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine );
314};
Note: See TracBrowser for help on using the repository browser.