source: dev/BasicCompiler32/WatchList.cpp@ 63

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

CClass::GetSize、CClass::GetMemberOffsetを追加

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