source: dev/BasicCompiler32/WatchList.cpp@ 62

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

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

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