source: dev/trunk/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp@ 655

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

・デバッグトレース時、グローバル領域の終端行でステップインまたはステップアウトしたときにデバッグ情報の取得に失敗して強制終了してしまう不具合を修正。
・グローバル領域のデバッグ実行ができなくなっている不具合を修正。

File size: 6.7 KB
Line 
1#include "stdafx.h"
2
3
4void Procedure::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
5{
6 RelationalObjectModuleItem::ResetRelationalObjectModuleIndex( relationTable );
7
8 if( !this->sourceCodePosition.IsNothing() )
9 {
10 this->sourceCodePosition.SetRelationalObjectModuleIndex( relationTable[this->sourceCodePosition.GetRelationalObjectModuleIndex()] );
11 }
12}
13
14bool Procedure::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
15{
16 BOOST_FOREACH( Parameter *pParameter, params )
17 {
18 pParameter->Resolve( resolver, resolveErrors );
19 }
20
21 returnType.Resolve( resolver, resolveErrors );
22
23 return true;
24}
25
26
27void UserProc::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
28{
29 Procedure::ResetRelationalObjectModuleIndex( relationTable );
30
31 this->GetNativeCode().ResetRelationalObjectModuleIndex( relationTable );
32}
33
34int id_base = 0;
35
36UserProc::UserProc( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces, Kind kind, bool isMacro, bool isCdecl, bool isExport )
37 : Procedure( symbol, kind, isCdecl )
38 , importedNamespaces( importedNamespaces )
39 , pParentClass( NULL )
40 , pInterface( NULL )
41 , pMethod( NULL )
42 , isMacro( isMacro )
43 , secondParmNum( 0 )
44 , realSecondParmNum( 1 )
45 , isExport( isExport )
46 , isAutoGenerationSystem( false )
47 , isAutoGeneration( false )
48 , isCompiled( false )
49 , beginOpAddress( 0 )
50 , endOpAddress( 0 )
51 , id( id_base ++ )
52{
53}
54
55UserProc::UserProc( const UserProc &userProc, const CClass *pParentClass )
56 : Procedure( userProc )
57 , _paramStr( userProc._paramStr )
58 , importedNamespaces( userProc.importedNamespaces )
59 , pParentClass( pParentClass )
60 , pInterface( NULL )
61 , pMethod( NULL )
62 , isMacro( userProc.isMacro )
63 , secondParmNum( userProc.secondParmNum )
64 , realParams( userProc.realParams )
65 , realSecondParmNum( userProc.realSecondParmNum )
66 , isExport( userProc.isExport )
67 , isAutoGenerationSystem( userProc.isAutoGenerationSystem )
68 , isAutoGeneration( userProc.isAutoGeneration )
69 , isCompiled( false )
70 , beginOpAddress( 0 )
71 , endOpAddress( 0 )
72 , localVars( Variables() )
73 , id( id_base ++ )
74 , nativeCode( NativeCode() )
75{
76}
77
78UserProc::UserProc()
79{
80}
81
82UserProc::~UserProc()
83{
84 BOOST_FOREACH( Parameter *pParam, realParams ){
85 delete pParam;
86 }
87}
88
89bool UserProc::IsEqualForOverride( const Types &actualTypeParametersForThisProc, const UserProc *pUserProc ) const
90{
91 if( this->GetName() == pUserProc->GetName() // 名前空間及び名前が等しい
92 && this->Params().Equals( actualTypeParametersForThisProc, pUserProc->Params() ) ) // パラメータが等しい
93 {
94 if( this->returnType.Equals( pUserProc->returnType ) )
95 {
96 // 戻り値が等しい
97 return true;
98 }
99 else if( this->returnType.IsCovariant( pUserProc->returnType ) )
100 {
101 // 戻り値が共変
102 return true;
103 }
104 else if( this->returnType.IsTypeParameter() )
105 {
106 // 型パラメータだったとき
107
108 if( actualTypeParametersForThisProc[this->returnType.GetFormalTypeIndex()].Equals( pUserProc->returnType ) )
109 {
110 // 戻り値が等しい
111 return true;
112 }
113 else if( actualTypeParametersForThisProc[this->returnType.GetFormalTypeIndex()].IsCovariant( pUserProc->returnType ) )
114 {
115 // 戻り値が共変
116 return true;
117 }
118 }
119 }
120 return false;
121}
122
123
124std::string UserProc::GetFullName() const
125{
126 if( HasParentClass() ){
127 return GetParentClass().GetName() + "." + GetName();
128 }
129
130 return GetName();
131}
132bool UserProc::IsCastOperator() const
133{
134 if( GetName()[0] == 1 && GetName()[1] == ESC_OPERATOR && GetName()[2] == CALC_AS )
135 {
136 return true;
137 }
138 return false;
139}
140bool UserProc::IsSystem() const
141{
142 // "_System_" を名前の先頭に含む関数
143 if( memcmp( this->GetName().c_str(), "_System_", 8 ) == 0 )
144 {
145 return true;
146 }
147
148 // "_System_" を名前の先頭に含むクラスのメソッド
149 if( this->HasParentClass() )
150 {
151 if( memcmp( this->GetParentClass().GetName().c_str(), "_System_", 8 ) == 0 )
152 {
153 return true;
154 }
155 }
156
157 return false;
158}
159const NamespaceScopes &UserProc::GetNamespaceScopes() const
160{
161 if( HasParentClass() )
162 {
163 return GetParentClassPtr()->GetNamespaceScopes();
164 }
165 return Symbol::GetNamespaceScopes();
166}
167const NamespaceScopesCollection &UserProc::GetImportedNamespaces() const
168{
169 if( pParentClass )
170 {
171 return pParentClass->GetImportedNamespaces();
172 }
173 return importedNamespaces;
174}
175bool UserProc::IsVirtual() const
176{
177 if( pMethod == NULL ){
178 return false;
179 }
180 return ( pMethod->IsVirtual() != 0 );
181}
182const CMethod &UserProc::GetMethod() const
183{
184 if( !HasParentClass() )
185 {
186 Jenga::Throw( "グローバル関数に対してUserProc::GetMethodメソッドが呼ばれた" );
187 }
188 return *pMethod;
189}
190
191bool UserProc::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
192{
193 Procedure::Resolve( resolver, resolveErrors );
194
195 if( this->pParentClass )
196 {
197 if( this->pParentClass->IsNeedResolve() )
198 {
199 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pParentClass );
200 if( pTempClass )
201 {
202 this->pParentClass = pTempClass;
203 }
204 else
205 {
206 resolveErrors.Add( ResolveError( this->pParentClass->GetRelationalObjectModuleIndex(), this->pParentClass->GetFullName() ) );
207 }
208 }
209 }
210
211 if( pInterface )
212 {
213 const_cast<Interface *>(pInterface)->Resolve( resolver, resolveErrors );
214 }
215
216 if( pMethod )
217 {
218 pMethod->Resolve( resolver, resolveErrors );
219 }
220
221 BOOST_FOREACH( Parameter *pParameter, realParams )
222 {
223 pParameter->Resolve( resolver, resolveErrors );
224 }
225
226 BOOST_FOREACH( Variable *pLocalVar, localVars )
227 {
228 pLocalVar->Resolve( resolver, resolveErrors );
229 }
230
231 nativeCode.Resolve( resolver, resolveErrors );
232 return true;
233}
234
235const UserProc *UserProc::pGlobalProc = NULL;
236
237
238void UserProcs::EnumGlobalProcs( const char *simpleName, const Symbol &localSymbol, std::vector<const UserProc *> &subs )
239{
240 ///////////////////////////
241 // グローバル関数を検索
242 ///////////////////////////
243
244 // ハッシュ値を取得
245 UserProc *pUserProc = GetHashArrayElement( simpleName );
246 while(pUserProc){
247 if( pUserProc->IsGlobalProcedure() ){
248 if( pUserProc->IsEqualSymbol( localSymbol ) ){
249 subs.push_back( pUserProc );
250 }
251 }
252
253 pUserProc=pUserProc->GetChainNext();
254 }
255}
256
257bool DllProc::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
258{
259 Procedure::Resolve( resolver, resolveErrors );
260 return true;
261}
262
263bool ProcPointer::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
264{
265 Procedure::Resolve( resolver, resolveErrors );
266 return true;
267}
268
269void ProcPointers::Clear()
270{
271 ProcPointers &procPointers = *this;
272 BOOST_FOREACH( ProcPointer *pProcPointer, procPointers ){
273 delete pProcPointer;
274 }
275 this->clear();
276}
Note: See TracBrowser for help on using the repository browser.