Changeset 64 in dev for BasicCompiler32/CParameter.cpp


Ignore:
Timestamp:
Mar 8, 2007, 2:49:34 AM (17 years ago)
Author:
dai_9181
Message:

すべてのオブジェクトを参照型に切り替えた。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/CParameter.cpp

    r63 r64  
    22#include "opcode.h"
    33
    4 void CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
     4int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
    55    ///////////////////////////////////////////////////////
    66    // 一時オブジェクトをあらかじめスタックに積んでおく
    77    ///////////////////////////////////////////////////////
    8     //TODO: 64ビットコードのままなので、32ビット用に書き換える
    98
    109    useTempObject = false;
    1110
    12     //一時オブジェクトの数
     11    //一時参照の数
    1312    nCountOfTempObjects = 0;
    1413
     
    6463                int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
    6564                //↑ここでスタックに積む
     65
     66                nCountOfTempObjects++;
     67
     68                if( type == DEF_OBJECT ){
     69                    //一時参照を作成
     70
     71                    //push esp
     72                    op_push( REG_ESP );
     73
     74                    nCountOfTempObjects++;
     75                }
    6676
    6777                bool result = CheckDifferentType(
     
    8090                    types[i2].u.lpIndex = lpVarIndex;
    8191                }
    82 
    83                 nCountOfTempObjects++;
    84             }
    85         }
    86     }
     92            }
     93        }
     94    }
     95
     96    return nCountOfTempObjects * PTR_SIZE;
    8797}
     98
    8899void CParameter::DeleteTempParameters(){
    89100    ///////////////////////////////////////////////////////
    90101    // 一時オブジェクトを破棄
    91102    ///////////////////////////////////////////////////////
    92     //TODO: 64ビットコードのままなので、32ビット用に書き換える
    93 
    94103    if( !useTempObject ) return;
    95104
    96105    for(int i2=ParmsNum-1;i2>=0;i2--){
    97106        if( useTempParameters[i2] ){
    98             //スタックフレームから取得
    99             // ※関数呼び出し時も値が普遍のebxを利用する
    100             op_pop(REG_EBX);
    101 
    102 
    103             ///////////////////////////
    104             // デストラクタを呼び出す
    105             ///////////////////////////
    106 
    107             //push ebx
    108             op_push(REG_EBX);
    109 
    110             //call destructor
    111             CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod();
    112             if( method ){
    113                 op_call( method->psi );
    114             }
    115 
    116 
    117             /////////////////////////
    118             // メモリを解放する
    119             /////////////////////////
    120 
    121             //push ebx
    122             op_push(REG_EBX);
    123 
    124             //call free
    125             extern SUBINFO *pSub_free;
    126             op_call(pSub_free);
     107            if( types[i2].type == DEF_STRUCT ){
     108                // 構造体の一時メモリ
     109
     110                //メモリを解放する
     111
     112                //call free
     113                extern SUBINFO *pSub_free;
     114                op_call(pSub_free);
     115            }
     116            else if( types[i2].type == DEF_OBJECT ){
     117                op_pop( REG_NON );
     118                op_pop( REG_NON );
     119            }
     120            else{
     121                SetError(300,NULL,cp);
     122            }
     123
    127124        }
    128125    }
    129126}
    130127
    131 void CParameter::SetObjectParameter(CClass *pobj_Class,LPSTR Parameter){
     128void CParameter::SetStructParameter(CClass *pobj_Class,LPSTR Parameter){
    132129    int object_size = pobj_Class->GetSize();
    133130
     
    143140
    144141
    145     TYPEINFO BaseType={DEF_OBJECT,(LONG_PTR)pobj_Class};
     142    TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
    146143    TYPEINFO CalcType;
    147144    CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
    148145
     146    /*
     147    TODO: 消す
    149148    if( pobj_Class->GetCopyConstructorMethod()
    150149        && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
     
    185184        }
    186185    }
    187     else{
     186    else{*/
     187
     188
    188189        //push eax
    189190        op_push(REG_EAX);
    190191
    191 
     192/*
     193            TODO: 消す
    192194            if( pobj_Class->GetConstructorMethod() ){
    193195                ////////////////////////////////
     
    201203                op_call(pobj_Class->GetConstructorMethod()->psi);
    202204            }
    203 
    204 
    205             TYPEINFO CalcType;
     205*/
     206
    206207            BOOL bUseHeap;
    207             CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
    208 
    209 
    210 
    211         SetObjectVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
    212     }
     208            CalcType.type=NumOpe(Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
     209
     210
     211
     212        SetStructVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
     213    //}
    213214}
    214215
     
    280281            }
    281282
    282             if(DummyTypeInfo.type==DEF_OBJECT){
    283                 SetObjectParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
     283            if(DummyTypeInfo.type==DEF_STRUCT){
     284                SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
    284285                goto next;
    285286            }
     
    299300
    300301            if(CalcType==DEF_OBJECT){
    301                 //キャスト演算子のオーバーロードに対応する
    302                 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     302                if( DummyTypeInfo.type != DEF_OBJECT
     303                    ||
     304                    DummyTypeInfo.type == DEF_OBJECT &&
     305                    !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
     306                        //キャスト演算子のオーバーロードに対応する
     307                        CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     308                }
    303309            }
    304310
     
    328334                ParmSize+=sizeof(long)*2;
    329335            }
    330             else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||
     336            else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT||
    331337                (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){
    332338                ChangeTypeToLong(CalcType);
     
    354360            }
    355361            else{
    356                 //変数のアドレスを取得
    357                 int VarType;
    358                 LONG_PTR lpVarIndex;
    359                 if(GetVarOffset(
    360                     false,
    361                     false,
    362                     Parms[i2],
    363                     &VarType,
    364                     &RelativeVar,
    365                     &lpVarIndex)){
    366                         if(DummyTypeInfo.type!=DEF_ANY){
    367                             //型チェックを行う
    368                             if(DummyTypeInfo.type==VarType){
    369                                 if(DummyTypeInfo.type==DEF_OBJECT){
    370                                     if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
    371                                         SetError(11,Parms[i2],cp);
    372                                     }
    373                                 }
    374                             }
    375                             else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
    376                                 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
    377                             }
    378                             else{
    379                                 SetError(11,Parms[i2],cp);
    380                             }
    381                         }
    382 
    383                         //変数アドレスをレジスタにセット
    384                         SetVarPtrToEax(&RelativeVar);
    385 
    386                         //push eax
    387                         op_push(REG_EAX);
    388                 }
    389                 else{
     362                if( useTempParameters[i2] ){
    390363                    //一時オブジェクトをコピー
     364
     365                    if( types[i2].type == DEF_OBJECT ){
     366                        // 一時参照のための領域を考慮する
     367                        nCountOfNowTempObjects++;
     368                    }
     369
     370                    nCountOfNowTempObjects++;
    391371
    392372                    //mov eax, dword ptr[esp+offset]
     
    395375                        REG_EAX,
    396376                        REG_ESP,
    397                         ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1 ) ) * PTR_SIZE,
     377                        ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE,
    398378                        MOD_BASE_DISP32 );
    399 
    400                     nCountOfNowTempObjects++;
    401379
    402380                    //push eax
    403381                    op_push(REG_EAX);
    404 
    405                     //VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
     382                }
     383                else{
     384                    //変数のアドレスを取得
     385                    int VarType;
     386                    LONG_PTR lpVarIndex;
     387                    if(GetVarOffset(
     388                        false,
     389                        false,
     390                        Parms[i2],
     391                        &VarType,
     392                        &RelativeVar,
     393                        &lpVarIndex)){
     394                            if(DummyTypeInfo.type!=DEF_ANY){
     395                                //型チェックを行う
     396                                if(DummyTypeInfo.type==VarType){
     397                                    if(DummyTypeInfo.type==DEF_OBJECT){
     398                                        if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
     399                                            SetError(11,Parms[i2],cp);
     400                                        }
     401                                    }
     402                                    else if(DummyTypeInfo.type==DEF_STRUCT){
     403                                        if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
     404                                            SetError(11,Parms[i2],cp);
     405                                        }
     406                                    }
     407                                }
     408                                else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
     409                                    //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
     410                                }
     411                                else{
     412                                    SetError(11,Parms[i2],cp);
     413                                }
     414                            }
     415
     416                            //変数アドレスをレジスタにセット
     417                            SetVarPtrToEax(&RelativeVar);
     418
     419                            //push eax
     420                            op_push(REG_EAX);
     421                    }
    406422                }
    407423            }
Note: See TracChangeset for help on using the changeset viewer.