source: dev/BasicCompiler32/CParameter.cpp@ 45

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

・オーバーロードが解決できない場合のエラーが表示されないバグを修正。
・DLL関数のByRefパラメータに変数以外の数値を指定すると正常にコンパイルされないバグを修正。

File size: 16.8 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2#include "opcode.h"
3
4CParameter::CParameter(char *buffer){
5 ///////////////////////////
6 // パラメータ文字列を整理
7 ///////////////////////////
8
9 extern HANDLE hHeap;
10 int i,i2,i3;
11 char temporary[VN_SIZE];
12
13 i=0;
14 ParmsNum=0;
15 while(1){
16 if(buffer[i]=='\0') break;
17
18 for(i2=0;;i2++,i++){
19 if(buffer[i]=='\"'){
20 temporary[i2]=buffer[i];
21 for(i++,i2++;;i++,i2++){
22 temporary[i2]=buffer[i];
23 if(buffer[i]=='\"') break;
24 }
25 continue;
26 }
27
28 if(buffer[i]=='('){
29 i3=GetStringInPare(temporary+i2,buffer+i);
30 i2+=i3-1;
31 i+=i3-1;
32 continue;
33 }
34 if(buffer[i]=='['){
35 i3=GetStringInBracket(temporary+i2,buffer+i);
36 i2+=i3-1;
37 i+=i3-1;
38 continue;
39 }
40
41 if(buffer[i]==','||buffer[i]=='\0'){
42 temporary[i2]=0;
43 break;
44 }
45 temporary[i2]=buffer[i];
46 }
47
48 Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
49 lstrcpy(Parms[ParmsNum],temporary);
50 ParmsNum++;
51
52 if(buffer[i]==',') i++;
53 }
54
55 ReturnTypeInfo.type=0;
56 ReturnTypeInfo.u.lpIndex=0;
57}
58CParameter::CParameter(PARAMETER_INFO *pParamInfo,int ParmNum){
59 int i;
60 for(i=0;i<ParmNum;i++){
61 Parms[i]=0;
62 types[i].type=pParamInfo[i].type;
63 types[i].u.lpIndex=pParamInfo[i].u.index;
64 }
65 this->ParmsNum=ParmNum;
66
67 ReturnTypeInfo.type=0;
68 ReturnTypeInfo.u.lpIndex=0;
69}
70CParameter::~CParameter(){
71 int i2;
72
73 //パラメータ文字列を解放
74 for(i2=0;i2<ParmsNum;i2++){
75 if(Parms[i2]==(char *)-1) continue;
76
77 if(Parms[i2]) HeapDefaultFree(Parms[i2]);
78 }
79}
80
81
82void CParameter::SetReturnType(TYPEINFO *pTypeInfo){
83 ReturnTypeInfo=*pTypeInfo;
84}
85
86BOOL CParameter::_overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level){
87 //パラメータを識別してオーバーロードを解決
88
89 //パラメータの個数が不一致の場合
90 if(pi_num!=ParmsNum) return 0;
91
92 int i,type;
93 LONG_PTR lpIndex;
94 for(i=0;i<pi_num;i++){
95 if(Parms[i]){
96 TYPEINFO BaseType={ppi[i].type,ppi[i].u.index};
97 if(Parms[i][0]==1&&Parms[i][1]==ESC_BYVAL){
98 type=NumOpe_GetType(Parms[i]+2,&BaseType,&lpIndex);
99 type=MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)-1);
100 }
101 else{
102 type=NumOpe_GetType(Parms[i],&BaseType,&lpIndex);
103 }
104 }
105 else{
106 type=types[i].type;
107 lpIndex=types[i].u.lpIndex;
108 }
109
110 if(type!=ppi[i].type){
111 if(overload_level==OVERLOAD_LEVEL1){
112 return 0;
113 }
114 else if(overload_level==OVERLOAD_LEVEL2){
115 if(!(
116 IsWholeNumberType(type)&&IsWholeNumberType(ppi[i].type)||
117 IsRealNumberType(type)&&IsRealNumberType(ppi[i].type)
118 )) return 0;
119 }
120 else if(overload_level==OVERLOAD_LEVEL3){
121 if(type==DEF_OBJECT||ppi[i].type==DEF_OBJECT) return 0;
122 }
123 }
124 else{
125 if(NATURAL_TYPE(type)==DEF_OBJECT){
126 if(lpIndex!=ppi[i].u.index) return 0;
127 }
128 }
129 }
130
131 if(pReturnTypeInfo){
132 //戻り値も比較対象にする
133 if(ReturnTypeInfo.type==pReturnTypeInfo->type){
134 if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT){
135 if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0;
136 }
137 }
138 else return 0;
139 }
140
141 return 1;
142}
143SUBINFO *CParameter::OverloadSolutionWithReturnType(char *name,SUBINFO **ppsi,int num){
144 int i,sw=0;
145 SUBINFO *psi;
146 psi=0;
147 for(i=0;i<num;i++){
148 psi=ppsi[i];
149
150 TYPEINFO ReturnTypeInfo;
151 ReturnTypeInfo.type=psi->ReturnType;
152 ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
153
154 //エラーチェック
155 if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL1)){
156 if(sw){
157 SetError(52,name,cp);
158 return 0;
159 }
160 sw=1;
161 break;
162 }
163 }
164
165 if(!sw){
166 for(i=0;i<num;i++){
167 psi=ppsi[i];
168
169 TYPEINFO ReturnTypeInfo;
170 ReturnTypeInfo.type=psi->ReturnType;
171 ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
172
173 //エラーチェック
174 if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL2)){
175 if(sw){
176 SetError(52,name,cp);
177 return 0;
178 }
179 sw=1;
180 break;
181 }
182 }
183 }
184
185 if(!sw){
186 for(i=0;i<num;i++){
187 psi=ppsi[i];
188
189 TYPEINFO ReturnTypeInfo;
190 ReturnTypeInfo.type=psi->ReturnType;
191 ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
192
193 //エラーチェック
194 if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL3)){
195 if(sw){
196 SetError(52,name,cp);
197 return 0;
198 }
199 sw=1;
200 break;
201 }
202 }
203 }
204
205 if(!sw){
206 SetError(52,name,cp);
207 return 0;
208 }
209
210 return psi;
211}
212
213SUBINFO *CParameter::OverloadSolution(char *name,SUBINFO **ppsi,int num){
214 int i,sw=0;
215 SUBINFO *psi;
216 psi=0;
217
218 for(i=0;i<num;i++){
219 psi=ppsi[i];
220
221 //エラーチェック
222 if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL1)){
223 if(sw){
224 return OverloadSolutionWithReturnType(name,ppsi,num);
225 }
226 sw=1;
227 break;
228 }
229 }
230
231 if(!sw){
232 for(i=0;i<num;i++){
233 psi=ppsi[i];
234
235 //エラーチェック
236 if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL2)){
237 if(sw){
238 return OverloadSolutionWithReturnType(name,ppsi,num);
239 }
240 sw=1;
241 break;
242 }
243 }
244 }
245
246 if(!sw){
247 for(i=0;i<num;i++){
248 psi=ppsi[i];
249
250 //エラーチェック
251 if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL3)){
252 if(sw){
253 return OverloadSolutionWithReturnType(name,ppsi,num);
254 }
255 sw=1;
256 break;
257 }
258 }
259 }
260
261 if(!sw){
262 SUBINFO *temp_psi;
263 for(i=0;i<num;i++){
264 temp_psi=ppsi[i];
265
266 //エラーチェック
267 if(temp_psi->ParmNum==this->ParmsNum){
268 if(sw){
269 sw=0;
270 break;
271 }
272 sw=1;
273
274 psi=temp_psi;
275 }
276 }
277 }
278
279 if(!sw){
280 SetError(52,name,cp);
281 return 0;
282 }
283
284 return psi;
285}
286
287BOOL CParameter::ErrorCheck(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
288 if(ParmsNum>pi_num){
289 if(ppi[pi_num-1].type!=DEF_ELLIPSE){
290 //パラメータが多すぎるとき
291 SetError(10,FuncName,cp);
292 return 0;
293 }
294 }
295 else if(ParmsNum<pi_num){
296 if(ParmsNum<SecondParmNum){
297 if(ppi[ParmsNum].type==DEF_ELLIPSE){
298 return 1;
299 }
300
301 //パラメータが少なすぎるとき
302 SetError(10,FuncName,cp);
303 return 0;
304 }
305
306 //省略パラメータに "0" を指定する
307 for(;ParmsNum < pi_num;ParmsNum++){
308 extern HANDLE hHeap;
309 char temporary[64];
310 if(ppi[ParmsNum].bByVal) lstrcpy(temporary,"0");
311 else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
312 Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
313 lstrcpy(Parms[ParmsNum],temporary);
314 }
315 }
316
317 return 1;
318}
319void CParameter::MacroParameterSupport(PARAMETER_INFO *ppi){
320 int i;
321 for(i=0;i<ParmsNum;i++){
322 if(Parms[i][0]=='\0'){
323 extern HANDLE hHeap;
324 char temporary[64];
325 if(ppi[i].bByVal) lstrcpy(temporary,"0");
326 else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
327 HeapDefaultFree(Parms[i]);
328 Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
329 lstrcpy(Parms[i],temporary);
330 }
331 }
332}
333
334void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
335 ///////////////////////////////////////////////////////
336 // 一時オブジェクトをあらかじめスタックに積んでおく
337 ///////////////////////////////////////////////////////
338 //TODO: 64ビットコードのままなので、32ビット用に書き換える
339
340 useTempObject = false;
341
342 //一時オブジェクトの数
343 nCountOfTempObjects = 0;
344
345 BOOL bEllipse;
346 if(pi_num){
347 if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
348 else bEllipse=0;
349 }
350 else bEllipse=0;
351
352 for(int i2=ParmsNum-1;i2>=0;i2--){
353 useTempParameters[i2] = false;
354
355 if(bEllipse&&i2<=pi_num-2) bEllipse=0;
356
357 if(i2==0&&ppi[i2].name){
358 if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
359 //オブジェクトメンバの第一パラメータのThisポインタ
360 continue;
361 }
362 }
363 if((i2==0||i2==1)&&ppi[i2].name){
364 if(lstrcmp(ppi[i2].name,FuncName)==0){
365 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
366 continue;
367 }
368 }
369
370 TYPEINFO DummyTypeInfo;
371 BOOL bByVal;
372 if(bEllipse){
373 DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
374 bByVal=1;
375 }
376 else{
377 DummyTypeInfo.type=ppi[i2].type;
378 DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
379 bByVal=ppi[i2].bByVal;
380 }
381
382
383 if( !bByVal ){
384 //ポインタ参照
385 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
386 //ポインタ指定
387 continue;
388 }
389
390 LONG_PTR lpVarIndex;
391 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){
392 //変数ではないとき
393 int reg = REG_RAX;
394 int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
395 //↑ここでスタックに積む
396
397 bool result = CheckDifferentType(
398 DummyTypeInfo.type,
399 DummyTypeInfo.u.lpIndex,
400 type,
401 lpVarIndex,
402 FuncName,
403 i2);
404
405 if( result ){
406 useTempParameters[i2] = true;
407 useTempObject = true;
408
409 types[i2].type = type;
410 types[i2].u.lpIndex = lpVarIndex;
411 }
412
413 nCountOfTempObjects++;
414 }
415 }
416 }
417}
418void CParameter::DeleteTempParameters(){
419 ///////////////////////////////////////////////////////
420 // 一時オブジェクトを破棄
421 ///////////////////////////////////////////////////////
422 //TODO: 64ビットコードのままなので、32ビット用に書き換える
423
424 if( !useTempObject ) return;
425
426 for(int i2=ParmsNum-1;i2>=0;i2--){
427 if( useTempParameters[i2] ){
428 //スタックフレームから取得
429 // ※関数呼び出し時も値が普遍のebxを利用する
430 op_pop(REG_EBX);
431
432
433 ///////////////////////////
434 // デストラクタを呼び出す
435 ///////////////////////////
436
437 //push ebx
438 op_push(REG_EBX);
439
440 //call destructor
441 int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex;
442 if( i5 != -1 ){
443 op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi );
444 }
445
446
447 /////////////////////////
448 // メモリを解放する
449 /////////////////////////
450
451 //push ebx
452 op_push(REG_EBX);
453
454 //call free
455 extern SUBINFO *pSub_free;
456 op_call(pSub_free);
457 }
458 }
459}
460
461void CParameter::SetObjectParameter(CClass *pobj_Class,LPSTR Parameter){
462 int object_size;
463 object_size=GetSizeOfClass(pobj_Class);
464
465 //push object_size
466 op_push_value(object_size);
467
468 //call calloc
469 extern SUBINFO *pSub_calloc;
470 op_call(pSub_calloc);
471
472 //push eax
473 op_push(REG_EAX);
474
475
476 TYPEINFO BaseType={DEF_OBJECT,(LONG_PTR)pobj_Class};
477 TYPEINFO CalcType;
478 CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
479
480 if(pobj_Class->CopyConstructorMemberSubIndex!=-1&&
481 CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
482 ////////////////////////////////////
483 // コピーコンストラクタを呼び出す
484 ////////////////////////////////////
485
486 //push eax
487 op_push(REG_EAX);
488
489 BOOL bUseHeap;
490 CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
491
492 //pop ecx
493 op_pop(REG_ECX);
494
495 //pop eax
496 op_pop(REG_EAX);
497
498 if(bUseHeap){
499 //※解放用に退避
500 //mov esi,ecx
501 op_mov_RR(REG_ESI,REG_ECX);
502 }
503
504 //push ecx
505 op_push(REG_ECX);
506
507 //push eax
508 op_push(REG_EAX);
509
510 //call constructor
511 op_call(pobj_Class->ppobj_Method[pobj_Class->CopyConstructorMemberSubIndex]->psi);
512
513
514 if(bUseHeap){
515 FreeTempObject(REG_ESI,pobj_Class);
516 }
517 }
518 else{
519 //push eax
520 op_push(REG_EAX);
521
522
523 if(pobj_Class->ConstructorMemberSubIndex!=-1){
524 ////////////////////////////////
525 // コンストラクタを呼び出す
526 ////////////////////////////////
527
528 //push this
529 op_push(REG_EAX);
530
531 //call constructor
532 op_call(pobj_Class->ppobj_Method[pobj_Class->ConstructorMemberSubIndex]->psi);
533 }
534
535
536 TYPEINFO CalcType;
537 BOOL bUseHeap;
538 CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
539
540
541
542 SetObjectVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
543 }
544}
545
546int CParameter::SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
547 ///////////////////////////////////////////////////////////
548 // パラメータをレジスタ及びスタックフレームにセット
549 ///////////////////////////////////////////////////////////
550 int i2,i3;
551
552 BOOL bEllipse;
553 if(pi_num){
554 if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
555 else bEllipse=0;
556 }
557 else bEllipse=0;
558
559 BOOL bHas_System_LocalThis=0;
560 if(ParmsNum>=1){
561 if(lstrcmp(ppi[0].name,"_System_LocalThis")==0)
562 bHas_System_LocalThis=1;
563 }
564
565 //戻り値用の変数名を取得
566 char *lpszVarNameToReturn;
567 if(FuncName[0]==1&&FuncName[1]==ESC_OPERATOR) lpszVarNameToReturn="_System_ReturnValue";
568 else lpszVarNameToReturn=FuncName;
569
570 //パラメータをレジスタとスタックに格納
571 int CalcType;
572 LONG_PTR lpCalcIndex;
573 BOOL bCalcUseHeap;
574 int ParmSize=0;
575 RELATIVE_VAR RelativeVar;
576 int nCountOfNowTempObjects = 0;
577 for(i2=ParmsNum-1;i2>=0;i2--){
578 if(bEllipse&&i2<=pi_num-2) bEllipse=0;
579
580 if(i2==0&&ppi[i2].name){
581 if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
582 //オブジェクトメンバの第一パラメータのThisポインタ
583 continue;
584 }
585 }
586 if((i2==0||i2==1)&&ppi[i2].name){
587 if(lstrcmp(ppi[i2].name,lpszVarNameToReturn)==0){
588 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
589 continue;
590 }
591 }
592
593 TYPEINFO DummyTypeInfo;
594 BOOL bByVal;
595 if(bEllipse){
596 DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
597 bByVal=1;
598 }
599 else{
600 DummyTypeInfo.type=ppi[i2].type;
601 DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
602 bByVal=ppi[i2].bByVal;
603 }
604
605 if(bByVal==1){
606 //値参照
607
608 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
609 char temp2[255];
610 sprintf(temp2,"%s関数の第%dパラメータ",FuncName,i2+1);
611 SetError(19,temp2,cp);
612 continue;
613 }
614
615 if(DummyTypeInfo.type==DEF_OBJECT){
616 SetObjectParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
617 goto next;
618 }
619
620
621 extern LONG_PTR ProcPtr_BaseIndex;
622 LONG_PTR back_ProcPtr_BaseIndex;
623 back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;
624 if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;
625 else ProcPtr_BaseIndex=-1;
626
627 CalcType=NumOpe(Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);
628
629 ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;
630
631 if(CalcType==-1) break;
632
633 if(CalcType==DEF_OBJECT){
634 //キャスト演算子のオーバーロードに対応する
635 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
636 }
637
638 if(!bEllipse){
639 //型チェック
640 if(bHas_System_LocalThis) i3=i2-1;
641 else i3=i2;
642 CheckDifferentType(
643 DummyTypeInfo.type,
644 DummyTypeInfo.u.lpIndex,
645 CalcType,
646 lpCalcIndex,
647 FuncName,
648 i3);
649 }
650
651 if(DummyTypeInfo.type==DEF_DOUBLE){
652 ChangeTypeToDouble(CalcType);
653 ParmSize+=sizeof(long)*2;
654 }
655 else if(DummyTypeInfo.type==DEF_SINGLE){
656 ChangeTypeToSingle(CalcType);
657 ParmSize+=sizeof(long);
658 }
659 else if(DummyTypeInfo.type==DEF_INT64||DummyTypeInfo.type==DEF_QWORD){
660 ChangeTypeToInt64(CalcType);
661 ParmSize+=sizeof(long)*2;
662 }
663 else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||
664 (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){
665 ChangeTypeToLong(CalcType);
666 ParmSize+=sizeof(long);
667 }
668 else if(DummyTypeInfo.type==DEF_INTEGER||DummyTypeInfo.type==DEF_WORD){
669 ChangeTypeToInteger(CalcType);
670 ParmSize+=sizeof(long);
671 }
672 else if(DummyTypeInfo.type==DEF_CHAR||DummyTypeInfo.type==DEF_BYTE||DummyTypeInfo.type==DEF_BOOLEAN){
673 ChangeTypeToByte(CalcType);
674 ParmSize+=sizeof(long);
675 }
676 else{
677 SetError(300,NULL,cp);
678 }
679 }
680 else{
681 //ポインタ参照
682 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
683 //ポインタ指定
684 i3=NumOpe(Parms[i2]+2,0,0,0);
685
686 ChangeTypeToLong(i3);
687 }
688 else{
689 //変数のアドレスを取得
690 int VarType;
691 LONG_PTR lpVarIndex;
692 if(GetVarOffset(
693 false,
694 false,
695 Parms[i2],
696 &VarType,
697 &RelativeVar,
698 &lpVarIndex)){
699 if(DummyTypeInfo.type!=DEF_ANY){
700 //型チェックを行う
701 if(DummyTypeInfo.type==VarType){
702 if(DummyTypeInfo.type==DEF_OBJECT){
703 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){
704 SetError(11,Parms[i2],cp);
705 }
706 }
707 }
708 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
709 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
710 }
711 else{
712 SetError(11,Parms[i2],cp);
713 }
714 }
715
716 //変数アドレスをレジスタにセット
717 SetVarPtrToEax(&RelativeVar);
718
719 //push eax
720 op_push(REG_EAX);
721 }
722 else{
723 //一時オブジェクトをコピー
724
725 //mov eax, dword ptr[esp+offset]
726 op_mov_RM(
727 sizeof(long),
728 REG_EAX,
729 REG_ESP,
730 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1 ) ) * PTR_SIZE,
731 MOD_BASE_DISP32 );
732
733 nCountOfNowTempObjects++;
734
735 //push eax
736 op_push(REG_EAX);
737
738 //VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
739 }
740 }
741
742 ParmSize+=PTR_SIZE;
743 }
744
745next:;
746 }
747
748 return ParmSize;
749}
Note: See TracBrowser for help on using the repository browser.