source: dev/BasicCompiler64/Compile_Var.cpp@ 63

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

CClass::GetSize、CClass::GetMemberOffsetを追加

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