Changeset 64 in dev for BasicCompiler32/OperatorProc.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/OperatorProc.cpp

    r63 r64  
    5050        if(pBaseTypeInfo){
    5151            if(pBaseTypeInfo->type==DEF_OBJECT){
    52                 bReturnTypeIsObject=1;
    5352                ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
    5453            }
     
    107106    HeapDefaultFree(ppi);
    108107
    109     int right_side_size;
    110     if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;
    111     else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);
    112 
    113     if(bTwoTerm){
    114         if(psi->pParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){
     108    int right_side_size = GetTypeSize(type[sp-1],index_stack[sp-1]);
     109
     110    if(bTwoTerm){
     111        if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){
    115112            //一時オブジェクトはメソッド内で破棄される
    116113            bUseHeap[sp-1]=0;
     
    119116
    120117
    121     if(psi->ReturnType==DEF_OBJECT){
     118    if(psi->ReturnType==DEF_STRUCT){
    122119        //////////////////////////////////////////////////////
    123         // 戻り値にオブジェクト インスタンスを持つ場合
    124         // ※ByRef _System_ReturnObject パラメータ用領域を取得
     120        // 戻り値に構造体インスタンスを持つ場合
     121        // ※ByRef _System_ReturnValue パラメータ用領域を取得
    125122        //////////////////////////////////////////////////////
    126123
     
    182179            op_push(REG_EAX);
    183180        }
    184     }
    185 
    186     if(psi->ReturnType==DEF_OBJECT){
     181
     182        if( !psi->pRealParmInfo[1].bByVal ){
     183            //一時参照を作成
     184
     185            //mov eax,esp
     186            op_mov_RR( REG_EAX, REG_ESP );
     187
     188            //push eax
     189            op_push( REG_EAX );
     190        }
     191    }
     192
     193    if(psi->ReturnType==DEF_STRUCT){
    187194        //push ebx
    188195        op_push(REG_EBX);
     
    195202    op_call(psi);
    196203
    197     if(psi->ReturnType!=-1){
     204    if(bTwoTerm){
     205        if( !psi->pRealParmInfo[1].bByVal ){
     206            //一時参照を破棄
     207            op_pop( REG_NON );
     208        }
     209    }
     210
     211    if(psi->ReturnType!=DEF_NON){
    198212        //スタックへプッシュ
    199213        PushReturnValue(psi->ReturnType);
     
    211225    index_stack[sp-1]=psi->u.ReturnIndex;
    212226
    213     if(psi->ReturnType==DEF_OBJECT){
    214         //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     227    if(psi->ReturnType==DEF_STRUCT){
     228        //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    215229        //※後にfreeする必要あり
    216230        bUseHeap[sp-1]=1;
Note: See TracChangeset for help on using the changeset viewer.