Changeset 75 in dev for BasicCompiler32/CParameter.cpp


Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/CParameter.cpp

    r73 r75  
    22#include "opcode.h"
    33
    4 int ParamImpl::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
     4int ParamImpl::NewTempParameters( const string &procName, const Parameters &params, int SecondParmNum ){
     5    if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
     6
    57    ///////////////////////////////////////////////////////
    68    // 一時オブジェクトをあらかじめスタックに積んでおく
     
    1315
    1416    BOOL bEllipse;
    15     if(pi_num){
    16         if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
     17    if(params.size()){
     18        if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
    1719        else bEllipse=0;
    1820    }
     
    2224        useTempParameters[i2] = false;
    2325
    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" ){
    2830                //オブジェクトメンバの第一パラメータのThisポインタ
    2931                continue;
    3032            }
    3133        }
    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 ){
    3436                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
    3537                continue;
     
    3739        }
    3840
    39         TYPEINFO DummyTypeInfo;
     41        Type DummyTypeInfo;
    4042        BOOL bByVal;
    4143        if(bEllipse){
     
    4446        }
    4547        else{
    46             DummyTypeInfo.type=ppi[i2].type;
    47             DummyTypeInfo.u.lpIndex=ppi[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;
    4951        }
    5052
     
    8082                    type,
    8183                    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 &params, 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(),
    17785                    i2);
    17886
     
    205113
    206114                //call free
    207                 extern SubInfo *pSub_free;
     115                extern UserProc *pSub_free;
    208116                op_call(pSub_free);
    209117            }
     
    232140
    233141    //call calloc
    234     extern SubInfo *pSub_calloc;
     142    extern UserProc *pSub_calloc;
    235143    op_call(pSub_calloc);
    236144
     
    239147
    240148
    241     TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
    242     TYPEINFO CalcType;
     149    Type BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
     150    Type CalcType;
    243151    CalcType.type=NumOpe_GetType_Old(Parameter,&BaseType,&CalcType.u.lpIndex);
    244152
     
    276184
    277185        //call constructor
    278         op_call(pobj_Class->GetCopyConstructorMethod()->psi);
     186        op_call(pobj_Class->GetCopyConstructorMethod()->pUserProc);
    279187
    280188
     
    300208
    301209                //call constructor
    302                 op_call(pobj_Class->GetConstructorMethod()->psi);
     210                op_call(pobj_Class->GetConstructorMethod()->pUserProc);
    303211            }
    304212*/
     
    313221}
    314222
    315 int ParamImpl::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
     223int ParamImpl::SetParameter( const string &procName, const Parameters &params, int SecondParmNum ){
     224    if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
     225
    316226    ///////////////////////////////////////////////////////////
    317227    // パラメータをレジスタ及びスタックフレームにセット
     
    320230
    321231    BOOL bEllipse;
    322     if(pi_num){
    323         if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
     232    if( params.size() ){
     233        if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
    324234        else bEllipse=0;
    325235    }
     
    328238    BOOL bHas_System_LocalThis=0;
    329239    if(ParmsNum>=1){
    330         if(lstrcmp(ppi[0].name,"_System_LocalThis")==0)
     240        if( params[0]->GetVarName() == "_System_LocalThis" ){
    331241            bHas_System_LocalThis=1;
     242        }
    332243    }
    333244
    334245    //戻り値用の変数名を取得
    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();
    336247
    337248    //パラメータをレジスタとスタックに格納
     
    343254    int nCountOfNowTempObjects = 0;
    344255    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" ){
    349260                //オブジェクトメンバの第一パラメータのThisポインタ
    350261                continue;
    351262            }
    352263        }
    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 ){
    355266                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
    356267                continue;
     
    358269        }
    359270
    360         TYPEINFO DummyTypeInfo;
     271        Type DummyTypeInfo;
    361272        BOOL bByVal;
    362273        if(bEllipse){
     
    365276        }
    366277        else{
    367             DummyTypeInfo.type=ppi[i2].type;
    368             DummyTypeInfo.u.lpIndex=ppi[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;
    370281        }
    371282
     
    375286            if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
    376287                char temp2[255];
    377                 sprintf(temp2,"%s関数の第%dパラメータ",FuncName,i2+1);
     288                sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1);
    378289                SetError(19,temp2,cp);
    379290                continue;
     
    417328                    CalcType,
    418329                    lpCalcIndex,
    419                     FuncName,
     330                    procName.c_str(),
    420331                    i3);
    421332            }
     
    530441    return ParmSize;
    531442}
    532 int ParamImpl::SetParameter( const char *procName, const Parameters &params, 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.