Changeset 75 in dev for BasicCompiler32/CParameter.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/CParameter.cpp
r73 r75 2 2 #include "opcode.h" 3 3 4 int ParamImpl::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 4 int ParamImpl::NewTempParameters( const string &procName, const Parameters ¶ms, int SecondParmNum ){ 5 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size(); 6 5 7 /////////////////////////////////////////////////////// 6 8 // 一時オブジェクトをあらかじめスタックに積んでおく … … 13 15 14 16 BOOL bEllipse; 15 if(p i_num){16 if(p pi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;17 if(params.size()){ 18 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1; 17 19 else bEllipse=0; 18 20 } … … 22 24 useTempParameters[i2] = false; 23 25 24 if(bEllipse&&i2<= pi_num-2) bEllipse=0;25 26 if(i2==0 &&ppi[i2].name){27 if( lstrcmp(ppi[i2].name,"_System_LocalThis")==0){26 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0; 27 28 if(i2==0){ 29 if( params[i2]->GetVarName() == "_System_LocalThis" ){ 28 30 //オブジェクトメンバの第一パラメータのThisポインタ 29 31 continue; 30 32 } 31 33 } 32 if( (i2==0||i2==1)&&ppi[i2].name){33 if( lstrcmp(ppi[i2].name,FuncName)==0){34 if( i2==0||i2==1 ){ 35 if( params[i2]->GetVarName() == procName ){ 34 36 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 35 37 continue; … … 37 39 } 38 40 39 T YPEINFODummyTypeInfo;41 Type DummyTypeInfo; 40 42 BOOL bByVal; 41 43 if(bEllipse){ … … 44 46 } 45 47 else{ 46 DummyTypeInfo.type=p pi[i2].type;47 DummyTypeInfo.u.lpIndex=p pi[i2].u.index;48 bByVal =ppi[i2].bByVal;48 DummyTypeInfo.type=params[i2]->GetBasicType(); 49 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex(); 50 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 49 51 } 50 52 … … 80 82 type, 81 83 lpVarIndex, 82 FuncName, 83 i2); 84 85 if( result ){ 86 useTempParameters[i2] = true; 87 useTempObject = true; 88 89 types[i2].type = type; 90 types[i2].u.lpIndex = lpVarIndex; 91 } 92 } 93 } 94 } 95 96 return nCountOfTempObjects * PTR_SIZE; 97 } 98 int ParamImpl::NewTempParameters( const char *procName, const Parameters ¶ms, int SecondParmNum ){ 99 /////////////////////////////////////////////////////// 100 // 一時オブジェクトをあらかじめスタックに積んでおく 101 /////////////////////////////////////////////////////// 102 103 useTempObject = false; 104 105 //一時参照の数 106 nCountOfTempObjects = 0; 107 108 BOOL bEllipse; 109 if(params.size()){ 110 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1; 111 else bEllipse=0; 112 } 113 else bEllipse=0; 114 115 for(int i2=ParmsNum-1;i2>=0;i2--){ 116 useTempParameters[i2] = false; 117 118 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0; 119 120 if(i2==0){ 121 if( params[i2]->GetVarName() == "_System_LocalThis" ){ 122 //オブジェクトメンバの第一パラメータのThisポインタ 123 continue; 124 } 125 } 126 if( i2==0||i2==1 ){ 127 if( params[i2]->GetVarName() == procName ){ 128 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 129 continue; 130 } 131 } 132 133 TYPEINFO DummyTypeInfo; 134 BOOL bByVal; 135 if(bEllipse){ 136 DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex); 137 bByVal=1; 138 } 139 else{ 140 DummyTypeInfo.type=params[i2]->GetBasicType(); 141 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex(); 142 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 143 } 144 145 146 if( !bByVal ){ 147 //ポインタ参照 148 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 149 //ポインタ指定 150 continue; 151 } 152 153 LONG_PTR lpVarIndex; 154 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){ 155 //変数ではないとき 156 int reg = REG_RAX; 157 int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 158 //↑ここでスタックに積む 159 160 nCountOfTempObjects++; 161 162 if( type != DEF_STRUCT ){ 163 //一時参照を作成 164 165 //push esp 166 op_push( REG_ESP ); 167 168 nCountOfTempObjects++; 169 } 170 171 bool result = CheckDifferentType( 172 DummyTypeInfo.type, 173 DummyTypeInfo.u.lpIndex, 174 type, 175 lpVarIndex, 176 procName, 84 procName.c_str(), 177 85 i2); 178 86 … … 205 113 206 114 //call free 207 extern SubInfo*pSub_free;115 extern UserProc *pSub_free; 208 116 op_call(pSub_free); 209 117 } … … 232 140 233 141 //call calloc 234 extern SubInfo*pSub_calloc;142 extern UserProc *pSub_calloc; 235 143 op_call(pSub_calloc); 236 144 … … 239 147 240 148 241 T YPEINFOBaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};242 T YPEINFOCalcType;149 Type BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 150 Type CalcType; 243 151 CalcType.type=NumOpe_GetType_Old(Parameter,&BaseType,&CalcType.u.lpIndex); 244 152 … … 276 184 277 185 //call constructor 278 op_call(pobj_Class->GetCopyConstructorMethod()->p si);186 op_call(pobj_Class->GetCopyConstructorMethod()->pUserProc); 279 187 280 188 … … 300 208 301 209 //call constructor 302 op_call(pobj_Class->GetConstructorMethod()->p si);210 op_call(pobj_Class->GetConstructorMethod()->pUserProc); 303 211 } 304 212 */ … … 313 221 } 314 222 315 int ParamImpl::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ 223 int ParamImpl::SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum ){ 224 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size(); 225 316 226 /////////////////////////////////////////////////////////// 317 227 // パラメータをレジスタ及びスタックフレームにセット … … 320 230 321 231 BOOL bEllipse; 322 if( pi_num){323 if(p pi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;232 if( params.size() ){ 233 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1; 324 234 else bEllipse=0; 325 235 } … … 328 238 BOOL bHas_System_LocalThis=0; 329 239 if(ParmsNum>=1){ 330 if( lstrcmp(ppi[0].name,"_System_LocalThis")==0)240 if( params[0]->GetVarName() == "_System_LocalThis" ){ 331 241 bHas_System_LocalThis=1; 242 } 332 243 } 333 244 334 245 //戻り値用の変数名を取得 335 const char *lpszVarNameToReturn = ( FuncName[0]==1&&FuncName[1]==ESC_OPERATOR)?"_System_ReturnValue":FuncName;246 const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName.c_str(); 336 247 337 248 //パラメータをレジスタとスタックに格納 … … 343 254 int nCountOfNowTempObjects = 0; 344 255 for(i2=ParmsNum-1;i2>=0;i2--){ 345 if(bEllipse&&i2<= pi_num-2) bEllipse=0;346 347 if(i2==0 &&ppi[i2].name){348 if( lstrcmp(ppi[i2].name,"_System_LocalThis")==0){256 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0; 257 258 if(i2==0){ 259 if( params[i2]->GetVarName() == "_System_LocalThis" ){ 349 260 //オブジェクトメンバの第一パラメータのThisポインタ 350 261 continue; 351 262 } 352 263 } 353 if( (i2==0||i2==1)&&ppi[i2].name){354 if( lstrcmp(ppi[i2].name,lpszVarNameToReturn)==0){264 if(i2==0||i2==1){ 265 if( params[i2]->GetVarName() == lpszVarNameToReturn ){ 355 266 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 356 267 continue; … … 358 269 } 359 270 360 T YPEINFODummyTypeInfo;271 Type DummyTypeInfo; 361 272 BOOL bByVal; 362 273 if(bEllipse){ … … 365 276 } 366 277 else{ 367 DummyTypeInfo.type=p pi[i2].type;368 DummyTypeInfo.u.lpIndex=p pi[i2].u.index;369 bByVal =ppi[i2].bByVal;278 DummyTypeInfo.type=params[i2]->GetBasicType(); 279 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex(); 280 bByVal = (params[i2]->IsRef() == false ) ? TRUE:FALSE; 370 281 } 371 282 … … 375 286 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 376 287 char temp2[255]; 377 sprintf(temp2,"%s関数の第%dパラメータ", FuncName,i2+1);288 sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1); 378 289 SetError(19,temp2,cp); 379 290 continue; … … 417 328 CalcType, 418 329 lpCalcIndex, 419 FuncName,330 procName.c_str(), 420 331 i3); 421 332 } … … 530 441 return ParmSize; 531 442 } 532 int ParamImpl::SetParameter( const char *procName, const Parameters ¶ms, int SecondParmNum ){533 ///////////////////////////////////////////////////////////534 // パラメータをレジスタ及びスタックフレームにセット535 ///////////////////////////////////////////////////////////536 int i2,i3;537 538 BOOL bEllipse;539 if( params.size() ){540 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;541 else bEllipse=0;542 }543 else bEllipse=0;544 545 BOOL bHas_System_LocalThis=0;546 if(ParmsNum>=1){547 if( params[0]->GetVarName() == "_System_LocalThis" ){548 bHas_System_LocalThis=1;549 }550 }551 552 //戻り値用の変数名を取得553 const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName;554 555 //パラメータをレジスタとスタックに格納556 int CalcType;557 LONG_PTR lpCalcIndex;558 BOOL bCalcUseHeap;559 int ParmSize=0;560 RELATIVE_VAR RelativeVar;561 int nCountOfNowTempObjects = 0;562 for(i2=ParmsNum-1;i2>=0;i2--){563 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;564 565 if(i2==0){566 if( params[i2]->GetVarName() == "_System_LocalThis" ){567 //オブジェクトメンバの第一パラメータのThisポインタ568 continue;569 }570 }571 if(i2==0||i2==1){572 if( params[i2]->GetVarName() == lpszVarNameToReturn ){573 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト574 continue;575 }576 }577 578 TYPEINFO DummyTypeInfo;579 BOOL bByVal;580 if(bEllipse){581 DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);582 bByVal=1;583 }584 else{585 DummyTypeInfo.type=params[i2]->GetBasicType();586 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex();587 bByVal = (params[i2]->IsRef() == false ) ? TRUE:FALSE;588 }589 590 if(bByVal==1){591 //値参照592 593 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){594 char temp2[255];595 sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1);596 SetError(19,temp2,cp);597 continue;598 }599 600 if(DummyTypeInfo.type==DEF_STRUCT){601 SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);602 goto next;603 }604 605 606 extern LONG_PTR ProcPtr_BaseIndex;607 LONG_PTR back_ProcPtr_BaseIndex;608 back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;609 if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;610 else ProcPtr_BaseIndex=-1;611 612 CalcType=NumOpe(Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);613 614 ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;615 616 if(CalcType==-1) break;617 618 if(CalcType==DEF_OBJECT){619 if( DummyTypeInfo.type != DEF_OBJECT620 ||621 DummyTypeInfo.type == DEF_OBJECT &&622 !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){623 //キャスト演算子のオーバーロードに対応する624 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);625 }626 }627 628 if(!bEllipse){629 //型チェック630 if(bHas_System_LocalThis) i3=i2-1;631 else i3=i2;632 CheckDifferentType(633 DummyTypeInfo.type,634 DummyTypeInfo.u.lpIndex,635 CalcType,636 lpCalcIndex,637 procName,638 i3);639 }640 641 if(DummyTypeInfo.type==DEF_DOUBLE){642 ChangeTypeToDouble(CalcType);643 ParmSize+=sizeof(long)*2;644 }645 else if(DummyTypeInfo.type==DEF_SINGLE){646 ChangeTypeToSingle(CalcType);647 ParmSize+=sizeof(long);648 }649 else if(DummyTypeInfo.type==DEF_INT64||DummyTypeInfo.type==DEF_QWORD){650 ChangeTypeToInt64(CalcType);651 ParmSize+=sizeof(long)*2;652 }653 else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT||654 (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){655 ChangeTypeToLong(CalcType);656 ParmSize+=sizeof(long);657 }658 else if(DummyTypeInfo.type==DEF_INTEGER||DummyTypeInfo.type==DEF_WORD || (isUnicode&&DummyTypeInfo.type==DEF_CHAR)){659 ChangeTypeToInteger(CalcType);660 ParmSize+=sizeof(long);661 }662 else if(DummyTypeInfo.type==DEF_SBYTE||DummyTypeInfo.type==DEF_BYTE||DummyTypeInfo.type==DEF_BOOLEAN || (isUnicode==false&&DummyTypeInfo.type==DEF_CHAR)){663 ChangeTypeToByte(CalcType);664 ParmSize+=sizeof(long);665 }666 else{667 SetError(300,NULL,cp);668 }669 }670 else{671 //ポインタ参照672 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){673 //ポインタ指定674 i3=NumOpe(Parms[i2]+2,0,0,0);675 676 ChangeTypeToLong(i3);677 }678 else{679 if( useTempParameters[i2] ){680 //一時オブジェクトをコピー681 682 if( types[i2].type != DEF_STRUCT ){683 // 一時参照のための領域を考慮する684 nCountOfNowTempObjects++;685 }686 687 nCountOfNowTempObjects++;688 689 //mov eax, dword ptr[esp+offset]690 op_mov_RM(691 sizeof(long),692 REG_EAX,693 REG_ESP,694 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE,695 MOD_BASE_DISP32 );696 697 //push eax698 op_push(REG_EAX);699 }700 else{701 //変数のアドレスを取得702 int VarType;703 LONG_PTR lpVarIndex;704 if(GetVarOffset(705 false,706 false,707 Parms[i2],708 &VarType,709 &RelativeVar,710 &lpVarIndex)){711 if(DummyTypeInfo.type!=DEF_ANY){712 //型チェックを行う713 if(DummyTypeInfo.type==VarType){714 if(DummyTypeInfo.type==DEF_OBJECT){715 if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){716 SetError(11,Parms[i2],cp);717 }718 }719 else if(DummyTypeInfo.type==DEF_STRUCT){720 if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){721 SetError(11,Parms[i2],cp);722 }723 }724 }725 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){726 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき727 }728 else{729 SetError(11,Parms[i2],cp);730 }731 }732 733 //変数アドレスをレジスタにセット734 SetVarPtrToEax(&RelativeVar);735 736 //push eax737 op_push(REG_EAX);738 }739 }740 }741 742 ParmSize+=PTR_SIZE;743 }744 745 next:;746 }747 748 return ParmSize;749 }
Note:
See TracChangeset
for help on using the changeset viewer.