Changeset 75 in dev for BasicCompiler64/OperatorProc.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
  • BasicCompiler64/OperatorProc.cpp

    r73 r75  
    22#include "Opcode.h"
    33
    4 void FreeTempObject(int reg,CClass *pobj_c){
     4void FreeTempObject(int reg,const CClass *pobj_c){
    55    if(!IsSafeReg(reg)) SetError(300,NULL,cp);
    66
     
    1616
    1717        //call DestructorProcAddr
    18         op_call( method->psi );
     18        op_call( method->pUserProc );
    1919    }
    2020
     
    2323
    2424    //call free
    25     extern SubInfo *pSub_free;
     25    extern UserProc *pSub_free;
    2626    op_call(pSub_free);
    2727}
    2828
    29 int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
     29int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
    3030    //オーバーロードされたオペレータ関数を呼び出す
    3131    CClass *pobj_c;
    3232    pobj_c=(CClass *)index_stack[sp-2];
    3333
    34     std::vector<SubInfo *> subs;
     34    std::vector<UserProc *> subs;
    3535    pobj_c->EnumMethod( idCalc, subs );
    3636    if( subs.size() == 0 ){
     
    4545
    4646    int i;
    47     BOOL bReturnTypeIsObject=1;
    48     TYPEINFO ReturnType={DEF_OBJECT,subs[0]->u.ReturnIndex};
    49     for(i=0;i<subs.size();i++){
    50         if(subs[i]->ReturnType!=DEF_OBJECT)
    51             bReturnTypeIsObject=0;
    52     }
    53 
    54     if(bReturnTypeIsObject==0){
    55         if(pBaseTypeInfo){
    56             if(pBaseTypeInfo->type==DEF_OBJECT){
    57                 ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
    58             }
    59         }
    60     }
    61 
    6247
    6348
     
    6651    /////////////////////////////////////////////
    6752
    68     PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
    69     int iParmNum=0;
    70 
    71     if(bTwoTerm){
    72         ppi[iParmNum].bArray=0;
    73         ppi[iParmNum].bByVal=0;
    74         ppi[iParmNum].name=0;
    75         ppi[iParmNum].type=type[sp-1];
    76         ppi[iParmNum].u.index=index_stack[sp-1];
    77         ppi[iParmNum].SubScripts[0]=-1;
    78         iParmNum++;
    79     }
    80 
     53    Parameters params;
     54
     55    if(bTwoTerm){
     56        params.push_back( new Parameter( "", Type( type_stack[sp-1], index_stack[sp-1] ) ) );
     57    }
    8158
    8259    //オーバーロードを解決
     
    8461    if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
    8562    else GetCalcName(idCalc,temporary);
    86     SubInfo *psi;
    87     psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
    88 
    89 
    90     if(!psi){
    91         HeapDefaultFree(ppi);
     63    UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
     64
     65    if(!pUserProc){
     66        if(bTwoTerm){
     67            delete params[0];
     68        }
    9269        return -1;
    9370    }
    9471    else{
    9572        //オーバーロードされていないが、パラメータ個数が一致しないとき
    96         if(iParmNum!=psi->params.size()){
    97             HeapDefaultFree(ppi);
     73        if(params.size()!=pUserProc->Params().size()){
     74            if(bTwoTerm){
     75                delete params[0];
     76            }
    9877            return -1;
    9978        }
    10079    }
    10180
    102     for(i=0;i<iParmNum;i++){
     81    for(i=0;i<(int)params.size();i++){
    10382        CheckDifferentType(
    104             psi->params[i]->GetBasicType(),
    105             psi->params[i]->GetIndex(),
    106             ppi[i].type,
    107             ppi[i].u.index,
     83            pUserProc->Params()[i]->GetBasicType(),
     84            pUserProc->Params()[i]->GetIndex(),
     85            params[i]->GetBasicType(),
     86            params[i]->GetIndex(),
    10887            "",
    10988            i);
    11089    }
    11190
    112     HeapDefaultFree(ppi);
    113 
    114     if(bTwoTerm){
    115         if( psi->realParams[1]->IsStruct() && psi->realParams[1]->IsRef() == false ){
     91    if(bTwoTerm){
     92        delete params[0];
     93    }
     94
     95    int right_side_size = GetTypeSize(type_stack[sp-1],index_stack[sp-1]);
     96
     97    if(bTwoTerm){
     98        if( pUserProc->RealParams()[1]->IsStruct() &&pUserProc->RealParams()[1]->IsRef() == false ){
    11699            //一時オブジェクトはメソッド内で破棄される
    117100            bUseHeap[sp-1]=0;
     
    119102    }
    120103
    121     if(psi->ReturnType==DEF_STRUCT){
     104
     105    if( pUserProc->ReturnType().IsStruct() ){
    122106        //////////////////////////////////////////////////////
    123107        // 戻り値に構造体インスタンスを持つ場合
     
    131115        //////////////////////////////////////////////////////
    132116
    133             int object_size = psi->u.Return_pobj_c->GetSize();
     117            int object_size = pUserProc->ReturnType().GetClass().GetSize();
    134118
    135119            //mov rcx,object_size
     
    137121
    138122            //call calloc
    139             extern SubInfo *pSub_calloc;
     123            extern UserProc *pSub_calloc;
    140124            op_call(pSub_calloc);
    141125
     
    152136    if(bTwoTerm){
    153137        //右の項(実数の場合が未完成)
    154         SetOneTermToReg_Whole64Calc(type[sp-1],&reg2);
     138        SetOneTermToReg_Whole64Calc(type_stack[sp-1],&reg2);
    155139        pobj_reg->UnlockReg();
    156         if( !psi->realParams[1]->IsRef() == false ){
     140        if( !pUserProc->RealParams()[1]->IsRef() == false ){
    157141            //一時参照を作成
    158142            pobj_sf->push( reg2 );
     
    190174
    191175        if(bTwoTerm){
    192             if(psi->ReturnType==DEF_STRUCT){
     176            if( pUserProc->ReturnType().IsStruct() ){
    193177                //mov r8,reg2
    194178                op_mov_RR(REG_R8,reg2);
     
    200184        }
    201185
    202         if(psi->ReturnType==DEF_STRUCT){
     186        if( pUserProc->ReturnType().IsStruct() ){
    203187            //mov rdx,r13
    204188            op_mov_RR(REG_RDX,REG_R13);
     
    209193
    210194        //call operator_proc
    211         op_call(psi);
    212 
    213         if(psi->ReturnType!=DEF_NON){
     195        op_call(pUserProc);
     196
     197        if( !pUserProc->ReturnType().IsNull() ){
    214198            //戻り値を一時的に退避
    215199
     
    253237
    254238    if(bTwoTerm){
    255         if( !psi->realParams[1]->IsRef() == false ){
     239        if( !pUserProc->RealParams()[1]->IsRef() == false ){
    256240            //一時参照を破棄
    257241            pobj_sf->pop();
     
    259243    }
    260244
    261     if(psi->ReturnType!=DEF_NON){
     245    if( !pUserProc->ReturnType().IsNull() ){
    262246        //戻り値をreg1にセット
    263247        reg1=pobj_reg->LockReg();
     
    268252
    269253    sp--;
    270     type[sp-1]=psi->ReturnType;
    271     index_stack[sp-1]=psi->u.ReturnIndex;
    272 
    273     if(psi->ReturnType==DEF_STRUCT){
     254    type_stack[sp-1]=pUserProc->ReturnType().GetBasicType();
     255    index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
     256
     257    if( pUserProc->ReturnType().IsStruct() ){
    274258        //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    275259        //※後にfreeする必要あり
     
    281265}
    282266
    283 void CallCastOperatorProc(int reg,int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex){
    284     int type[10];
     267void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType){
     268    int type_stack[10];
    285269    LONG_PTR index_stack[10];
    286270    BOOL array_bUseHeap[10];
     
    304288
    305289        //左辺
    306         type[0]=CalcType;
    307         index_stack[0]=lpCalcIndex;
     290        type_stack[0]=calcType.GetBasicType();
     291        index_stack[0]=calcType.GetIndex();
    308292        array_bUseHeap[0]=0;
    309         type[1]=ToType;
    310         index_stack[1]=lpToIndex;
     293        type_stack[1]=toType.GetBasicType();
     294        index_stack[1]=toType.GetIndex();
    311295        array_bUseHeap[1]=0;
    312296
    313         TYPEINFO BaseTypeInfo={ToType,lpToIndex};
    314 
    315         iRet=CallOperatorProc(CALC_AS,&BaseTypeInfo,type,index_stack,array_bUseHeap,sp);
     297        iRet=CallOperatorProc(CALC_AS,toType,type_stack,index_stack,array_bUseHeap,sp);
    316298
    317299        pobj_reg->UnlockReg();
     
    325307    if(iRet==1){
    326308        //成功したとき
    327         CalcType=type[0];
    328         lpCalcIndex=index_stack[0];
     309        calcType.SetType( type_stack[0], index_stack[0] );
    329310        return;
    330311    }
     
    339320
    340321//インデクサ(getter)を呼び出す
    341 void CallIndexerGetterProc(int reg,CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
    342 
    343     std::vector<SubInfo *> subs;
     322void CallIndexerGetterProc(int reg,const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType ){
     323
     324    std::vector<UserProc *> subs;
    344325    pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
    345326    if( subs.size() == 0 ){
     
    353334
    354335        Opcode_CallProc(Parameter,subs[0],0,ObjectName,DEF_OBJECT);
    355         RetTypeInfo.type = subs[0]->ReturnType;
    356         RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex;
     336        resultType = subs[0]->ReturnType();
    357337
    358338        //mov reg,rax
Note: See TracChangeset for help on using the changeset viewer.