Changeset 49 in dev for BasicCompiler64


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

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

Location:
BasicCompiler64
Files:
3 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は変数ベースアドレスからの相対オフセットを示す
  • BasicCompiler64/NumOpe.cpp

    r41 r49  
    314314
    315315                        if(idProc){
    316                             //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    317                             if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
     316                            //閉じカッコ")"に続く文字がNULLでないとき
     317                            if(term[i2+1+i4+1]!='\0'){
     318                                if( term[i2+1+i4+1] == '.'
     319                                    || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){
     320                                        goto NonProc;
     321                                }
     322                                else{
     323                                    SetError(42,NULL,cp);
     324                                }
     325                            }
    318326
    319327
     
    402410                        }
    403411                    }
     412NonProc:
    404413
    405414
  • BasicCompiler64/Opcode.h

    r46 r49  
    6262extern int obp;
    6363extern char *OpBuffer;
     64
     65#define breakpoint OpBuffer[obp++]=(char)0xCC;
     66
    6467
    6568//ラベルアドレス
Note: See TracChangeset for help on using the changeset viewer.