Changeset 17 in dev for BasicCompiler64/Compile_Var.cpp


Ignore:
Timestamp:
Dec 20, 2006, 2:51:56 AM (17 years ago)
Author:
dai_9181
Message:

定数メンバ機能を有効にした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Var.cpp

    r11 r17  
    179179    return 1;
    180180}
    181 BOOL GetMemberOffset(bool ErrorEnabled,CClass *pobj_c,char *member,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpNestIndex,BOOL bPrivateAccess){
     181BOOL GetMemberOffset(bool isErrorEnabled, bool isWriteAccess, CClass *pobj_c, char *member, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpNestIndex, BOOL bPrivateAccess){
    182182    int i,offset;
    183183
     
    202202    offset=GetSizeOfClassMember(pobj_c,VarName,&i);
    203203    if(i==pobj_c->iMemberNum){
    204         if(ErrorEnabled) SetError(103,VarName,cp);
     204        if(isErrorEnabled) SetError(103,VarName,cp);
    205205        return 0;
    206206    }
     
    211211        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    212212        if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
    213             if(ErrorEnabled) SetError(107,VarName,cp);
     213            if(isErrorEnabled) SetError(107,VarName,cp);
    214214            return 0;
    215215        }
     
    218218        if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
    219219            pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
    220             if(ErrorEnabled) SetError(107,VarName,cp);
     220            if(isErrorEnabled) SetError(107,VarName,cp);
    221221            return 0;
    222222        }
    223223        else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
    224             if(ErrorEnabled) SetError(108,VarName,cp);
     224            if(isErrorEnabled) SetError(108,VarName,cp);
    225225            return 0;
    226226        }
     227    }
     228
     229    //Const定義の場合は書き込みアクセスを制限する
     230    //※コンストラクタをコンパイル中の場合は例外的に許可する
     231    if( pobj_c->ppobj_Member[i]->IsConst() &&       //定数メンバである
     232        isWriteAccess &&                            //書き込みアクセスを要求されている
     233        pobj_c->IsCompilingConstructor() == false   //コンストラクタ コンパイル中を除く
     234        ){
     235            //Const定義の変数に書き込みアクセスをしようとした場合
     236            SetError(61,VarName,cp);
    227237    }
    228238
     
    239249    else{
    240250        if(lpPtrOffset[0]){
    241             if(ErrorEnabled) SetError(16,member,cp);
     251            if(isErrorEnabled) SetError(16,member,cp);
    242252            return 0;
    243253        }
     
    256266        //配列オフセット
    257267        if(!GetArrayOffset(pobj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex)){
    258             if(ErrorEnabled) SetError(14,member,cp);
     268            if(isErrorEnabled) SetError(14,member,cp);
    259269        }
    260270    }
     
    268278        if(*pType==DEF_OBJECT){
    269279            if(RefType!=DEF_OBJECT){
    270                 if(ErrorEnabled) SetError(104,member,cp);
     280                if(isErrorEnabled) SetError(104,member,cp);
    271281                return 0;
    272282            }
     
    278288                //pObj[n].member
    279289                if(RefType!=DEF_OBJECT){
    280                     if(ErrorEnabled) SetError(104,member,cp);
     290                    if(isErrorEnabled) SetError(104,member,cp);
    281291                    return 0;
    282292                }
     
    291301                //pObj->member
    292302                if(RefType!=DEF_PTR_OBJECT){
    293                     if(ErrorEnabled) SetError(104,member,cp);
     303                    if(isErrorEnabled) SetError(104,member,cp);
    294304                    return 0;
    295305                }
     
    315325                //ppObj[n]->member
    316326                if(RefType!=DEF_PTR_OBJECT){
    317                     if(ErrorEnabled) SetError(104,member,cp);
     327                    if(isErrorEnabled) SetError(104,member,cp);
    318328                    return 0;
    319329                }
     
    329339            }
    330340            else{
    331                 if(ErrorEnabled) SetError(104,member,cp);
     341                if(isErrorEnabled) SetError(104,member,cp);
    332342                return 0;
    333343            }
    334344        }
    335345
    336         if(!GetMemberOffset(ErrorEnabled,
     346        if(!GetMemberOffset(
     347            isErrorEnabled,
     348            isWriteAccess,
    337349            pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
    338350            NestMember,
     
    371383    SetReg_WholeVariable(DEF_PTR_VOID,&RelativeVar,reg);
    372384}
    373 BOOL GetVarOffset(bool ErrorEnabled,bool WriteAccess,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     385BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    374386    extern BOOL bCompilingGlobal;
    375387    int i,RefType;
     
    465477
    466478        pRelativeVar->dwKind=VAR_DIRECTMEM;
    467         if(!GetMemberOffset(ErrorEnabled,pobj_CompilingClass,variable,pType,pRelativeVar,&lpIndex,1)) return 0;
     479        if(!GetMemberOffset(
     480            isErrorEnabled,
     481            isWriteAccess,
     482            pobj_CompilingClass,
     483            variable,
     484            pType,
     485            pRelativeVar,
     486            &lpIndex,1)) return 0;
    468487        if(plpIndex) *plpIndex=lpIndex;
    469488        return 1;
     
    536555    }
    537556
    538     if(ErrorEnabled) SetError(3,variable,cp);
     557    if(isErrorEnabled) SetError(3,variable,cp);
    539558    pRelativeVar->dwKind=NON_VAR;
    540559    return 0;
     
    571590ok:
    572591
    573     if(bConst && WriteAccess){
     592    if(bConst && isWriteAccess){
    574593        //Const定義の変数に書き込みアクセスをしようとした場合
    575594        SetError(61,VarName,cp);
     
    605624                return 0;
    606625            }
    607 
    608             LONG_PTR lp2;
    609             if(!GetMemberOffset(ErrorEnabled,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
    610             if(plpIndex) *plpIndex=lp2;
    611626        }
    612627        else if(*pType==DEF_PTR_OBJECT){
     
    621636                SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
    622637                pRelativeVar->dwKind=VAR_DIRECTMEM;
    623 
    624                 LONG_PTR lp2;
    625                 if(!GetMemberOffset(ErrorEnabled,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
    626                 if(plpIndex) *plpIndex=lp2;
    627638            }
    628639            else{
     
    639650                //mov r11,qword ptr[r12]
    640651                op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
    641 
    642                 LONG_PTR lp2;
    643                 if(!GetMemberOffset(ErrorEnabled,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
    644                 if(plpIndex) *plpIndex=lp2;
    645652            }
    646653        }
     
    663670                //mov r11,qword ptr[r12]
    664671                op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
    665 
    666                 LONG_PTR lp2;
    667                 if(!GetMemberOffset(ErrorEnabled,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
    668                 if(plpIndex) *plpIndex=lp2;
    669672            }
    670673            else{
     
    679682            return 0;
    680683        }
     684
     685        LONG_PTR lp2;
     686        if(!GetMemberOffset(
     687            isErrorEnabled,
     688            isWriteAccess,
     689            (CClass *)lpIndex,
     690            member,pType,pRelativeVar,&lp2,0)) return 0;
     691        if(plpIndex) *plpIndex=lp2;
     692
    681693        return 1;
    682694    }
Note: See TracChangeset for help on using the changeset viewer.