source: dev/BasicCompiler64/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 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 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 LONG_PTR lpData;
95 SIZE_T stAccBytes;
96 lpData=Debugging_GetVarPtr(pRelativeVar);
97 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) 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=(LONG_PTR)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 LONG_PTR lpData;
196 SIZE_T stAccBytes;
197 lpData=Debugging_GetVarPtr(pRelativeVar);
198 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) 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
284 if(IsRealNumberType(i2)){
285 double dbl;
286 memcpy(&dbl,&i64data,sizeof(double));
287 i64data=(_int64)dbl;
288 }
289 i5=(int)i64data;
290
291 for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
292
293 array_offset+=i5*i4;
294
295 HeapDefaultFree(pParm[i]);
296 }
297
298 TypeSize=GetTypeSize(type,lpIndex);
299
300 array_offset*=TypeSize;
301
302 *plpOffset+=array_offset;
303
304 return 1;
305}
306ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
307 int i;
308 SUBINFO *psi;
309
310 //ripからプロシージャを取得
311 psi=GetSubFromObp(obp_Rip);
312
313 for(i=0;i<psi->VarNum;i++){
314 if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
315 }
316 if(i==psi->VarNum) return 0;
317
318 return psi->pVar[i].offset;
319}
320int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
321 extern HANDLE hDebugProcess;
322 int i,i2,i3,RefType;
323 char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
324 LONG_PTR lpData;
325 SIZE_T stAccBytes;
326
327 lstrcpy(VarName,variable);
328 GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
329
330 LONG_PTR lpIndex;
331 int *pSubScripts;
332 BOOL bArray;
333
334
335 /////////////////
336 // ローカル変数
337 /////////////////
338 extern VARIABLE *LocalVar;
339 extern int MaxLocalVarNum;
340 for(i=0;i<MaxLocalVarNum;i++){
341 if(lstrcmp(VarName,LocalVar[i].name)==0) break;
342 }
343 if(i!=MaxLocalVarNum){
344 //ポインタ変数の場合
345 if(IsPtrType(LocalVar[i].type)){
346 if(!LocalVar[i].bArray){
347 lstrcpy(lpPtrOffset,array);
348 array[0]=0;
349 }
350 }
351 else{
352 if(lpPtrOffset[0]) return 0;
353 }
354
355 pRelativeVar->offset=LocalVar[i].offset;
356 if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
357 else pRelativeVar->dwKind=VAR_LOCAL;
358 *pType=LocalVar[i].type;
359 lpIndex=LocalVar[i].u.index;
360 *plpIndex=lpIndex;
361 bArray=LocalVar[i].bArray;
362 pSubScripts=LocalVar[i].SubScripts;
363 }
364 else{
365 if(pobj_CompilingClass){
366 ///////////////////////
367 // クラスメンバの参照
368 ///////////////////////
369
370 if(memicmp(variable,"This.",5)==0){
371 //Thisオブジェクトのメンバを参照するとき
372 SlideString(variable+5,-5);
373 lstrcpy(VarName,variable);
374 }
375 else{
376 //クラス内メンバを参照するとき(通常)
377
378 for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
379 if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
380 }
381 if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
382 }
383
384 /////////////////////////////
385 // thisポインタを取得
386
387 extern HWND hDebugWnd;
388 i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
389 i2=pobj_dti->iProcLevel-i2;
390
391 lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
392 if(!lpData){
393 //式エラー
394 return 0;
395 }
396 lpData+=pobj_dti->lplpSpBase[i2];
397 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)){
398 //メモリにアクセスできないとき
399 return -1;
400 }
401
402 pRelativeVar->dwKind=VAR_DIRECTMEM;
403
404 LONG_PTR lp2;
405 i3=Debugging_GetMember(pobj_CompilingClass,variable,pType,pRelativeVar,&lp2,1);
406 if(i3==0){
407 //式エラー
408 return 0;
409 }
410 if(i3==-1){
411 //アクセスエラー
412 return -1;
413 }
414
415 *plpIndex=lp2;
416 return 1;
417 }
418
419NonClassMember:
420
421 ///////////////////
422 // グローバル変数
423 ///////////////////
424 extern VARIABLE *GlobalVar;
425 extern int MaxGlobalVarNum;
426
427 for(i=0;i<MaxGlobalVarNum;i++){
428 if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
429 }
430 if(i==MaxGlobalVarNum){
431 //一致しないとき
432 return 0;
433 }
434
435 //ポインタ変数の場合
436 if(IsPtrType(GlobalVar[i].type)){
437 if(!GlobalVar[i].bArray){
438 lstrcpy(lpPtrOffset,array);
439 array[0]=0;
440 }
441 }
442 else{
443 if(lpPtrOffset[0]) return 0;
444 }
445
446 pRelativeVar->offset=GlobalVar[i].offset;
447 if(GlobalVar[i].fRef) pRelativeVar->dwKind=VAR_REFGLOBAL;
448 else pRelativeVar->dwKind=VAR_GLOBAL;
449 *pType=GlobalVar[i].type;
450 lpIndex=GlobalVar[i].u.index;
451 *plpIndex=lpIndex;
452 bArray=GlobalVar[i].bArray;
453 pSubScripts=GlobalVar[i].SubScripts;
454 }
455
456
457 if(array[0]==0&&bArray){
458 //配列の先頭ポインタを示す場合
459 *pType|=FLAG_PTR;
460 if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
461 return 1;
462 }
463
464 if(array[0]){
465 i3=Debugging_GetArray(pSubScripts,array,*pType,lpIndex,&pRelativeVar->offset);
466 if(i3==0){
467 //式エラー
468 return 0;
469 }
470 if(i3==-1){
471 //アクセスエラー
472 return -1;
473 }
474 }
475 if(member[0]){
476 if(*pType==DEF_OBJECT){
477 //実態オブジェクトのメンバを参照(obj.member)
478 if(RefType!=DEF_OBJECT){
479 return 0;
480 }
481
482 LONG_PTR lp2;
483 i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
484 if(i3==0){
485 //式エラー
486 return 0;
487 }
488 if(i3==-1){
489 //アクセスエラー
490 return -1;
491 }
492
493 *plpIndex=lp2;
494 }
495 else if(*pType==DEF_PTR_OBJECT){
496 //ポインタオブジェクトが示すメンバを参照
497 if(lpPtrOffset[0]){
498 //pObj[n].member
499 if(RefType!=DEF_OBJECT) return 0;
500 Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
501
502 LONG_PTR lp2;
503 i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
504 if(i3==0){
505 //式エラー
506 return 0;
507 }
508 if(i3==-1){
509 //アクセスエラー
510 return -1;
511 }
512
513 *plpIndex=lp2;
514 }
515 else{
516 //pObj->member
517 if(RefType!=DEF_PTR_OBJECT) return 0;
518
519 pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
520 pRelativeVar->dwKind=VAR_DIRECTMEM;
521
522 if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(LONG_PTR),&stAccBytes)) return -1;
523 pRelativeVar->offset=lpData;
524
525 LONG_PTR lp2;
526 i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
527 if(i3==0){
528 //式エラー
529 return 0;
530 }
531 if(i3==-1){
532 //アクセスエラー
533 return -1;
534 }
535
536 *plpIndex=lp2;
537 }
538 }
539 else{
540 return 0;
541 }
542 return 1;
543 }
544
545 if(lpPtrOffset[0]){
546 if(!Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset)) return 0;
547 }
548
549 return 1;
550}
Note: See TracBrowser for help on using the repository browser.