Changeset 73 in dev for BasicCompiler32/CParameter.cpp


Ignore:
Timestamp:
Mar 16, 2007, 11:07:14 PM (17 years ago)
Author:
dai_9181
Message:

Parameterクラスを適用。32bit側は動くようになったので、64bitのほうを調整する。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/CParameter.cpp

    r71 r73  
    4040        BOOL bByVal;
    4141        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);
    4343            bByVal=1;
    4444        }
     
    9696    return nCountOfTempObjects * PTR_SIZE;
    9797}
     98int 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,
     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}
    98192
    99193void ParamImpl::DeleteTempParameters(){
     
    111205
    112206                //call free
    113                 extern SUBINFO *pSub_free;
     207                extern SubInfo *pSub_free;
    114208                op_call(pSub_free);
    115209            }
     
    138232
    139233    //call calloc
    140     extern SUBINFO *pSub_calloc;
     234    extern SubInfo *pSub_calloc;
    141235    op_call(pSub_calloc);
    142236
     
    147241    TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
    148242    TYPEINFO CalcType;
    149     CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
     243    CalcType.type=NumOpe_GetType_Old(Parameter,&BaseType,&CalcType.u.lpIndex);
    150244
    151245    /*
     
    267361        BOOL bByVal;
    268362        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);
    270364            bByVal=1;
    271365        }
     
    436530    return ParmSize;
    437531}
     532int 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
     745next:;
     746    }
     747
     748    return ParmSize;
     749}
Note: See TracChangeset for help on using the changeset viewer.