Changeset 73 in dev for BasicCompiler32/CParameter.cpp
- Timestamp:
- Mar 16, 2007, 11:07:14 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/CParameter.cpp
r71 r73 40 40 BOOL bByVal; 41 41 if(bEllipse){ 42 DummyTypeInfo.type=NumOpe_GetType (Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);42 DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex); 43 43 bByVal=1; 44 44 } … … 96 96 return nCountOfTempObjects * PTR_SIZE; 97 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, 177 i2); 178 179 if( result ){ 180 useTempParameters[i2] = true; 181 useTempObject = true; 182 183 types[i2].type = type; 184 types[i2].u.lpIndex = lpVarIndex; 185 } 186 } 187 } 188 } 189 190 return nCountOfTempObjects * PTR_SIZE; 191 } 98 192 99 193 void ParamImpl::DeleteTempParameters(){ … … 111 205 112 206 //call free 113 extern S UBINFO*pSub_free;207 extern SubInfo *pSub_free; 114 208 op_call(pSub_free); 115 209 } … … 138 232 139 233 //call calloc 140 extern S UBINFO*pSub_calloc;234 extern SubInfo *pSub_calloc; 141 235 op_call(pSub_calloc); 142 236 … … 147 241 TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 148 242 TYPEINFO CalcType; 149 CalcType.type=NumOpe_GetType (Parameter,&BaseType,&CalcType.u.lpIndex);243 CalcType.type=NumOpe_GetType_Old(Parameter,&BaseType,&CalcType.u.lpIndex); 150 244 151 245 /* … … 267 361 BOOL bByVal; 268 362 if(bEllipse){ 269 DummyTypeInfo.type=NumOpe_GetType (Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);363 DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex); 270 364 bByVal=1; 271 365 } … … 436 530 return ParmSize; 437 531 } 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_OBJECT 620 || 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 eax 698 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 eax 737 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.