source: dev/BasicCompiler32/Compile_Var.cpp@ 17

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

定数メンバ機能を有効にした。

File size: 30.5 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2#include "Opcode.h"
3
4//変数
5VARIABLE *GlobalVar;
6int MaxGlobalVarNum;
7int AllGlobalVarSize;
8int AllInitGlobalVarSize;
9VARIABLE *LocalVar;
10int MaxLocalVarNum;
11int AllLocalVarSize;
12
13void SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
14 int i2;
15
16 PushLongVariable(pRelativeVar);
17
18 i2=NumOpe(lpPtrOffset,0,0,0);
19 ChangeTypeToLong(i2);
20
21 //pop ebx
22 op_pop(REG_EBX);
23
24 if(PTR_LEVEL(*pType)){
25 *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
26 if((*pType)==DEF_OBJECT){
27 //imul ebx,objsize
28 OpBuffer[obp++]=(char)0x69;
29 OpBuffer[obp++]=(char)0xDB;
30 *((long *)(OpBuffer+obp))=GetSizeOfClassMember((CClass *)lpIndex,NULL,NULL);
31 obp+=sizeof(long);
32 }
33 else{
34 i2=GetTypeSize(*pType,-1);
35 if(i2>=2){
36 //imul ebx,i2
37 OpBuffer[obp++]=(char)0x6B;
38 OpBuffer[obp++]=(char)0xDB;
39 OpBuffer[obp++]=(char)i2;
40 }
41 }
42 }
43 else{
44 //エラー
45 SetError(1,NULL,cp);
46 return;
47 }
48
49 //pop ecx
50 op_pop(REG_ECX);
51
52 //add ecx,ebx
53 OpBuffer[obp++]=(char)0x03;
54 OpBuffer[obp++]=(char)0xCB;
55}
56BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){
57 extern HANDLE hHeap;
58 int i,i2,i3,i4,TypeSize;
59 char temporary[VN_SIZE],*pParm[MAX_PARMS];
60
61 for(i=0,i2=0,i3=0;;i++,i2++){
62 if(array[i]=='('){
63 i4=GetStringInPare(temporary+i2,array+i);
64 i+=i4-1;
65 i2+=i4-1;
66 continue;
67 }
68 if(array[i]=='['){
69 i4=GetStringInBracket(temporary+i2,array+i);
70 i+=i4-1;
71 i2+=i4-1;
72 continue;
73 }
74 if(array[i]==','||array[i]=='\0'){
75 if(SubScripts[i3]==-1){
76 for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
77 return 0;
78 }
79
80 temporary[i2]=0;
81
82 pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
83 lstrcpy(pParm[i3],temporary);
84
85 i3++;
86
87 if(array[i]=='\0'){
88 if(SubScripts[i3]!=-1){
89 for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
90 return 0;
91 }
92 break;
93 }
94
95 i2=-1;
96 continue;
97 }
98 temporary[i2]=array[i];
99 }
100
101 //push ecx
102 op_push(REG_ECX);
103
104 //push 0
105 op_push_value(0);
106
107 for(i=i3-1;i>=0;i--){
108 TYPEINFO TypeInfo;
109 BOOL bUseHeap;
110 TypeInfo.type=NumOpe(pParm[i],DEF_LONG,-1,&TypeInfo.u.lpIndex,&bUseHeap);
111 if(TypeInfo.type==DEF_OBJECT){
112 //キャスト演算子のオーバーロードに対応する
113 CallCastOperatorProc(
114 TypeInfo.type,TypeInfo.u.lpIndex,
115 bUseHeap,DEF_LONG,-1);
116 TypeInfo.type=DEF_LONG;
117 }
118 ChangeTypeToLong(TypeInfo.type);
119
120 //pop eax
121 op_pop(REG_EAX);
122
123 for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
124
125 //imul eax,i4
126 OpBuffer[obp++]=(char)0x69;
127 OpBuffer[obp++]=(char)0xC0;
128 *((long *)(OpBuffer+obp))=i4;
129 obp+=sizeof(long);
130
131 //add dword ptr[esp],eax
132 OpBuffer[obp++]=(char)0x01;
133 OpBuffer[obp++]=(char)0x04;
134 OpBuffer[obp++]=(char)0x24;
135
136 HeapDefaultFree(pParm[i]);
137 }
138
139 //pop eax
140 op_pop(REG_EAX);
141
142 TypeSize=GetTypeSize(type,lpIndex);
143
144 //imul eax,TypeSize
145 OpBuffer[obp++]=(char)0x69;
146 OpBuffer[obp++]=(char)0xC0;
147 *((long *)(OpBuffer+obp))=TypeSize;
148 obp+=sizeof(long);
149
150 //pop ecx
151 op_pop(REG_ECX);
152
153 //add ecx,eax
154 OpBuffer[obp++]=(char)0x03;
155 OpBuffer[obp++]=(char)0xC8;
156
157 return 1;
158}
159BOOL GetMemberOffset(bool isErrorEnabled, bool isWriteAccess, CClass *pobj_c, char *member, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpNestIndex, BOOL bPrivateAccess){
160 int i,offset;
161
162 //クラス、配列の構成要素を解析する
163 char VarName[VN_SIZE]; //変数名
164 char array[VN_SIZE]; //第1次配列
165 char lpPtrOffset[VN_SIZE]; //第2次配列
166 char NestMember[VN_SIZE]; //入れ子メンバ
167 int RefType; //"."参照のときは0、"->"参照のときは1
168 lstrcpy(VarName,member);
169 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
170
171 ////////////////////////////
172 // メンバオフセットを取得
173 ////////////////////////////
174
175 offset=GetSizeOfClassMember(pobj_c,VarName,&i);
176 if(i==pobj_c->iMemberNum){
177 if(isErrorEnabled) SetError(103,VarName,cp);
178 return 0;
179 }
180
181 //アクセシビリティをチェック
182 if(pobj_c==pobj_CompilingClass){
183 //同一クラスオブジェクトの場合はプライベートアクセスを容認する
184 if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
185 if(isErrorEnabled) SetError(107,VarName,cp);
186 return 0;
187 }
188 }
189 else{
190 if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
191 pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
192 if(isErrorEnabled) SetError(107,VarName,cp);
193 return 0;
194 }
195 else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
196 if(isErrorEnabled) SetError(108,VarName,cp);
197 return 0;
198 }
199 }
200
201 //Const定義の場合は書き込みアクセスを制限する
202 //※コンストラクタをコンパイル中の場合は例外的に許可する
203 if( pobj_c->ppobj_Member[i]->IsConst() && //定数メンバである
204 isWriteAccess && //書き込みアクセスを要求されている
205 pobj_c->IsCompilingConstructor() == false //コンストラクタ コンパイル中を除く
206 ){
207 //Const定義の変数に書き込みアクセスをしようとした場合
208 SetError(61,VarName,cp);
209 }
210
211 *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
212 *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
213
214 //ポインタ変数の場合
215 if(IsPtrType(*pType)){
216 if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
217 lstrcpy(lpPtrOffset,array);
218 array[0]=0;
219 }
220 }
221 else{
222 if(lpPtrOffset[0]){
223 if(isErrorEnabled) SetError(16,member,cp);
224 return 0;
225 }
226 }
227
228 if(offset){
229 //add ecx,offset
230 OpBuffer[obp++]=(char)0x81;
231 OpBuffer[obp++]=(char)0xC1;
232 *((long *)(OpBuffer+obp))=offset;
233 obp+=sizeof(long);
234 }
235
236 if(array[0]){
237 //配列オフセット
238 if(!GetArrayOffset(pobj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex))
239 if(isErrorEnabled) SetError(14,member,cp);
240 }
241 else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
242 *pType|=FLAG_PTR;
243 }
244
245 if(NestMember[0]){
246 //入れ子構造の場合
247
248 if(*pType==DEF_OBJECT){
249 if(RefType!=DEF_OBJECT){
250 if(isErrorEnabled) SetError(104,member,cp);
251 return 0;
252 }
253 }
254 else if(*pType==DEF_PTR_OBJECT){
255 //構造体ポインタ型メンバ変数
256
257 if(lpPtrOffset[0]){
258 //pObj[n].member
259 if(RefType!=DEF_OBJECT){
260 if(isErrorEnabled) SetError(104,member,cp);
261 return 0;
262 }
263
264 //直接参照に切り替え
265 SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
266 pRelativeVar->dwKind=VAR_DIRECTMEM;
267
268 lpPtrOffset[0]=0;
269 }
270 else{
271 //pObj->member
272 if(RefType!=DEF_PTR_OBJECT){
273 if(isErrorEnabled) SetError(104,member,cp);
274 return 0;
275 }
276
277 if(pRelativeVar->dwKind==VAR_DIRECTMEM){
278 //mov ecx,dword ptr[ecx]
279 OpBuffer[obp++]=(char)0x8B;
280 OpBuffer[obp++]=(char)0x09;
281 }
282 else{
283 //直接参照に切り替え
284 SetVarPtrToEax(pRelativeVar);
285 pRelativeVar->dwKind=VAR_DIRECTMEM;
286
287 //mov ecx,dword ptr[eax]
288 OpBuffer[obp++]=(char)0x8B;
289 OpBuffer[obp++]=(char)0x08;
290 }
291 }
292 }
293 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
294 //構造体ポインタのポインタ型メンバ変数
295
296 if(lpPtrOffset[0]){
297 //ppObj[n]->member
298 if(RefType!=DEF_PTR_OBJECT){
299 if(isErrorEnabled) SetError(104,member,cp);
300 return 0;
301 }
302
303 //直接参照に切り替え
304 SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
305 pRelativeVar->dwKind=VAR_DIRECTMEM;
306
307 lpPtrOffset[0]=0;
308
309 //mov ecx,dword ptr[ecx]
310 OpBuffer[obp++]=(char)0x8B;
311 OpBuffer[obp++]=(char)0x09;
312 }
313 else{
314 if(isErrorEnabled) SetError(104,member,cp);
315 return 0;
316 }
317 }
318
319 if(!GetMemberOffset(
320 isErrorEnabled,
321 isWriteAccess,
322 pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
323 NestMember,
324 pType,
325 pRelativeVar,
326 plpNestIndex,
327 0)) return 0;
328 }
329
330 if(lpPtrOffset[0]){
331 SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
332 pRelativeVar->dwKind=VAR_DIRECTMEM;
333 }
334
335 return 1;
336}
337void GetWithName(char *buffer){
338 extern WITHINFO WithInfo;
339 int i;
340
341 buffer[0]=0;
342 for(i=0;i<WithInfo.num;i++)
343 lstrcat(buffer,WithInfo.ppName[i]);
344}
345
346int LocalVar_ThisPtrOffset;
347void SetThisPtrToReg(int reg){
348 //自身のオブジェクトのThisポインタをregにコピー
349
350 extern VARIABLE *LocalVar;
351 RELATIVE_VAR RelativeVar;
352 RelativeVar.dwKind=VAR_LOCAL;
353 RelativeVar.bOffsetOffset=0;
354 RelativeVar.offset=-LocalVar_ThisPtrOffset;
355
356 SetReg_WholeVariable(DEF_PTR_VOID,&RelativeVar,reg);
357}
358
359BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){
360 extern BOOL bCompilingGlobal;
361 int i,RefType;
362 char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
363
364 if(NameBuffer[0]=='.'){
365 GetWithName(variable);
366 lstrcat(variable,NameBuffer);
367 }
368 else lstrcpy(variable,NameBuffer);
369
370 lstrcpy(VarName,variable);
371 GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
372
373 LONG_PTR lpIndex;
374 int *pSubScripts;
375 bool bConst;
376
377 if(bCompilingGlobal==0){
378 ////////////////////
379 // ローカル変数
380 ////////////////////
381
382 for(i=MaxLocalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ
383 if(LocalVar[i].bLiving){
384 if(lstrcmp(VarName,LocalVar[i].name)==0) break;
385 }
386 }
387 if(i>=0){
388 //ポインタ変数の場合
389 if(IsPtrType(LocalVar[i].type)){
390 if(LocalVar[i].SubScripts[0]==-1){
391 lstrcpy(lpPtrOffset,array);
392 array[0]=0;
393 }
394 }
395 else{
396 if(lpPtrOffset[0]){
397 SetError(16,variable,cp);
398 pRelativeVar->dwKind=NON_VAR;
399 return 0;
400 }
401 }
402
403 pRelativeVar->offset=-LocalVar[i].offset;
404 pRelativeVar->bOffsetOffset=0;
405 if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
406 else pRelativeVar->dwKind=VAR_LOCAL;
407 *pType=LocalVar[i].type;
408 lpIndex=LocalVar[i].u.index;
409 if(plpIndex) *plpIndex=lpIndex;
410 pSubScripts=LocalVar[i].SubScripts;
411 bConst = LocalVar[i].bConst;
412
413 goto ok;
414 }
415 }
416
417 if(pobj_CompilingClass){
418 //////////////////////
419 // クラスメンバの参照
420 //////////////////////
421
422 if(lstrcmpi(variable,"This")==0){
423 //Thisオブジェクト
424
425 //Thisポインタをecxにコピー
426 SetThisPtrToReg(REG_ECX);
427
428 *pType=DEF_OBJECT;
429 pRelativeVar->dwKind=VAR_DIRECTMEM;
430
431 if(plpIndex) *plpIndex=(LONG_PTR)pobj_CompilingClass;
432 return 1;
433 }
434
435 if(_memicmp(variable,"This.",5)==0){
436 //Thisオブジェクトのメンバを参照するとき
437 SlideString(variable+5,-5);
438 lstrcpy(VarName,variable);
439 }
440 else{
441 //クラス内メンバを参照するとき(通常)
442
443 for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
444 if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
445 }
446 if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
447 }
448
449 /////////////////////////////
450 // thisポインタをecxにセット
451
452 //Thisポインタをecxにコピー
453 SetThisPtrToReg(REG_ECX);
454
455 pRelativeVar->dwKind=VAR_DIRECTMEM;
456 if(!GetMemberOffset(
457 isErrorEnabled,
458 isWriteAccess,
459 pobj_CompilingClass,
460 variable,
461 pType,
462 pRelativeVar,
463 &lpIndex,1)) return 0;
464 if(plpIndex) *plpIndex=lpIndex;
465 return 1;
466 }
467
468NonClassMember:
469
470 //////////////////////////
471 // 静的ローカル変数
472 // ※"Static.Object.Method.Variable"
473 //////////////////////////
474
475 char temporary[VN_SIZE];
476 extern SUBINFO *pCompilingSubInfo;
477 if(pCompilingSubInfo){
478 GetNowStaticVarFullName(VarName,temporary);
479
480 for(i=0;i<MaxGlobalVarNum;i++){
481 if(lstrcmp(temporary,GlobalVar[i].name)==0) break;
482 }
483 if(i!=MaxGlobalVarNum){
484 goto GlobalOk;
485 }
486 }
487
488
489 ////////////////////
490 // グローバル変数
491 ////////////////////
492
493 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ
494 if(GlobalVar[i].bLiving){
495 if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
496 }
497 }
498 if(i>=0){
499 goto GlobalOk;
500 }
501
502
503 //////////////////////////
504 // クラスの静的メンバ
505 //////////////////////////
506
507 if(member[0]){
508 lstrcpy(temporary,member);
509 GetVarFormatString(temporary,array,lpPtrOffset,member,&i);
510
511 char temp2[VN_SIZE];
512 sprintf(temp2,"%s.%s",VarName,temporary);
513 for(i=0;i<MaxGlobalVarNum;i++){
514 if(lstrcmp(temp2,GlobalVar[i].name)==0) break;
515 }
516
517 if(i!=MaxGlobalVarNum){
518 goto GlobalOk;
519 }
520 }
521
522 if(pobj_CompilingClass){
523 //自身のクラスから静的メンバを参照する場合
524 char temp2[VN_SIZE];
525 sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName);
526 for(i=0;i<MaxGlobalVarNum;i++){
527 if(lstrcmp(temp2,GlobalVar[i].name)==0) break;
528 }
529
530 if(i!=MaxGlobalVarNum){
531 goto GlobalOk;
532 }
533 }
534
535 if(isErrorEnabled) SetError(3,variable,cp);
536 pRelativeVar->dwKind=NON_VAR;
537 return 0;
538
539
540GlobalOk:
541
542 //ポインタ変数の場合
543 if(IsPtrType(GlobalVar[i].type)){
544 if(GlobalVar[i].SubScripts[0]==-1){
545 lstrcpy(lpPtrOffset,array);
546 array[0]=0;
547 }
548 }
549 else{
550 if(lpPtrOffset[0]){
551 SetError(16,variable,cp);
552 pRelativeVar->dwKind=NON_VAR;
553 return 0;
554 }
555 }
556
557 pRelativeVar->offset=GlobalVar[i].offset;
558 pRelativeVar->bOffsetOffset=0;
559 pRelativeVar->dwKind=VAR_GLOBAL;
560 *pType=GlobalVar[i].type;
561 lpIndex=GlobalVar[i].u.index;
562 if(plpIndex) *plpIndex=lpIndex;
563 pSubScripts=GlobalVar[i].SubScripts;
564 bConst = GlobalVar[i].bConst;
565
566
567ok:
568
569 if(bConst && isWriteAccess){
570 //Const定義の変数に書き込みアクセスをしようとした場合
571 SetError(61,VarName,cp);
572 }
573
574 if(array[0]==0&&pSubScripts[0]!=-1){
575 //配列の先頭ポインタを示す場合
576 *pType|=FLAG_PTR;
577 if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
578 return 1;
579 }
580
581 if(array[0]||member[0]){
582 //xor ecx,ecx(ecxを0に初期化する)
583 //※ecxは変数ベースアドレスからの相対オフセットを示す
584 op_zero_reg(REG_ECX);
585
586 pRelativeVar->bOffsetOffset=1;
587 }
588 if(array[0]){
589 if(!GetArrayOffset(pSubScripts,array,*pType,lpIndex)){
590 SetError(14,variable,cp);
591 pRelativeVar->dwKind=NON_VAR;
592 return 0;
593 }
594 }
595 if(member[0]){
596 if(*pType==DEF_OBJECT){
597 //実態オブジェクトのメンバを参照(obj.member)
598 if(RefType!=DEF_OBJECT){
599 SetError(104,VarName,cp);
600 pRelativeVar->dwKind=NON_VAR;
601 return 0;
602 }
603 }
604 else if(*pType==DEF_PTR_OBJECT){
605 //ポインタオブジェクトが示すメンバを参照
606 if(lpPtrOffset[0]){
607 //pObj[n].member
608 if(RefType!=DEF_OBJECT){
609 SetError(104,VarName,cp);
610 pRelativeVar->dwKind=NON_VAR;
611 return 0;
612 }
613 SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
614 pRelativeVar->dwKind=VAR_DIRECTMEM;
615 }
616 else{
617 //pObj->member
618 if(RefType!=DEF_PTR_OBJECT){
619 SetError(104,VarName,cp);
620 pRelativeVar->dwKind=NON_VAR;
621 return 0;
622 }
623
624 SetVarPtrToEax(pRelativeVar);
625 pRelativeVar->dwKind=VAR_DIRECTMEM;
626
627 //mov ecx,dword ptr[eax]
628 OpBuffer[obp++]=(char)0x8B;
629 OpBuffer[obp++]=(char)0x08;
630 }
631 }
632 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
633 //ポインタオブジェクトが示すメンバを参照
634 if(lpPtrOffset[0]){
635 //ppObj[n]->member
636 if(RefType!=DEF_PTR_OBJECT){
637 SetError(104,VarName,cp);
638 pRelativeVar->dwKind=NON_VAR;
639 return 0;
640 }
641
642 SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
643 pRelativeVar->dwKind=VAR_DIRECTMEM;
644
645
646 SetVarPtrToEax(pRelativeVar);
647
648 //mov ecx,dword ptr[eax]
649 OpBuffer[obp++]=(char)0x8B;
650 OpBuffer[obp++]=(char)0x08;
651 }
652 else{
653 SetError(104,VarName,cp);
654 pRelativeVar->dwKind=NON_VAR;
655 return 0;
656 }
657 }
658 else{
659 SetError(102,VarName,cp);
660 pRelativeVar->dwKind=NON_VAR;
661 return 0;
662 }
663
664 LONG_PTR lp2;
665 if(!GetMemberOffset(
666 isErrorEnabled,
667 isWriteAccess,
668 (CClass *)lpIndex,
669 member,pType,pRelativeVar,&lp2,0)) return 0;
670 if(plpIndex) *plpIndex=lp2;
671
672 return 1;
673 }
674
675 if(lpPtrOffset[0]){
676 SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
677 pRelativeVar->dwKind=VAR_DIRECTMEM;
678 }
679
680 return 1;
681}
682
683BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){
684 extern BYTE *initGlobalBuf;
685 int i,i2,i3,TypeSize;
686 char temporary[VN_SIZE];
687
688 if(InitBuf[0]=='['){
689 SlideString(InitBuf+1,-1);
690 InitBuf[lstrlen(InitBuf)-1]=0;
691
692 TypeSize=GetTypeSize(type,lpIndex);
693
694 if(SubScripts[0]!=-1){
695 TypeSize*=JumpSubScripts(SubScripts+1);
696 i=0;
697 i2=0;
698 while(1){
699 if(SubScripts[0]<i2){
700 SetError(41,0,cp);
701 return 0;
702 }
703 i=GetOneParameter(InitBuf,i,temporary);
704 if(!SetInitGlobalData(
705 offset+i2*TypeSize,
706 type,
707 lpIndex,
708 SubScripts+1,
709 temporary)) return 0;
710 i2++;
711 if(InitBuf[i]=='\0') break;
712 }
713 return -1;
714 }
715
716 if(type==DEF_OBJECT){
717 CClass *pobj_c;
718 pobj_c=(CClass *)lpIndex;
719
720 for(i=0,i2=0;i2<pobj_c->iMemberNum;i2++){
721 i=GetOneParameter(InitBuf,i,temporary);
722
723 i3=GetSizeOfClassMember(pobj_c,pobj_c->ppobj_Member[i2]->name,NULL);
724
725 if(!SetInitGlobalData(offset+i3,
726 pobj_c->ppobj_Member[i2]->TypeInfo.type,
727 pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex,
728 pobj_c->ppobj_Member[i2]->SubScripts,
729 temporary)) return 0;
730
731 if(InitBuf[i]=='\0') break;
732 }
733 if(i2+1!=pobj_c->iMemberNum){
734 SetError(41,0,cp);
735 return 0;
736 }
737 return 1;
738 }
739
740 SetError(41,0,cp);
741 return 0;
742 }
743
744 if(SubScripts[0]!=-1){
745 SetError(41,0,cp);
746 return 0;
747 }
748
749 double dbl;
750 _int64 i64data;
751 int CalcType;
752 LONG_PTR lpCalcIndex;
753 CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
754 if(IsRealNumberType(CalcType)){
755 memcpy(&dbl,&i64data,sizeof(double));
756 i64data=(_int64)dbl;
757 }
758 else dbl=(double)i64data;
759
760 //型チェック
761 CheckDifferentType(
762 type,
763 lpIndex,
764 CalcType,
765 lpCalcIndex,
766 0,0);
767
768 if(type==DEF_DOUBLE)
769 *(double *)(initGlobalBuf+offset)=(double)dbl;
770 else if(type==DEF_SINGLE)
771 *(float *)(initGlobalBuf+offset)=(float)dbl;
772 else if(type==DEF_INT64||type==DEF_QWORD)
773 *(_int64 *)(initGlobalBuf+offset)=i64data;
774 else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){
775 if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
776 //文字列定数のとき
777
778 char *temp;
779 temp=(char *)i64data;
780 i2=AddDataTable(temp,lstrlen(temp));
781 HeapDefaultFree(temp);
782
783 //mov eax,DataPos
784 OpBuffer[obp++]=(char)0xB8;
785 *((long *)(OpBuffer+obp))=(long)i2;
786 pobj_DataTableSchedule->add();
787 obp+=sizeof(long);
788
789 //mov dword ptr[offset],eax
790 OpBuffer[obp++]=(char)0xA3;
791 *((long *)(OpBuffer+obp))=offset;
792 pobj_GlobalVarSchedule->add();
793 obp+=sizeof(long);
794 }
795 else{
796 *(DWORD *)(initGlobalBuf+offset)=(DWORD)i64data;
797 }
798 }
799 else if(type==DEF_INTEGER||type==DEF_WORD)
800 *(WORD *)(initGlobalBuf+offset)=(WORD)i64data;
801 else if(type==DEF_CHAR||type==DEF_BYTE)
802 *(BYTE *)(initGlobalBuf+offset)=(BYTE)i64data;
803 //String型が未完成
804 return 1;
805}
806BOOL InitLocalVar(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){
807 int i,i2,i3,TypeSize;
808 char temporary[VN_SIZE];
809
810 if(InitBuf[0]=='['){
811 SlideString(InitBuf+1,-1);
812 InitBuf[lstrlen(InitBuf)-1]=0;
813
814 TypeSize=GetTypeSize(type,lpIndex);
815
816 if(SubScripts[0]!=-1){
817 TypeSize*=JumpSubScripts(SubScripts+1);
818 i=0;
819 i2=0;
820 while(1){
821 if(SubScripts[0]<i2){
822 SetError(41,0,cp);
823 return 0;
824 }
825 i=GetOneParameter(InitBuf,i,temporary);
826 if(!InitLocalVar(
827 offset+i2*TypeSize,
828 type,
829 lpIndex,
830 SubScripts+1,
831 temporary)) return 0;
832 i2++;
833 if(InitBuf[i]=='\0') break;
834 }
835 return -1;
836 }
837
838 if(type==DEF_OBJECT){
839 CClass *pobj_c;
840 pobj_c=(CClass *)lpIndex;
841
842 for(i=0,i2=0;i2<pobj_c->iMemberNum;i2++){
843 i=GetOneParameter(InitBuf,i,temporary);
844
845 i3=GetSizeOfClassMember(pobj_c,pobj_c->ppobj_Member[i2]->name,NULL);
846
847 if(!InitLocalVar(offset+i3,
848 pobj_c->ppobj_Member[i2]->TypeInfo.type,
849 pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex,
850 pobj_c->ppobj_Member[i2]->SubScripts,
851 temporary)) return 0;
852
853 if(InitBuf[i]=='\0') break;
854 }
855 if(i2+1!=pobj_c->iMemberNum){
856 SetError(41,0,cp);
857 return 0;
858 }
859 return 1;
860 }
861
862 SetError(41,0,cp);
863 return 0;
864 }
865
866 if(SubScripts[0]!=-1){
867 SetError(41,0,cp);
868 return 0;
869 }
870
871 double dbl;
872 _int64 i64data;
873 int CalcType;
874 LONG_PTR lpCalcIndex;
875 CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex);
876 if(!CalcType){
877 //動的データだった場合
878 return 0;
879 }
880 if(IsRealNumberType(CalcType)){
881 memcpy(&dbl,&i64data,sizeof(double));
882 i64data=(_int64)dbl;
883 }
884 else dbl=(double)i64data;
885
886 //型チェック
887 CheckDifferentType(
888 type,
889 lpIndex,
890 CalcType,
891 lpCalcIndex,
892 0,0);
893
894 if(type==DEF_DOUBLE){
895 //mov eax,HILONG(dbl)
896 OpBuffer[obp++]=(char)0xB8;
897 *((long *)(OpBuffer+obp))=(long)*(long *)(((char *)(&dbl))+4);
898 obp+=sizeof(long);
899
900 //mov dword ptr[ebp+offset+sizeof(long)],eax
901 OpBuffer[obp++]=(char)0x89;
902 OpBuffer[obp++]=(char)0x85;
903 *((long *)(OpBuffer+obp))=offset+sizeof(long);
904 AddLocalVarAddrSchedule();
905 obp+=sizeof(long);
906
907 //mov eax,LOLONG(dbl)
908 OpBuffer[obp++]=(char)0xB8;
909 *((long *)(OpBuffer+obp))=*(long *)(&dbl);
910 obp+=sizeof(long);
911
912 //mov dword ptr[ebp+offset],eax
913 OpBuffer[obp++]=(char)0x89;
914 OpBuffer[obp++]=(char)0x85;
915 *((long *)(OpBuffer+obp))=offset;
916 AddLocalVarAddrSchedule();
917 obp+=sizeof(long);
918 }
919 else if(type==DEF_SINGLE){
920 float flt;
921 flt=(float)dbl;
922 //mov eax,InitValue
923 OpBuffer[obp++]=(char)0xB8;
924 *((long *)(OpBuffer+obp))=*(long *)&flt;
925 obp+=sizeof(long);
926
927 //mov dword ptr[ebp+offset],eax
928 OpBuffer[obp++]=(char)0x89;
929 OpBuffer[obp++]=(char)0x85;
930 *((long *)(OpBuffer+obp))=offset;
931 AddLocalVarAddrSchedule();
932 obp+=sizeof(long);
933 }
934 else if(type==DEF_INT64||type==DEF_QWORD){
935 //mov eax,HILONG(i64data)
936 OpBuffer[obp++]=(char)0xB8;
937 *((long *)(OpBuffer+obp))=(long)*(long *)(((char *)(&i64data))+4);
938 obp+=sizeof(long);
939
940 //mov dword ptr[ebp+offset+sizeof(long)],eax
941 OpBuffer[obp++]=(char)0x89;
942 OpBuffer[obp++]=(char)0x85;
943 *((long *)(OpBuffer+obp))=offset+sizeof(long);
944 AddLocalVarAddrSchedule();
945 obp+=sizeof(long);
946
947 //mov eax,LOLONG(i64data)
948 OpBuffer[obp++]=(char)0xB8;
949 *((long *)(OpBuffer+obp))=*(long *)(&i64data);
950 obp+=sizeof(long);
951
952 //mov dword ptr[ebp+offset],eax
953 OpBuffer[obp++]=(char)0x89;
954 OpBuffer[obp++]=(char)0x85;
955 *((long *)(OpBuffer+obp))=offset;
956 AddLocalVarAddrSchedule();
957 obp+=sizeof(long);
958 }
959 else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){
960 if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
961 //文字列定数のとき
962
963 char *temp;
964 temp=(char *)i64data;
965 i2=AddDataTable(temp,lstrlen(temp));
966 HeapDefaultFree(temp);
967
968 //mov eax,DataPos
969 OpBuffer[obp++]=(char)0xB8;
970 *((long *)(OpBuffer+obp))=(long)i2;
971 pobj_DataTableSchedule->add();
972 obp+=sizeof(long);
973 }
974 else{
975 //mov eax,InitValue
976 OpBuffer[obp++]=(char)0xB8;
977 *((long *)(OpBuffer+obp))=(long)i64data;
978 obp+=sizeof(long);
979 }
980
981 //mov dword ptr[ebp+offset],eax
982 OpBuffer[obp++]=(char)0x89;
983 OpBuffer[obp++]=(char)0x85;
984 *((long *)(OpBuffer+obp))=offset;
985 AddLocalVarAddrSchedule();
986 obp+=sizeof(long);
987 }
988 else if(type==DEF_INTEGER||type==DEF_WORD){
989 //mov ax,InitValue
990 OpBuffer[obp++]=(char)0x66;
991 OpBuffer[obp++]=(char)0xB8;
992 *((WORD *)(OpBuffer+obp))=(WORD)i64data;
993 obp+=sizeof(WORD);
994
995 //mov word ptr[ebp+offset],ax
996 OpBuffer[obp++]=(char)0x66;
997 OpBuffer[obp++]=(char)0x89;
998 OpBuffer[obp++]=(char)0x85;
999 *((long *)(OpBuffer+obp))=offset;
1000 AddLocalVarAddrSchedule();
1001 obp+=sizeof(long);
1002 }
1003 else if(type==DEF_CHAR||type==DEF_BYTE){
1004 //mov byte ptr[ebp+offset],InitValue
1005 OpBuffer[obp++]=(char)0xC6;
1006 OpBuffer[obp++]=(char)0x85;
1007 *((long *)(OpBuffer+obp))=offset;
1008 AddLocalVarAddrSchedule();
1009 obp+=sizeof(long);
1010 *((BYTE *)(OpBuffer+obp))=(BYTE)i64data;
1011 obp+=sizeof(BYTE);
1012 }
1013 //String型が未完成
1014 return 1;
1015}
1016
1017void dim(char *Parameter,DWORD dwFlag){
1018 extern BOOL bCompilingGlobal;
1019 extern HANDLE hHeap;
1020 int i2,i3,VarSize;
1021 char VarName[VN_SIZE];
1022
1023
1024 if(dwFlag & DIMFLAG_CONST){
1025 //////////////////////////////////
1026 // 定数変数の場合を考慮
1027 //////////////////////////////////
1028 for(i2=0;;i2++){
1029 if(Parameter[i2] == '=' ||
1030 Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
1031 Parameter[i2] =='('){
1032 VarName[i2] = 0;
1033 break;
1034 }
1035 VarName[i2] = Parameter[i2];
1036 }
1037
1038 //定数と2重定義されていないる場合は抜け出す
1039 if(CDBConst::obj.GetType(VarName)){
1040 return;
1041 }
1042
1043 //定数マクロとして定義されている場合は抜け出す
1044 if(GetConstHash(VarName)){
1045 return;
1046 }
1047 }
1048
1049
1050 //構文を解析
1051 int SubScripts[MAX_ARRAYDIM];
1052 TYPEINFO TypeInfo;
1053 char InitBuf[8192];
1054 char ConstractParameter[VN_SIZE];
1055 if(!GetDimentionFormat(Parameter,VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
1056 return;
1057
1058
1059 //定数と2重定義されていないかを調べる
1060 if(CDBConst::obj.GetType(VarName)){
1061 SetError(15,VarName,cp);
1062 return;
1063 }
1064
1065 //定数マクロとして定義されている場合
1066 if(GetConstHash(VarName)){
1067 SetError(15,VarName,cp);
1068 return;
1069 }
1070
1071
1072 //タイプサイズを取得
1073 int TypeSize;
1074 TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
1075
1076 if(dwFlag&DIMFLAG_STATIC){
1077 if(bCompilingGlobal){
1078 SetError(60,NULL,cp);
1079 return;
1080 }
1081
1082 /////////////////////
1083 // Static変数
1084 // ※"Static.Object.Method.Variable"
1085 /////////////////////
1086
1087 char temporary[VN_SIZE];
1088 GetNowStaticVarFullName(VarName,temporary);
1089
1090 AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
1091
1092 /*
1093 Note: 静的変数のコンストラクタ呼び出しは
1094 _System_InitStaticLocalVariables関数内で一括して行う
1095 */
1096 }
1097 else{
1098 if(bCompilingGlobal){
1099 /////////////////////////
1100 // グローバル変数
1101 /////////////////////////
1102
1103 AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
1104 }
1105 else{
1106 /////////////////
1107 // ローカル変数
1108 /////////////////
1109
1110 for(i2=0;i2<MaxLocalVarNum;i2++){
1111 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){
1112 if(lstrcmp(LocalVar[i2].name,VarName)==0){
1113 //2重定義のエラー
1114 SetError(15,VarName,cp);
1115 return;
1116 }
1117 }
1118 }
1119
1120 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
1121
1122 for(i2=1,i3=0;i3<255;i3++){
1123 //配列要素数
1124 LocalVar[MaxLocalVarNum].SubScripts[i3]=SubScripts[i3];
1125
1126 if(SubScripts[i3]==-1) break;
1127 i2*=SubScripts[i3]+1;
1128 }
1129 VarSize=TypeSize*i2;
1130 if(VarSize%4) VarSize+=4-(VarSize%4);
1131
1132 VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
1133
1134 MaxLocalVarNum++;
1135
1136 //変数データを追加
1137 lstrcpy(pVar->name,VarName);
1138 pVar->fRef=0;
1139 if(dwFlag & DIMFLAG_CONST) pVar->bConst = true;
1140 else pVar->bConst = false;
1141 if(SubScripts[0]==-1) pVar->bArray=0;
1142 else pVar->bArray=1;
1143 pVar->type=TypeInfo.type;
1144 pVar->u.index=TypeInfo.u.lpIndex;
1145 AllLocalVarSize+=VarSize;
1146 pVar->offset=AllLocalVarSize;
1147
1148 //レキシカルスコープ
1149 pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
1150 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
1151 pVar->bLiving=TRUE;
1152
1153 if(InitBuf[0]){
1154 //初期代入時のみ、書き込みアクセスを許可する
1155 bool bConstBack = pVar->bConst;
1156 pVar->bConst = false;
1157
1158 int result = InitLocalVar(-pVar->offset,
1159 pVar->type,
1160 pVar->u.index,
1161 pVar->SubScripts,
1162 InitBuf);
1163
1164 if(!result){
1165 //動的な式だった場合は代入演算を行う
1166 char temporary[8192];
1167 sprintf(temporary,"%s=%s",VarName,InitBuf);
1168 OpcodeCalc(temporary);
1169 }
1170
1171 pVar->bConst = bConstBack;
1172 }
1173 else{
1174 //push 0
1175 op_push_value(0);
1176
1177 //push VarSize
1178 op_push_value(VarSize);
1179
1180 //mov eax,ebp
1181 OpBuffer[obp++]=(char)0x8B;
1182 OpBuffer[obp++]=(char)0xC5;
1183
1184 //add eax,offset
1185 OpBuffer[obp++]=(char)0x05;
1186 *((long *)(OpBuffer+obp))=-pVar->offset;
1187 AddLocalVarAddrSchedule();
1188 obp+=sizeof(long);
1189
1190 //push eax
1191 op_push(REG_EAX);
1192
1193 //call FillMemory
1194 OpBuffer[obp++]=(char)0xFF;
1195 OpBuffer[obp++]=(char)0x15;
1196 DECLAREINFO *pdi;
1197 pdi=GetDeclareHash("FillMemory");
1198 pdi->bUse=1;
1199 pobj_ImportAddrSchedule->add(pdi);
1200 obp+=sizeof(long);
1201 }
1202 }
1203
1204 //コンストラクタ呼び出し
1205 if(TypeInfo.type==DEF_OBJECT&&(dwFlag&DIMFLAG_NONCALL_CONSTRACTOR)==0){
1206 CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter);
1207 }
1208 }
1209
1210 if(TypeInfo.type==DEF_OBJECT){
1211 if(TypeInfo.u.pobj_Class->IsHoldAbstractFunction()){
1212 //抽象クラスだったとき
1213 SetError(125,TypeInfo.u.pobj_Class->name,cp);
1214 }
1215 }
1216}
1217void OpcodeDim(char *Parameter,DWORD dwFlag){
1218 int i,i2,i3,IsStr=0;
1219 char temporary[8192];
1220
1221 for(i=0,i2=0;;i++,i2++){
1222 if(Parameter[i]=='\"') IsStr^=1;
1223 if(Parameter[i]=='('&&IsStr==0){
1224 i3=GetStringInPare(temporary+i2,Parameter+i);
1225 i+=i3-1;
1226 i2+=i3-1;
1227 continue;
1228 }
1229 if(Parameter[i]=='['&&IsStr==0){
1230 i3=GetStringInBracket(temporary+i2,Parameter+i);
1231 i+=i3-1;
1232 i2+=i3-1;
1233 continue;
1234 }
1235 if((Parameter[i]==','&&IsStr==0)||
1236 Parameter[i]=='\0'){
1237 temporary[i2]=0;
1238
1239 dim(temporary,dwFlag);
1240
1241 if(Parameter[i]=='\0') break;
1242 i2=-1;
1243 continue;
1244 }
1245 temporary[i2]=Parameter[i];
1246 }
1247}
1248
1249void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar){
1250 if(pRelativeVar->dwKind==VAR_GLOBAL){
1251 if(pRelativeVar->bOffsetOffset){
1252 //lea eax,dword ptr[ecx+offset]
1253 OpBuffer[obp++]=(char)0x8D;
1254 OpBuffer[obp++]=(char)0x81;
1255 *((long *)(OpBuffer+obp))=pRelativeVar->offset;
1256 pobj_GlobalVarSchedule->add();
1257 obp+=sizeof(long);
1258 }
1259 else{
1260 //mov eax,offset
1261 OpBuffer[obp++]=(char)0xB8;
1262 *((long *)(OpBuffer+obp))=pRelativeVar->offset;
1263 pobj_GlobalVarSchedule->add();
1264 obp+=sizeof(long);
1265 }
1266 }
1267 else if(pRelativeVar->dwKind==VAR_LOCAL){
1268 if(pRelativeVar->bOffsetOffset){
1269 //add ecx,offset
1270 OpBuffer[obp++]=(char)0x81;
1271 OpBuffer[obp++]=(char)0xC1;
1272 *((long *)(OpBuffer+obp))=pRelativeVar->offset;
1273 AddLocalVarAddrSchedule();
1274 obp+=sizeof(long);
1275
1276 //lea eax,dword ptr[ebp+ecx]
1277 OpBuffer[obp++]=(char)0x8D;
1278 OpBuffer[obp++]=(char)0x44;
1279 OpBuffer[obp++]=(char)0x0D;
1280 OpBuffer[obp++]=(char)0x00;
1281 }
1282 else{
1283 //lea eax,dword ptr[ebp+offset]
1284 OpBuffer[obp++]=(char)0x8D;
1285 OpBuffer[obp++]=(char)0x85;
1286 *((long *)(OpBuffer+obp))=pRelativeVar->offset;
1287 AddLocalVarAddrSchedule();
1288 obp+=sizeof(long);
1289 }
1290 }
1291 else if(pRelativeVar->dwKind==VAR_REFLOCAL){
1292 if(pRelativeVar->bOffsetOffset){
1293 //mov eax,ecx
1294 OpBuffer[obp++]=(char)0x8B;
1295 OpBuffer[obp++]=(char)0xC1;
1296
1297 //add eax,dword ptr[ebp+offset]
1298 OpBuffer[obp++]=(char)0x03;
1299 OpBuffer[obp++]=(char)0x85;
1300 *((long *)(OpBuffer+obp))=pRelativeVar->offset;
1301 AddLocalVarAddrSchedule();
1302 obp+=sizeof(long);
1303 }
1304 else{
1305 //mov eax,dword ptr[ebp+offset]
1306 OpBuffer[obp++]=(char)0x8B;
1307 OpBuffer[obp++]=(char)0x85;
1308 *((long *)(OpBuffer+obp))=pRelativeVar->offset;
1309 AddLocalVarAddrSchedule();
1310 obp+=sizeof(long);
1311 }
1312 }
1313 else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
1314 //mov eax,ecx
1315 OpBuffer[obp++]=(char)0x8B;
1316 OpBuffer[obp++]=(char)0xC1;
1317 }
1318}
Note: See TracBrowser for help on using the repository browser.