source: dev/BasicCompiler64/WatchList.cpp@ 62

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

グローバル変数に対してByRefを指定できるようにした

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