Changeset 64 in dev for BasicCompiler64/OperatorProc.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/OperatorProc.cpp

    r63 r64  
    5555        if(pBaseTypeInfo){
    5656            if(pBaseTypeInfo->type==DEF_OBJECT){
    57                 bReturnTypeIsObject=1;
    5857                ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
    5958            }
     
    113112    HeapDefaultFree(ppi);
    114113
    115     int right_side_size;
    116     if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;
    117     else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);
    118 
    119114    if(bTwoTerm){
    120         if(psi->pParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){
     115        if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){
    121116            //一時オブジェクトはメソッド内で破棄される
    122117            bUseHeap[sp-1]=0;
     
    124119    }
    125120
    126 
    127     if(psi->ReturnType==DEF_OBJECT){
    128         //////////////////////////////////////////////////////
    129         // 戻り値にオブジェクト インスタンスを持つ場合
    130         // ※ByRef _System_ReturnObject パラメータ用領域を取得
     121    if(psi->ReturnType==DEF_STRUCT){
     122        //////////////////////////////////////////////////////
     123        // 戻り値に構造体インスタンスを持つ場合
     124        // ※ByRef _System_ReturnValue パラメータ用領域を取得
    131125        //////////////////////////////////////////////////////
    132126
     
    154148        }////////////////////////////////////////////
    155149    }
    156 
    157150
    158151    int reg1,reg2;
     
    161154        SetOneTermToReg_Whole64Calc(type[sp-1],&reg2);
    162155        pobj_reg->UnlockReg();
     156        if( !psi->pRealParmInfo[1].bByVal ){
     157            //一時参照を作成
     158            pobj_sf->push( reg2 );
     159            pobj_sf->mov_sp( reg2 );
     160        }
    163161    }
    164162
     
    192190
    193191        if(bTwoTerm){
    194             if(psi->ReturnType==DEF_OBJECT){
     192            if(psi->ReturnType==DEF_STRUCT){
    195193                //mov r8,reg2
    196194                op_mov_RR(REG_R8,reg2);
     
    202200        }
    203201
    204         if(psi->ReturnType==DEF_OBJECT){
     202        if(psi->ReturnType==DEF_STRUCT){
    205203            //mov rdx,r13
    206204            op_mov_RR(REG_RDX,REG_R13);
     
    213211        op_call(psi);
    214212
    215         if(psi->ReturnType!=-1){
     213        if(psi->ReturnType!=DEF_NON){
    216214            //戻り値を一時的に退避
    217215
     
    254252    }
    255253
    256     if(psi->ReturnType!=-1){
     254    if(bTwoTerm){
     255        if( !psi->pRealParmInfo[1].bByVal ){
     256            //一時参照を破棄
     257            pobj_sf->pop();
     258        }
     259    }
     260
     261    if(psi->ReturnType!=DEF_NON){
    257262        //戻り値をreg1にセット
    258263        reg1=pobj_reg->LockReg();
     
    266271    index_stack[sp-1]=psi->u.ReturnIndex;
    267272
    268     if(psi->ReturnType==DEF_OBJECT){
    269         //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     273    if(psi->ReturnType==DEF_STRUCT){
     274        //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    270275        //※後にfreeする必要あり
    271276        bUseHeap[sp-1]=1;
Note: See TracChangeset for help on using the changeset viewer.