Changeset 75 in dev for BasicCompiler64/WatchList.cpp


Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/WatchList.cpp

    r73 r75  
    55#include "../BasicCompiler_Common/debug.h"
    66
    7 int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset);
     7int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset);
    88
    99ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
     
    6161}
    6262
    63 BOOL Debugging_SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
     63bool Debugging_SetRelativeOffset( Type &type,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
    6464    int array_num;
    6565
    6666    _int64 i64data;
    67     int type;
    68     type=StaticCalculation(true, lpPtrOffset,0,&i64data,0,1);
    69     if(!type) return 0;
    70     if(IsRealNumberType(type)){
     67    if( !StaticCalculation( true, lpPtrOffset, 0, &i64data, Type(), 1 ) ){
     68        return false;
     69    }
     70    if( type.IsReal() ){
    7171        double dbl;
    7272        memcpy(&dbl,&i64data,sizeof(double));
     
    7676    array_num=(int)i64data;
    7777
    78     if(PTR_LEVEL(*pType)){
    79         *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
    80         array_num *= GetTypeSize(*pType,-1);
     78    if( type.PtrLevel() ){
     79        type.PtrLevelDown();
     80        array_num *= type.GetSize();
    8181    }
    8282    else{
    8383        //エラー
    84         return 0;
     84        return false;
    8585    }
    8686
     
    8989    SIZE_T stAccBytes;
    9090    lpData=Debugging_GetVarPtr(pRelativeVar);
    91     if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return 0;
     91    if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)){
     92        return false;
     93    }
    9294    pRelativeVar->dwKind=VAR_DIRECTMEM;
    9395
    9496    pRelativeVar->offset+=array_num;
    95     return 1;
     97    return true;
    9698}
    9799
    98 BOOL Debugging_GetMember(CClass *pobj_c,char *member,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpNestIndex,BOOL bPrivateAccess){
     100int Debugging_GetMember( const CClass &objClass,char *member,RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
    99101    int i,i2;
    100102
     
    117119    ////////////////////////////
    118120
    119     int offset = pobj_c->GetMemberOffset( VarName, &i );
    120     if(i==pobj_c->iMemberNum) return 0;
     121    int offset = objClass.GetMemberOffset( VarName, &i );
     122    if(i==objClass.iMemberNum) return 0;
    121123
    122124
    123125    //アクセシビリティをチェック
    124     if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
    125         pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     126    if((bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
     127        objClass.ppobj_Member[i]->dwAccess==ACCESS_NON){
    126128        return 0;
    127129    }
    128     else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
     130    else if(bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
    129131        return 0;
    130132
    131     *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
    132     *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
     133    resultType = *objClass.ppobj_Member[i];
    133134
    134135    //ポインタ変数の場合
    135     if(IsPtrType(*pType)){
    136         if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
     136    if( resultType.IsPointer() ){
     137        if(objClass.ppobj_Member[i]->SubScripts[0]==-1){
    137138            lstrcpy(lpPtrOffset,array);
    138139            array[0]=0;
     
    148149        //配列オフセット
    149150        i2=Debugging_GetArray(
    150             pobj_c->ppobj_Member[i]->SubScripts,
     151            objClass.ppobj_Member[i]->SubScripts,
    151152            array,
    152             *pType,
    153             pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex,
     153            resultType,
    154154            &pRelativeVar->offset);
    155155        if(i2==0){
     
    162162        }
    163163    }
    164     else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
    165         *pType|=FLAG_PTR;
     164    else if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
     165        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    166166    }
    167167
     
    169169        //入れ子構造の場合
    170170
    171         if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     171        if( resultType.IsObject() || resultType.IsStruct() ){
    172172            if( refType != CClass::Dot ) return 0;
    173173
    174             if( *pType==DEF_OBJECT ){
     174            if( resultType.IsObject() ){
    175175                extern HANDLE hDebugProcess;
    176176                LONG_PTR lpData;
     
    181181            }
    182182        }
    183         else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
     183        else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
    184184            //構造体ポインタ型メンバ変数
    185185
     
    188188
    189189                //直接参照に切り替え
    190                 Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
     190                Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    191191
    192192                lpPtrOffset[0]=0;
     
    204204        }
    205205
    206         i2=Debugging_GetMember(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
     206        i2=Debugging_GetMember(objClass.ppobj_Member[i]->GetClass(),
    207207            NestMember,
    208             pType,
    209208            pRelativeVar,
    210             plpNestIndex,
     209            resultType,
    211210            0);
    212211        if(i2==0){
     
    221220
    222221    if(lpPtrOffset[0]){
    223         Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
     222        Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    224223    }
    225224
    226225    return 1;
    227226}
    228 int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset){
     227int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset){
    229228    extern HANDLE hHeap;
    230     int i,i2,i3,i4,i5,array_offset,TypeSize;
     229    int i,i2,i3,i4,i5,array_offset;
    231230    char temporary[VN_SIZE],*pParm[MAX_PARMS];
    232231
     
    275274    for(i=i3-1;i>=0;i--){
    276275        _int64 i64data;
    277         i2=StaticCalculation(true, pParm[i],0,&i64data,0,1);
    278         if(i2==0){
     276        Type resultType;
     277        bool isMemoryAccessError;
     278        if( !StaticCalculation(true, pParm[i],0,&i64data,resultType,1, &isMemoryAccessError ) ){
    279279            //式エラー
    280280            return 0;
    281281        }
    282         if(i2==-1){
     282        if(isMemoryAccessError){
    283283            //アクセスエラー
    284284            return -1;
    285285        }
    286286
    287         if(IsRealNumberType(i2)){
     287        if(resultType.IsReal()){
    288288            double dbl;
    289289            memcpy(&dbl,&i64data,sizeof(double));
     
    299299    }
    300300
    301     TypeSize=GetTypeSize(type,lpIndex);
    302 
    303     array_offset*=TypeSize;
     301    array_offset *= type.GetSize();
    304302
    305303    *plpOffset+=array_offset;
     
    308306}
    309307ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
    310     int i;
    311     SubInfo *psi;
    312 
    313     //ripからプロシージャを取得
    314     psi=GetSubFromObp(obp_Rip);
    315 
    316     for(i=0;i<psi->VarNum;i++){
    317         if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
    318     }
    319     if(i==psi->VarNum) return 0;
    320 
    321     return psi->pVar[i].offset;
     308    UserProc *pUserProc = GetSubFromObp(obp_Rip);
     309
     310    foreach( Variable *pVar, pUserProc->localVars ){
     311        if( pVar->GetName() == "_System_LocalThis" ){
     312            return pVar->offset;
     313        }
     314    }
     315    return 0;
    322316}
    323 int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     317int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss){
    324318    extern HANDLE hDebugProcess;
    325319    int i,i2,i3;
     
    332326    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    333327
    334     LONG_PTR lpIndex;
    335     int *pSubScripts;
    336     BOOL bArray;
     328    const int *pSubScripts;
     329    bool isArray;
    337330
    338331
     
    340333    // ローカル変数
    341334    /////////////////
    342     extern VARIABLE *LocalVar;
    343     extern int MaxLocalVarNum;
    344     for(i=0;i<MaxLocalVarNum;i++){
    345         if(lstrcmp(VarName,LocalVar[i].name)==0) break;
    346     }
    347     if(i!=MaxLocalVarNum){
     335    const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( VarName );
     336    if( pVar ){
    348337        //ポインタ変数の場合
    349         if(IsPtrType(LocalVar[i].type)){
    350             if(!LocalVar[i].bArray){
     338        if( pVar->IsPointer() ){
     339            if( !pVar->IsArray() ){
    351340                lstrcpy(lpPtrOffset,array);
    352341                array[0]=0;
     
    357346        }
    358347
    359         pRelativeVar->offset=LocalVar[i].offset;
    360         if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
    361         else pRelativeVar->dwKind=VAR_LOCAL;
    362         *pType=LocalVar[i].type;
    363         lpIndex=LocalVar[i].u.index;
    364         *plpIndex=lpIndex;
    365         bArray=LocalVar[i].bArray;
    366         pSubScripts=LocalVar[i].SubScripts;
     348        pRelativeVar->offset = pVar->offset;
     349        if( pVar->IsRef() ){
     350            pRelativeVar->dwKind=VAR_REFLOCAL;
     351        }
     352        else{
     353            pRelativeVar->dwKind=VAR_LOCAL;
     354        }
     355        resultType = *pVar;
     356        isArray = pVar->IsArray();
     357        pSubScripts = pVar->GetSubScriptsPtr();
    367358    }
    368359    else{
     
    406397            pRelativeVar->dwKind=VAR_DIRECTMEM;
    407398
    408             LONG_PTR lp2;
    409             i3=Debugging_GetMember(pobj_CompilingClass,variable,pType,pRelativeVar,&lp2,1);
     399            i3=Debugging_GetMember(*pobj_CompilingClass,variable,pRelativeVar,resultType,1);
    410400            if(i3==0){
    411401                //式エラー
     
    417407            }
    418408
    419             *plpIndex=lp2;
    420409            return 1;
    421410        }
     
    426415        // グローバル変数
    427416        ///////////////////
    428         extern VARIABLE *GlobalVar;
    429         extern int MaxGlobalVarNum;
    430 
    431         for(i=0;i<MaxGlobalVarNum;i++){
    432             if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    433         }
    434         if(i==MaxGlobalVarNum){
     417
     418        const Variable *pVar = globalVars.Find( VarName );
     419        if( !pVar ){
    435420            //一致しないとき
    436421            return 0;
     
    438423
    439424        //ポインタ変数の場合
    440         if(IsPtrType(GlobalVar[i].type)){
    441             if(!GlobalVar[i].bArray){
     425        if( pVar->IsPointer() ){
     426            if( !pVar->IsArray() ){
    442427                lstrcpy(lpPtrOffset,array);
    443428                array[0]=0;
     
    448433        }
    449434
    450         pRelativeVar->offset=GlobalVar[i].offset;
    451         if(GlobalVar[i].fRef) pRelativeVar->dwKind=VAR_REFGLOBAL;
     435        pRelativeVar->offset=pVar->offset;
     436        if(pVar->IsRef()) pRelativeVar->dwKind=VAR_REFGLOBAL;
    452437        else pRelativeVar->dwKind=VAR_GLOBAL;
    453         *pType=GlobalVar[i].type;
    454         lpIndex=GlobalVar[i].u.index;
    455         *plpIndex=lpIndex;
    456         bArray=GlobalVar[i].bArray;
    457         pSubScripts=GlobalVar[i].SubScripts;
    458     }
    459 
    460 
    461     if(array[0]==0&&bArray){
     438        resultType = *pVar;
     439        isArray = pVar->IsArray();
     440        pSubScripts=pVar->GetSubScriptsPtr();
     441    }
     442
     443
     444    if(array[0]==0&&isArray){
    462445        //配列の先頭ポインタを示す場合
    463         *pType|=FLAG_PTR;
    464         if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
     446        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
     447        if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM*sizeof(int));
    465448        return 1;
    466449    }
    467450
    468451    if(array[0]){
    469         i3=Debugging_GetArray(pSubScripts,array,*pType,lpIndex,&pRelativeVar->offset);
     452        i3=Debugging_GetArray(pSubScripts,array,resultType,&pRelativeVar->offset);
    470453        if(i3==0){
    471454            //式エラー
     
    478461    }
    479462    if(member[0]){
    480         if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     463        if( resultType.IsObject() || resultType.IsStruct() ){
    481464            //実態オブジェクトのメンバを参照(obj.member)
    482465            if( refType != CClass::Dot ){
     
    484467            }
    485468
    486             LONG_PTR lp2;
    487             i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
     469            i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
    488470            if(i3==0){
    489471                //式エラー
     
    494476                return -1;
    495477            }
    496 
    497             *plpIndex=lp2;
    498         }
    499         else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
     478        }
     479        else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
    500480            //ポインタオブジェクトが示すメンバを参照
    501481            if(lpPtrOffset[0]){
    502482                //pObj[n].member
    503483                if( refType != CClass::Dot ) return 0;
    504                 Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
    505 
    506                 LONG_PTR lp2;
    507                 i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
     484                Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
     485
     486                i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
    508487                if(i3==0){
    509488                    //式エラー
     
    514493                    return -1;
    515494                }
    516 
    517                 *plpIndex=lp2;
    518495            }
    519496            else{
     
    527504                pRelativeVar->offset=lpData;
    528505
    529                 LONG_PTR lp2;
    530                 i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
     506                i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
    531507                if(i3==0){
    532508                    //式エラー
     
    537513                    return -1;
    538514                }
    539 
    540                 *plpIndex=lp2;
    541515            }
    542516        }
     
    548522
    549523    if(lpPtrOffset[0]){
    550         if(!Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset)) return 0;
     524        if(!Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset)) return 0;
    551525    }
    552526
Note: See TracChangeset for help on using the changeset viewer.