Changeset 49 in dev for BasicCompiler64/Compile_Var.cpp


Ignore:
Timestamp:
Feb 10, 2007, 6:13:37 AM (17 years ago)
Author:
dai_9181
Message:

戻り値オブジェクトのメンバを直接的に参照できるようにした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Var.cpp

    r41 r49  
    388388    extern BOOL bCompilingGlobal;
    389389    int i,RefType;
     390    LONG_PTR lpIndex;
    390391    char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    391392
     
    396397    else lstrcpy(variable,NameBuffer);
    397398
     399    if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){
     400        // 戻り値オブジェクトのメンバを直接参照しているとき
     401        //例: func().member
     402
     403        void *pInfo;
     404        int idProc=GetProc(VarName,&pInfo);
     405
     406        if(idProc){
     407            pRelativeVar->dwKind=VAR_DIRECTMEM;
     408
     409            //////////////////////////////////////////////////////
     410            /////    レジスタ資源のバックアップ
     411            {   BACKUP_REGISTER_RESOURCE
     412            //////////////////////////////////////////////////////
     413
     414                ////////////////
     415                // 呼び出し
     416                ////////////////
     417
     418                *pType=CallProc(idProc,pInfo,VarName,array,&lpIndex);
     419
     420                //戻り値をr11にコピー
     421                op_mov_RR( REG_R11, REG_RAX );
     422
     423            /////////////////////////////////////////////
     424            //////   レジスタ資源を復元
     425                RESTORE_REGISTER_RESOURCE
     426            }////////////////////////////////////////////
     427
     428            LONG_PTR lp2;
     429            if(!GetMemberOffset(
     430                isErrorEnabled,
     431                isWriteAccess,
     432                (CClass *)lpIndex,
     433                member,pType,pRelativeVar,&lp2,0)) return 0;
     434            if(plpIndex) *plpIndex=lp2;
     435
     436            return 1;
     437        }
     438    }
     439
     440
     441
    398442    lstrcpy(VarName,variable);
    399443    GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
    400444
    401     LONG_PTR lpIndex;
    402445    int *pSubScripts;
    403446    bool bConst = false;
     
    565608    }
    566609
    567 
    568610    /////////////////////
    569611    // グローバル変数
     
    635677    }
    636678
    637     if(array[0]||member[0]){
     679    if( array[0] || member[0] ){
    638680        //xor r11,r11(r11を0に初期化する)
    639681        //※r11は変数ベースアドレスからの相対オフセットを示す
Note: See TracChangeset for help on using the changeset viewer.