source: dev/trunk/ab5.0/abdev/ab_common/include/Lexical/Procedure.h@ 640

Last change on this file since 640 was 640, checked in by dai_9181, 16 years ago

静的リンクリンカの依存関係解決モジュールを製作中

File size: 12.3 KB
RevLine 
[184]1#pragma once
2
[637]3class Procedure
4 : public RelationalObjectModuleItem
[184]5{
6public:
[206]7 // 種類
8 enum Kind{
9 Sub,
10 Function,
11 };
12
13private:
14 Kind kind;
15
16 bool isCdecl;
17 mutable bool isUsing;
18
19 // パラメータ
20 Parameters params;
21
[572]22protected:
23
[206]24 // 戻り値の型
25 Type returnType;
26
[632]27private:
[206]28 // ソースコードの位置
[632]29 SourceCodePosition sourceCodePosition;
[206]30
31 // XMLシリアライズ用
32private:
33 friend class boost::serialization::access;
[208]34 template<class Archive> void serialize(Archive& ar, const unsigned int version)
[184]35 {
[206]36 trace_for_serialize( "serializing - Procedure" );
37
[637]38 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( RelationalObjectModuleItem );
[206]39 ar & BOOST_SERIALIZATION_NVP( kind );
40 ar & BOOST_SERIALIZATION_NVP( isCdecl );
41 ar & BOOST_SERIALIZATION_NVP( isUsing );
42 ar & BOOST_SERIALIZATION_NVP( params );
43 ar & BOOST_SERIALIZATION_NVP( returnType );
[632]44 ar & BOOST_SERIALIZATION_NVP( sourceCodePosition );
[184]45 }
[206]46
47public:
[637]48 Procedure( const Symbol &symbol, Kind kind, bool isCdecl )
49 : RelationalObjectModuleItem( symbol )
[206]50 , kind( kind )
51 , isCdecl( isCdecl )
52 , isUsing( false )
53 {
54 }
55 Procedure()
56 {
57 }
58 ~Procedure(){
59 BOOST_FOREACH( Parameter *pParam, params ){
60 delete pParam;
61 }
62 }
63
64 bool IsSub() const
65 {
66 return ( kind == Sub );
67 }
68 bool IsFunction() const
69 {
70 return ( kind == Function );
71 }
72
73 bool IsCdecl() const
74 {
75 return isCdecl;
76 }
77 void Using() const
78 {
79 isUsing = true;
80 }
81 bool IsUsing() const
82 {
83 return isUsing;
84 }
85
[632]86 const SourceCodePosition &GetSourceCodePosition() const
[206]87 {
[632]88 return sourceCodePosition;
[206]89 }
[632]90 void SetSourceCodePosition( const SourceCodePosition &sourceCodePosition )
[572]91 {
[632]92 this->sourceCodePosition = sourceCodePosition;
[572]93 }
[637]94 virtual void ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable );
[206]95
96 const Parameters &Params() const
97 {
98 return params;
99 }
[572]100 Parameters &GetParameters()
101 {
102 return params;
103 }
[206]104 const Type &ReturnType() const
105 {
106 return returnType;
107 }
[572]108 Type &ReturnType()
109 {
110 return returnType;
111 }
[639]112
[640]113 virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
[184]114};
115
[206]116class UserProc : public Procedure, public Jenga::Common::ObjectInHashmap<UserProc>
[184]117{
118public:
[523]119 std::string _paramStr;
[184]120
[206]121private:
122 NamespaceScopesCollection importedNamespaces;
[184]123
[206]124 // 親クラスと対応するメソッド
125 const CClass *pParentClass;
[353]126 const Interface *pInterface;
[206]127 CMethod *pMethod;
128
129 bool isMacro;
130
131 // パラメータの追加情報
132 int secondParmNum;
133 Parameters realParams;
134 int realSecondParmNum;
135
136 // 各種フラグ
137 bool isExport;
138 mutable bool isSystem;
139 mutable bool isAutoGeneration;
140 mutable bool isCompiled;
141
142 mutable DWORD beginOpAddress;
143 mutable DWORD endOpAddress;
144
145 // ローカル変数
146 mutable Variables localVars;
147
148 // 識別ID
149 int id;
150
[224]151 // ネイティブコード
152 NativeCode nativeCode;
153
[206]154 // XMLシリアライズ用
155private:
156 friend class boost::serialization::access;
157 template<class Archive> void serialize(Archive& ar, const unsigned int version)
[184]158 {
[206]159 trace_for_serialize( "serializing - UserProc" );
160
161 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
[639]162 ar & boost::serialization::make_nvp("pParentClass", const_cast<CClass *&>(pParentClass) );
[640]163 ar & boost::serialization::make_nvp("pInterface", const_cast<Interface *&>(pInterface) );
[637]164
165 if( ActiveBasic::Common::Environment::IsRemoveExternal() )
166 {
167 if( this->IsExternal() )
168 {
169 this->NeedResolve();
170 return;
171 }
172 }
173
[206]174 ar & BOOST_SERIALIZATION_NVP( _paramStr );
175 ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
176 ar & BOOST_SERIALIZATION_NVP( pMethod );
177 ar & BOOST_SERIALIZATION_NVP( isMacro );
178 ar & BOOST_SERIALIZATION_NVP( secondParmNum );
179 ar & BOOST_SERIALIZATION_NVP( realParams );
180 ar & BOOST_SERIALIZATION_NVP( realSecondParmNum );
181 ar & BOOST_SERIALIZATION_NVP( isExport );
182 ar & BOOST_SERIALIZATION_NVP( isSystem );
183 ar & BOOST_SERIALIZATION_NVP( isAutoGeneration );
184 ar & BOOST_SERIALIZATION_NVP( isCompiled );
185 ar & BOOST_SERIALIZATION_NVP( beginOpAddress );
186 ar & BOOST_SERIALIZATION_NVP( endOpAddress );
187 ar & BOOST_SERIALIZATION_NVP( localVars );
188 ar & BOOST_SERIALIZATION_NVP( id );
[224]189 ar & BOOST_SERIALIZATION_NVP( nativeCode );
[184]190 }
191
[206]192public:
193
[637]194 UserProc( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces, Kind kind, bool isMacro, bool isCdecl, bool isExport );
[632]195 UserProc( const UserProc &userProc, const CClass *pParentClass );
196 UserProc();
197 ~UserProc();
[206]198
[511]199 void SetReturnType( const Type &newReturnType )
200 {
201 returnType = newReturnType;
202 }
203
[206]204 virtual const std::string &GetKeyName() const
205 {
206 return GetName();
207 }
208
[209]209 virtual bool IsDuplication( const UserProc *pUserProc ) const
210 {
[640]211 bool isEqualParentClass =
212 this->HasParentClass() && pUserProc->HasParentClass()
213 ? this->GetParentClassPtr()->Equals( pUserProc->GetParentClassPtr() )
214 : this->GetParentClassPtr() == pUserProc->GetParentClassPtr();
215 bool isEqualInterface =
216 this->pInterface && pUserProc->pInterface
217 ? this->pInterface->Equals( pUserProc->pInterface )
218 : this->pInterface == pUserProc->pInterface;
219
220 if( isEqualParentClass // 親クラスが等しい
221 && isEqualInterface // インターフェイスが等しい
222 && pUserProc->IsEqualSymbol( *this ) // 名前空間及び名前が等しい
223 && this->Params().Equals( pUserProc->Params() ) // パラメータが等しい
224 && this->returnType.Equals( pUserProc->returnType ) ) // 戻り値が等しい
[209]225 {
226 return true;
227 }
228 return false;
229 }
230
[637]231 virtual void ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable );
232
[382]233 /*!
234 @brief オーバーライド用に関数同士が等しいかどうかをチェックする
235 @param actualTypeParametersForThisProc thisオブジェクトで保有するメソッドを対象とした実型パラメータ
236 pUserProc 照らし合わせる関数
237 */
238 bool IsEqualForOverride( const Types &actualTypeParametersForThisProc, const UserProc *pUserProc ) const;
[351]239
[206]240 bool IsMacro() const
241 {
242 return isMacro;
243 }
244
245 int GetSecondParmNum() const
246 {
247 return secondParmNum;
248 }
[572]249 void SetSecondParmNum( int secondParmNum )
250 {
251 this->secondParmNum = secondParmNum;
252 }
[206]253 const Parameters &RealParams() const
254 {
255 return realParams;
256 }
[572]257 Parameters &RealParams()
258 {
259 return realParams;
260 }
[511]261 void SetRealParams( const Parameters &params )
262 {
263 realParams = params;
264 }
[206]265 int GetRealSecondParmNum() const
266 {
267 return realSecondParmNum;
268 }
269
270 void ExportOff(){
271 isExport = false;
272 }
273 bool IsExport() const
274 {
275 return isExport;
276 }
277 void ThisIsSystemProc() const
278 {
279 isSystem = true;
280 }
281 bool IsSystem() const
282 {
283 return isSystem;
284 }
285 void ThisIsAutoGenerationProc() const
286 {
287 isAutoGeneration = true;
288 }
289 bool IsAutoGeneration() const
290 {
291 return isAutoGeneration;
292 }
293 void CompleteCompile() const
294 {
295 isCompiled = true;
296 }
297 void KillCompileStatus() const
298 {
299 isCompiled = false;
300 }
301 bool IsCompiled() const
302 {
303 return isCompiled;
304 }
305 bool IsDestructor() const
306 {
307 return ( GetName()[0] == '~' );
308 }
309
310 // バイナリコード位置とサイズ
311 DWORD GetBeginOpAddress() const
312 {
313 return beginOpAddress;
314 }
315 void SetBeginOpAddress( DWORD beginOpAddress ) const
316 {
317 this->beginOpAddress = beginOpAddress;
318 }
319 DWORD GetEndOpAddress() const
320 {
321 return endOpAddress;
322 }
323 void SetEndOpAddress( DWORD endOpAddress ) const
324 {
325 this->endOpAddress = endOpAddress;
326 }
327 int GetCodeSize() const
328 {
329 return endOpAddress - beginOpAddress;
330 }
331
[208]332 virtual const NamespaceScopes &GetNamespaceScopes() const;
[206]333 const NamespaceScopesCollection &GetImportedNamespaces() const;
334
335 Variables &GetLocalVars() const
336 {
337 return localVars;
338 }
339
340 int GetId() const
341 {
342 return id;
343 }
344
[257]345 const NativeCode &GetNativeCode() const
346 {
347 return nativeCode;
348 }
[225]349 NativeCode &GetNativeCode()
350 {
351 return nativeCode;
352 }
353
[206]354 std::string GetFullName() const;
[350]355 bool IsCastOperator() const;
[206]356
357 bool IsVirtual() const;
358
359 void SetParentClass( const CClass *pParentClass ){
360 this->pParentClass = pParentClass;
361 }
362 const CClass *GetParentClassPtr() const
363 {
364 return pParentClass;
365 }
366 const CClass &GetParentClass() const
367 {
368 return *pParentClass;
369 }
370 bool HasParentClass() const
371 {
372 return ( pParentClass != NULL );
373 }
[208]374 bool IsGlobalProcedure() const
375 {
376 return ( pParentClass == NULL );
377 }
[353]378 void SetInterface( const Interface *pInterface )
379 {
380 this->pInterface = pInterface;
381 }
[206]382 void SetMethod( CMethod *pMethod ){
383 this->pMethod = pMethod;
384 }
[336]385 const CMethod &GetMethod() const;
[206]386
[640]387 virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
[206]388
[364]389 static const UserProc *pGlobalProc;
[184]390};
391
[206]392class UserProcs : public Jenga::Common::Hashmap<UserProc>
[184]393{
[206]394 // XMLシリアライズ用
395private:
396 friend class boost::serialization::access;
397 template<class Archive> void serialize(Archive& ar, const unsigned int version)
398 {
399 trace_for_serialize( "serializing - UserProcs" );
400
401 ar & boost::serialization::make_nvp("Hashmap_UserProcImpl",
402 boost::serialization::base_object<Jenga::Common::Hashmap<UserProc>>(*this));
403 }
404
405
[184]406public:
[206]407 UserProcs()
[184]408 {
409 }
[206]410 ~UserProcs()
411 {
412 }
[184]413
[576]414 void EnumGlobalProcs( const char *simpleName, const Symbol &localSymbol, std::vector<const UserProc *> &subs );
[206]415};
416
[637]417class DllProc
418 : public Procedure
419 , public Jenga::Common::ObjectInHashmap<DllProc>
[206]420{
[523]421 std::string dllFileName;
422 std::string alias;
[206]423 int lookupAddress;
424
425 // XMLシリアライズ用
426private:
427 friend class boost::serialization::access;
428 template<class Archive> void serialize(Archive& ar, const unsigned int version)
429 {
430 trace_for_serialize( "serializing - DllProc" );
431
432 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
[637]433
434 if( ActiveBasic::Common::Environment::IsRemoveExternal() )
435 {
436 if( this->IsExternal() )
437 {
438 this->NeedResolve();
439 return;
440 }
441 }
442
[206]443 ar & BOOST_SERIALIZATION_NVP( dllFileName );
444 ar & BOOST_SERIALIZATION_NVP( alias );
445 ar & BOOST_SERIALIZATION_NVP( lookupAddress );
446 }
447
448public:
[637]449 DllProc( const Symbol &symbol, Kind kind, bool isCdecl, const std::string &dllFileName, const std::string &alias )
450 : Procedure( symbol, kind, isCdecl )
[210]451 , dllFileName( dllFileName )
452 , alias( alias )
453 , lookupAddress( 0 )
[206]454 {
455 }
[210]456 DllProc()
457 {
458 }
[209]459 ~DllProc()
460 {
461 }
[206]462
[209]463 virtual const std::string &GetKeyName() const
464 {
465 return GetName();
466 }
467
468 virtual bool IsDuplication( const DllProc *pDllProc ) const
469 {
470 if( pDllProc->IsEqualSymbol( *this )
471 && this->Params().Equals( pDllProc->Params() ) )
472 {
473 return true;
474 }
475 return false;
476 }
477
[523]478 const std::string &GetDllFileName() const
[206]479 {
480 return dllFileName;
481 }
[523]482 const std::string &GetAlias() const
[206]483 {
484 return alias;
485 }
486
487 void SetLookupAddress( int lookupAddress ){
488 this->lookupAddress = lookupAddress;
489 }
490 int GetLookupAddress() const
491 {
492 return lookupAddress;
493 }
[637]494
[640]495 virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
[184]496};
[209]497class DllProcs : public Jenga::Common::Hashmap<DllProc>
498{
499 // XMLシリアライズ用
500private:
501 friend class boost::serialization::access;
502 template<class Archive> void serialize(Archive& ar, const unsigned int version)
503 {
504 trace_for_serialize( "serializing - DllProcs" );
[184]505
[209]506 ar & boost::serialization::make_nvp("Hashmap_DllProc",
507 boost::serialization::base_object<Jenga::Common::Hashmap<DllProc>>(*this));
508 }
509};
510
[637]511class ProcPointer
512 : public Procedure
[184]513{
[206]514 // XMLシリアライズ用
515private:
516 friend class boost::serialization::access;
517 template<class Archive> void serialize(Archive& ar, const unsigned int version)
518 {
519 trace_for_serialize( "serializing - ProcPointer" );
520
521 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
522 }
523
[184]524public:
[206]525 ProcPointer( Kind kind )
[637]526 : Procedure( Symbol( NamespaceScopes(), std::string() ), kind, false )
[184]527 {
528 }
[206]529 ProcPointer()
530 {
531 }
[637]532 ~ProcPointer()
533 {
534 }
535
[640]536 virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
[184]537};
538
[523]539class ProcPointers : public std::vector<ProcPointer *>
[184]540{
[206]541 // XMLシリアライズ用
542private:
543 friend class boost::serialization::access;
544 template<class Archive> void serialize(Archive& ar, const unsigned int version)
545 {
546 trace_for_serialize( "serializing - ProcPointers" );
547
548 ar & boost::serialization::make_nvp("vector_ProcPointer",
549 boost::serialization::base_object<vector<ProcPointer *>>(*this));
550 }
551
[184]552public:
[206]553 ProcPointers()
[184]554 {
555 }
[206]556 ~ProcPointers()
[184]557 {
558 Clear();
559 }
560
[271]561 void Clear();
562 void PullOutAll()
563 {
564 clear();
565 }
[184]566};
Note: See TracBrowser for help on using the repository browser.