source: dev/BasicCompiler64/Compile_Var.cpp@ 69

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

一時文字列をNewしたときに、bUseHeapフラグを立たせないようにした(bUseHeapが立つのは一時構造体のときのみ)。
DEF_PTR_CHARを廃止し、typeOfPtrCharを導入。

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