source: dev/BasicCompiler_Common/WatchList.cpp@ 135

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

Method/Memberのリファクタリング

File size: 12.4 KB
Line 
1#include "common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
6#include "../BasicCompiler32/opcode.h"
7#endif
8
9//デバッグ用
10#include "debug.h"
11
12int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset);
13
14ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
15 extern DWORD ImageBase;
16 extern int MemPos_RWSection;
17 int i2;
18
19 if(pRelativeVar->dwKind==VAR_GLOBAL){
20 return ImageBase+MemPos_RWSection+pRelativeVar->offset;
21 }
22 else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
23 extern HANDLE hDebugProcess;
24 LONG_PTR lpData;
25 SIZE_T accessBytes;
26 ReadProcessMemory(hDebugProcess,
27 (void *)(ImageBase+MemPos_RWSection+pRelativeVar->offset),
28 &lpData,
29 sizeof(LONG_PTR),
30 &accessBytes);
31
32 return lpData;
33 }
34 else if(pRelativeVar->dwKind==VAR_LOCAL){
35 extern HWND hDebugWnd;
36 i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
37 i2=pobj_dti->iProcLevel-i2;
38
39 if(pobj_dti->lplpSpBase[i2]==0) return 0;
40
41 return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
42 }
43 else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
44 extern HWND hDebugWnd;
45 i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
46 i2=pobj_dti->iProcLevel-i2;
47
48 if(pobj_dti->lplpSpBase[i2]==0) return 0;
49
50 extern HANDLE hDebugProcess;
51 LONG_PTR lpData;
52 SIZE_T accessBytes;
53 ReadProcessMemory(hDebugProcess,
54 (void *)(pobj_dti->lplpSpBase[i2]+(int)pRelativeVar->offset),
55 &lpData,
56 sizeof(LONG_PTR),
57 &accessBytes);
58
59 return lpData;
60 }
61 else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
62 return pRelativeVar->offset;
63 }
64
65 return 0;
66}
67
68bool Debugging_SetRelativeOffset( Type &type,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
69 int array_num;
70
71 _int64 i64data;
72 if( !StaticCalculation( true, lpPtrOffset, 0, &i64data, Type(), 1 ) ){
73 return false;
74 }
75 if( type.IsReal() ){
76 double dbl;
77 memcpy(&dbl,&i64data,sizeof(double));
78 i64data=(_int64)dbl;
79 }
80
81 array_num=(int)i64data;
82
83 if( type.PtrLevel() ){
84 type.PtrLevelDown();
85 array_num *= type.GetSize();
86 }
87 else{
88 //エラー
89 return false;
90 }
91
92 extern HANDLE hDebugProcess;
93 LONG_PTR lpData;
94 SIZE_T accessBytes;
95 lpData=Debugging_GetVarPtr(pRelativeVar);
96 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)){
97 return false;
98 }
99 pRelativeVar->dwKind=VAR_DIRECTMEM;
100
101 pRelativeVar->offset+=array_num;
102 return true;
103}
104
105int Debugging_GetMember( const CClass &objClass,char *member,RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
106 int i,i2;
107
108 //直接参照に切り替え
109 pRelativeVar->offset=(LONG_PTR)Debugging_GetVarPtr(pRelativeVar);
110 pRelativeVar->dwKind=VAR_DIRECTMEM;
111
112 //クラス、配列の構成要素を解析する
113 char VarName[VN_SIZE]; //変数名
114 char array[VN_SIZE]; //第1次配列
115 char lpPtrOffset[VN_SIZE]; //第2次配列
116 char NestMember[VN_SIZE]; //入れ子メンバ
117 CClass::RefType refType;
118 lstrcpy(VarName,member);
119 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, refType ) ) return 0;
120
121
122 ////////////////////////////
123 // メンバオフセットを取得
124 ////////////////////////////
125
126 int offset = objClass.GetMemberOffset( VarName, &i );
127 if(i==objClass.iMemberNum) return 0;
128
129
130 //アクセシビリティをチェック
131 if((bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
132 objClass.ppobj_Member[i]->dwAccess==ACCESS_NON){
133 return 0;
134 }
135 else if(bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
136 return 0;
137
138 resultType = *objClass.ppobj_Member[i];
139
140 //ポインタ変数の場合
141 if( resultType.IsPointer() ){
142 if(objClass.ppobj_Member[i]->SubScripts[0]==-1){
143 lstrcpy(lpPtrOffset,array);
144 array[0]=0;
145 }
146 }
147 else{
148 if(lpPtrOffset[0]) return 0;
149 }
150
151 pRelativeVar->offset+=offset;
152
153 if(array[0]){
154 //配列オフセット
155 i2=Debugging_GetArray(
156 objClass.ppobj_Member[i]->SubScripts,
157 array,
158 resultType,
159 &pRelativeVar->offset);
160 if(i2==0){
161 //式エラー
162 return 0;
163 }
164 if(i2==-1){
165 //アクセスエラー
166 return -1;
167 }
168 }
169 else if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
170 resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
171 }
172
173 if(NestMember[0]){
174 //入れ子構造の場合
175
176 if( resultType.IsObject() || resultType.IsStruct() ){
177 if( refType != CClass::Dot ) return 0;
178
179 if( resultType.IsObject() ){
180 extern HANDLE hDebugProcess;
181 LONG_PTR lpData;
182 SIZE_T accessBytes;
183 lpData=Debugging_GetVarPtr(pRelativeVar);
184 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)) return -1;
185 pRelativeVar->dwKind=VAR_DIRECTMEM;
186 }
187 }
188 else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
189 //構造体ポインタ型メンバ変数
190
191 if(lpPtrOffset[0]){
192 if( refType != CClass::Dot ) return 0;
193
194 //直接参照に切り替え
195 Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
196
197 lpPtrOffset[0]=0;
198 }
199 else{
200 if( refType != CClass::Pointer ) return 0;
201
202 extern HANDLE hDebugProcess;
203 LONG_PTR lpData;
204 SIZE_T accessBytes;
205 lpData=Debugging_GetVarPtr(pRelativeVar);
206 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)) return -1;
207 pRelativeVar->dwKind=VAR_DIRECTMEM;
208 }
209 }
210
211 i2=Debugging_GetMember(objClass.ppobj_Member[i]->GetClass(),
212 NestMember,
213 pRelativeVar,
214 resultType,
215 0);
216 if(i2==0){
217 //式エラー
218 return 0;
219 }
220 if(i2==-1){
221 //アクセスエラー
222 return -1;
223 }
224 }
225
226 if(lpPtrOffset[0]){
227 Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
228 }
229
230 return 1;
231}
232int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset){
233 extern HANDLE hHeap;
234 int i,i2,i3,i4,i5,array_offset;
235 char temporary[VN_SIZE],*pParm[MAX_PARMS];
236
237 for(i=0,i2=0,i3=0;;i++,i2++){
238 if(array[i]=='('){
239 i4=GetStringInPare(temporary+i2,array+i);
240 i+=i4-1;
241 i2+=i4-1;
242 continue;
243 }
244 if(array[i]=='['){
245 i4=GetStringInBracket(temporary+i2,array+i);
246 i+=i4-1;
247 i2+=i4-1;
248 continue;
249 }
250 if(array[i]==','||array[i]=='\0'){
251 if(SubScripts[i3]==-1){
252 for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
253 return 0;
254 }
255
256 temporary[i2]=0;
257
258 pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
259 lstrcpy(pParm[i3],temporary);
260
261 i3++;
262
263 if(array[i]=='\0'){
264 if(SubScripts[i3]!=-1){
265 for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
266 return 0;
267 }
268 break;
269 }
270
271 i2=-1;
272 continue;
273 }
274 temporary[i2]=array[i];
275 }
276
277 array_offset=0;
278
279 for(i=i3-1;i>=0;i--){
280 _int64 i64data;
281 Type resultType;
282 bool isMemoryAccessError;
283 if( !StaticCalculation(true, pParm[i],0,&i64data,resultType,1, &isMemoryAccessError ) ){
284 //式エラー
285 return 0;
286 }
287 if(isMemoryAccessError){
288 //アクセスエラー
289 return -1;
290 }
291
292 if(resultType.IsReal()){
293 double dbl;
294 memcpy(&dbl,&i64data,sizeof(double));
295 i64data=(_int64)dbl;
296 }
297 i5=(int)i64data;
298
299 for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
300
301 array_offset+=i5*i4;
302
303 HeapDefaultFree(pParm[i]);
304 }
305
306 array_offset *= type.GetSize();
307
308 *plpOffset+=array_offset;
309
310 return 1;
311}
312ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
313 GlobalProc *pUserProc = GetSubFromObp(obp_Rip);
314
315 foreach( Variable *pVar, pUserProc->localVars ){
316 if( pVar->GetName() == "_System_LocalThis" ){
317 return pVar->offset;
318 }
319 }
320 return 0;
321}
322int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss){
323 extern HANDLE hDebugProcess;
324 int i,i2,i3;
325 char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
326 LONG_PTR lpData;
327 SIZE_T accessBytes;
328
329 lstrcpy(VarName,variable);
330 CClass::RefType refType;
331 GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
332
333 const int *pSubScripts;
334 bool isArray;
335
336
337 /////////////////
338 // ローカル変数
339 /////////////////
340 if( UserProc::IsLocalAreaCompiling() ){
341 const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( VarName );
342
343 if( pVar ){
344 //ポインタ変数の場合
345 if( pVar->IsPointer() ){
346 if( !pVar->IsArray() ){
347 lstrcpy(lpPtrOffset,array);
348 array[0]=0;
349 }
350 }
351 else{
352 if(lpPtrOffset[0]) return 0;
353 }
354
355 pRelativeVar->offset = pVar->offset;
356 if( pVar->IsRef() ){
357 pRelativeVar->dwKind=VAR_REFLOCAL;
358 }
359 else{
360 pRelativeVar->dwKind=VAR_LOCAL;
361 }
362 resultType = *pVar;
363 isArray = pVar->IsArray();
364 pSubScripts = pVar->GetSubScriptsPtr();
365 }
366 }
367
368 if(pobj_CompilingClass){
369 ///////////////////////
370 // クラスメンバの参照
371 ///////////////////////
372
373 if(memicmp(variable,"This.",5)==0){
374 //Thisオブジェクトのメンバを参照するとき
375 SlideString(variable+5,-5);
376 lstrcpy(VarName,variable);
377 }
378 else{
379 //クラス内メンバを参照するとき(通常)
380
381 for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
382 if( pobj_CompilingClass->ppobj_Member[i]->GetName() == VarName ){
383 break;
384 }
385 }
386 if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
387 }
388
389 /////////////////////////////
390 // thisポインタを取得
391
392 extern HWND hDebugWnd;
393 i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
394 i2=pobj_dti->iProcLevel-i2;
395
396 lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
397 if(!lpData){
398 //式エラー
399 return 0;
400 }
401 lpData+=pobj_dti->lplpSpBase[i2];
402 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)){
403 //メモリにアクセスできないとき
404 return -1;
405 }
406
407 pRelativeVar->dwKind=VAR_DIRECTMEM;
408
409 i3=Debugging_GetMember(*pobj_CompilingClass,variable,pRelativeVar,resultType,1);
410 if(i3==0){
411 //式エラー
412 return 0;
413 }
414 if(i3==-1){
415 //アクセスエラー
416 return -1;
417 }
418
419 return 1;
420 }
421
422NonClassMember:
423
424 {
425 ///////////////////
426 // グローバル変数
427 ///////////////////
428
429 const Variable *pVar = globalVars.Find( VarName );
430 if( !pVar ){
431 //一致しないとき
432 return 0;
433 }
434
435 //ポインタ変数の場合
436 if( pVar->IsPointer() ){
437 if( !pVar->IsArray() ){
438 lstrcpy(lpPtrOffset,array);
439 array[0]=0;
440 }
441 }
442 else{
443 if(lpPtrOffset[0]) return 0;
444 }
445
446 pRelativeVar->offset=pVar->offset;
447 if(pVar->IsRef()) pRelativeVar->dwKind=VAR_REFGLOBAL;
448 else pRelativeVar->dwKind=VAR_GLOBAL;
449 resultType = *pVar;
450 isArray = pVar->IsArray();
451 pSubScripts=pVar->GetSubScriptsPtr();
452 }
453
454
455 if(array[0]==0&&isArray){
456 //配列の先頭ポインタを示す場合
457 resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
458 if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM*sizeof(int));
459 return 1;
460 }
461
462 if(array[0]){
463 i3=Debugging_GetArray(pSubScripts,array,resultType,&pRelativeVar->offset);
464 if(i3==0){
465 //式エラー
466 return 0;
467 }
468 if(i3==-1){
469 //アクセスエラー
470 return -1;
471 }
472 }
473 if(member[0]){
474 if( resultType.IsObject() || resultType.IsStruct() ){
475 //実態オブジェクトのメンバを参照(obj.member)
476 if( refType != CClass::Dot ){
477 return 0;
478 }
479
480 i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
481 if(i3==0){
482 //式エラー
483 return 0;
484 }
485 if(i3==-1){
486 //アクセスエラー
487 return -1;
488 }
489 }
490 else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
491 //ポインタオブジェクトが示すメンバを参照
492 if(lpPtrOffset[0]){
493 //pObj[n].member
494 if( refType != CClass::Dot ) return 0;
495 Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
496
497 i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
498 if(i3==0){
499 //式エラー
500 return 0;
501 }
502 if(i3==-1){
503 //アクセスエラー
504 return -1;
505 }
506 }
507 else{
508 //pObj->member
509 if( refType != CClass::Pointer ) return 0;
510
511 pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
512 pRelativeVar->dwKind=VAR_DIRECTMEM;
513
514 if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(LONG_PTR),&accessBytes)) return -1;
515 pRelativeVar->offset=lpData;
516
517 i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
518 if(i3==0){
519 //式エラー
520 return 0;
521 }
522 if(i3==-1){
523 //アクセスエラー
524 return -1;
525 }
526 }
527 }
528 else{
529 return 0;
530 }
531 return 1;
532 }
533
534 if(lpPtrOffset[0]){
535 if(!Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset)) return 0;
536 }
537
538 return 1;
539}
Note: See TracBrowser for help on using the repository browser.