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

    r63 r64  
    5151
    5252        //add rsp,スタックフレームサイズ
    53         op_add64_value(REG_RSP,pobj_sf->GetFrameSize());
     53        op_add_RV(REG_RSP,pobj_sf->GetFrameSize());
    5454
    5555        //スタックフレームスケジュール(subコマンドに渡す値)
     
    9494
    9595        //add rsp,スタックフレームサイズ
    96         op_add64_value(REG_RSP,pobj_sf->GetFrameSize());
     96        op_add_RV(REG_RSP,pobj_sf->GetFrameSize());
    9797
    9898        //スタックフレームスケジュール(subコマンドに渡す値)
     
    118118
    119119        //add rsp,8
    120         op_add64_value(REG_RSP,0x8);
     120        op_add_RV(REG_RSP,0x8);
    121121
    122122        //ret
     
    128128
    129129        //add rax,PTR_SIZE
    130         op_add64_value(REG_RAX,PTR_SIZE);
     130        op_add_RV(REG_RAX,PTR_SIZE);
    131131
    132132        //ret
     
    337337
    338338        LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type;
    339         if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){
    340             if(psi->bExport)
    341                 SetError(24,NULL,cp);
     339        if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
     340            ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
     341                if(psi->bExport)
     342                    SetError(24,NULL,cp);
    342343        }
    343344
    344345        LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index;
    345346
    346         if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_OBJECT){
    347             //実態オブジェクトのByValパラメータ
     347        if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){
     348            //構造体のByValパラメータ
    348349            LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
    349350            VarSize=PTR_SIZE;
     
    457458    BaseLocalVar=AllLocalVarSize;
    458459
    459     if(psi->ReturnType!=-1){
     460    if(psi->ReturnType!=DEF_NON){
    460461        //戻り値が存在するとき
    461462
     
    464465        else temp=psi->name;
    465466
    466         if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    467             //戻り値用オブジェクトのコンストラクタを呼び出す
    468             if( psi->u.Return_pobj_c->GetConstructorMethod() ){
    469                 sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name);
    470                 OpcodeOthers(temporary);
    471             }
     467        if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     468            //戻り値用の構造体(値型)はパラメータで引き渡される
    472469        }
    473470        else{
     
    493490
    494491        //mov rcx,rsp
    495         op_mov64_ToReg_FromReg(REG_RCX,REG_RSP);
     492        op_mov_RR(REG_RCX,REG_RSP);
    496493
    497494        //add rcx,スタックフレームサイズ+sizeof(_int64) ※ret用のサイズを考慮
    498         op_add64_value(REG_RCX,0);
     495        op_add_RV(REG_RCX,0);
    499496        RspOffsetSchedule2=obp-sizeof(long);
    500497
     
    571568            for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
    572569                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    573                 int MemberTypeSize=
    574                     GetTypeSize(pMember->TypeInfo.type,
    575                         pMember->TypeInfo.u.lpIndex);
    576 
    577                 int MemberObjectNum=
    578                     JumpSubScripts(pMember->SubScripts);
    579 
    580                 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL );
    581 
    582                 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
    583                     CMethod *method = pMember->TypeInfo.u.pobj_Class->GetConstructorMethod();
    584                     if( method ){
    585                         if( method->psi->RealParmNum == 1 ){    //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
    586                             for(i4=0;i4<MemberObjectNum;i4++){
    587                                 //Thisポインタをrcxにコピー
    588                                 SetThisPtrToReg(REG_RCX);
    589 
    590                                 //add rcx,offset
    591                                 op_add64_value(REG_RCX,offset+i4*MemberTypeSize);
    592 
    593                                 //call constructor
    594                                 op_call( method->psi );
    595                             }
    596                         }
    597                     }
     570                if(pMember->TypeInfo.type==DEF_OBJECT){
     571                    // オブジェクトメンバを発見したとき
     572
     573                    sprintf(temporary, "This.%s=%c%c%s()",
     574                        pMember->name,
     575                        1, ESC_NEW,
     576                        pMember->TypeInfo.u.pobj_Class->name );
     577                    OpcodeCalc( temporary );
    598578                }
    599579            }
     
    665645            }
    666646
    667             //実体クラスを持つメンバのデストラクタを呼び出す
     647            //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる
     648            /*
    668649            //※コンストラクタと逆順序で呼び出す
    669650            for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){
     
    678659                int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL );
    679660
    680                 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
     661                if(pMember->TypeInfo.type==DEF_OBJECT){
    681662                    CMethod *method = pMember->TypeInfo.u.pobj_Class->GetDestructorMethod();
    682663                    if( method ){
     
    686667
    687668                            //add rcx,offset
    688                             op_add64_value(REG_RCX,offset+i4*MemberTypeSize);
     669                            op_add_RV(REG_RCX,offset+i4*MemberTypeSize);
    689670
    690671                            //call destructor
     
    693674                    }
    694675                }
    695             }
     676            }*/
    696677        }
    697678    }
     
    743724    }
    744725
    745     if(psi->ReturnType!=-1){
     726    if(psi->ReturnType!=DEF_NON){
    746727        //////////////////////////////////
    747728        // 戻り値をraxまたはxmm0に設定
     
    759740        i3=psi->ReturnType;
    760741
    761         if(i3==DEF_OBJECT){
     742        if(i3==DEF_OBJECT || i3==DEF_STRUCT){
    762743            SetVarPtrToReg(REG_RAX,&RelativeVar);
     744            if( i3==DEF_OBJECT ){
     745                //mov rax,qword ptr[rax]
     746                op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
     747            }
    763748        }
    764749        else if(i3==DEF_DOUBLE){
Note: See TracChangeset for help on using the changeset viewer.