source: dev/BasicCompiler64/WatchList.cpp@ 73

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

Parameterクラスを適用。32bit側は動くようになったので、64bitのほうを調整する。

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