Changeset 40 in dev for BasicCompiler64/Compile_Var.cpp


Ignore:
Timestamp:
Jan 28, 2007, 3:48:22 AM (17 years ago)
Author:
dai_9181
Message:

ByRef修飾子を関数戻り値とDimステートメントで指定可能にした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Var.cpp

    r36 r40  
    206206    }
    207207
     208    CMember *pMember=pobj_c->ppobj_Member[i];
     209
    208210
    209211    //アクセシビリティをチェック
    210212    if(pobj_c==pobj_CompilingClass){
    211213        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    212         if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     214        if(pMember->dwAccess==ACCESS_NON){
    213215            if(isErrorEnabled) SetError(107,VarName,cp);
    214216            return 0;
     
    216218    }
    217219    else{
    218         if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
    219             pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     220        if((bPrivateAccess==0&&pMember->dwAccess==ACCESS_PRIVATE)||
     221            pMember->dwAccess==ACCESS_NON){
    220222            if(isErrorEnabled) SetError(107,VarName,cp);
    221223            return 0;
    222224        }
    223         else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
     225        else if(bPrivateAccess==0&&pMember->dwAccess==ACCESS_PROTECTED){
    224226            if(isErrorEnabled) SetError(108,VarName,cp);
    225227            return 0;
     
    229231    //Const定義の場合は書き込みアクセスを制限する
    230232    //※コンストラクタをコンパイル中の場合は例外的に許可する
    231     if( pobj_c->ppobj_Member[i]->IsConst() &&       //定数メンバである
     233    if( pMember->IsConst() &&       //定数メンバである
    232234        isWriteAccess &&                            //書き込みアクセスを要求されている
    233235        pobj_c->IsCompilingConstructor() == false   //コンストラクタ コンパイル中を除く
     
    237239    }
    238240
    239     *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
    240     *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
     241    *pType=pMember->TypeInfo.type;
     242    *plpNestIndex=pMember->TypeInfo.u.lpIndex;
    241243
    242244    //ポインタ変数の場合
    243245    if(IsPtrType(*pType)){
    244         if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
     246        if(pMember->SubScripts[0]==-1){
    245247            lstrcpy(lpPtrOffset,array);
    246248            array[0]=0;
     
    265267    if(array[0]){
    266268        //配列オフセット
    267         if(!GetArrayOffset(pobj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex)){
     269        if(!GetArrayOffset(pMember->SubScripts,array,*pType,pMember->TypeInfo.u.lpIndex)){
    268270            if(isErrorEnabled) SetError(14,member,cp);
    269271        }
    270272    }
    271     else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
     273    else if(pMember->SubScripts[0]!=-1){
    272274        *pType|=FLAG_PTR;
    273275    }
     
    276278        //入れ子構造の場合
    277279
    278         if(*pType==DEF_OBJECT){
     280        if(*pType==DEF_OBJECT && pMember->IsRef() == false){
    279281            if(RefType!=DEF_OBJECT){
    280282                if(isErrorEnabled) SetError(104,member,cp);
     
    282284            }
    283285        }
    284         else if(*pType==DEF_PTR_OBJECT){
     286        else if(*pType==DEF_PTR_OBJECT || ( *pType==DEF_OBJECT && pMember->IsRef() )){
    285287            //構造体ポインタ型メンバ変数
    286288
    287289            if(lpPtrOffset[0]){
    288290                //pObj[n].member
    289                 if(RefType!=DEF_OBJECT){
     291                if(*pType==DEF_PTR_OBJECT&&RefType!=DEF_OBJECT){
    290292                    if(isErrorEnabled) SetError(104,member,cp);
    291293                    return 0;
     
    300302            else{
    301303                //pObj->member
    302                 if(RefType!=DEF_PTR_OBJECT){
     304                if(*pType==DEF_PTR_OBJECT&&RefType!=DEF_PTR_OBJECT){
    303305                    if(isErrorEnabled) SetError(104,member,cp);
    304306                    return 0;
     
    347349            isErrorEnabled,
    348350            isWriteAccess,
    349             pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
     351            pMember->TypeInfo.u.pobj_Class,
    350352            NestMember,
    351353            pType,
     
    383385    SetReg_WholeVariable(DEF_PTR_VOID,&RelativeVar,reg);
    384386}
    385 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     387BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    386388    extern BOOL bCompilingGlobal;
    387389    int i,RefType;
     
    432434            pRelativeVar->offset=-LocalVar[i].offset;
    433435            pRelativeVar->bOffsetOffset=0;
    434             if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
     436            if(LocalVar[i].fRef){
     437                // 参照型
     438                pRelativeVar->dwKind = VAR_REFLOCAL;
     439            }
    435440            else pRelativeVar->dwKind=VAR_LOCAL;
    436441            *pType=LocalVar[i].type;
     
    10451050
    10461051
    1047 void dim(char *Parameter,DWORD dwFlag){
     1052void dim(char *Parameter,DWORD dwFlags){
    10481053    extern BOOL bCompilingGlobal;
    10491054    extern HANDLE hHeap;
     
    10511056    char VarName[VN_SIZE];
    10521057
    1053 
    1054     if(dwFlag & DIMFLAG_CONST){
     1058    //参照型かどうか
     1059    bool isRef = false;
     1060
     1061    i2 = 0;
     1062
     1063    if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){
     1064        //参照型
     1065        isRef = true;
     1066        Parameter += 2;
     1067    }
     1068
     1069    if(dwFlags & DIMFLAG_CONST){
     1070
    10551071        //////////////////////////////////
    10561072        // 定数変数の場合を考慮
    10571073        //////////////////////////////////
    1058         for(i2=0;;i2++){
     1074        for(;;i2++){
    10591075            if(Parameter[i2] == '=' ||
    10601076                Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
     
    10831099    char InitBuf[8192];
    10841100    char ConstractParameter[VN_SIZE];
    1085     if(!GetDimentionFormat(Parameter,VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
     1101    if(!GetDimentionFormat(Parameter, isRef , VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
    10861102        return;
    10871103
     
    11041120    TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    11051121
    1106     if(dwFlag&DIMFLAG_STATIC){
     1122    if(dwFlags&DIMFLAG_STATIC){
    11071123        if(bCompilingGlobal){
    11081124            SetError(60,NULL,cp);
     
    11181134        GetNowStaticVarFullName(VarName,temporary);
    11191135
    1120         AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
     1136        AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11211137
    11221138        /*
     
    11311147            /////////////////////////
    11321148
    1133             AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
     1149            AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11341150        }
    11351151        else{
     
    11491165
    11501166            LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
     1167            VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
     1168            MaxLocalVarNum++;
     1169
     1170            if( isRef ){
     1171                //参照型
     1172                pVar->fRef = REF_VARIABLE;
     1173                TypeSize = PTR_SIZE;
     1174            }
     1175            else pVar->fRef=0;
    11511176
    11521177            for(i2=1,i3=0;i3<255;i3++){
    11531178                //配列要素数
    1154                 LocalVar[MaxLocalVarNum].SubScripts[i3]=SubScripts[i3];
     1179                pVar->SubScripts[i3]=SubScripts[i3];
    11551180
    11561181                if(SubScripts[i3]==-1) break;
     
    11601185            if(VarSize%8) VarSize+=8-(VarSize%8);
    11611186
    1162             VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
    1163 
    1164             MaxLocalVarNum++;
    1165 
    11661187            //変数データを追加
    11671188            lstrcpy(pVar->name,VarName);
    1168             pVar->fRef=0;
    1169             if(dwFlag & DIMFLAG_CONST) pVar->bConst = true;
     1189            if(dwFlags & DIMFLAG_CONST) pVar->bConst = true;
    11701190            else pVar->bConst = false;
    11711191            if(SubScripts[0]==-1) pVar->bArray=0;
     
    11941214                if(!result){
    11951215                    //動的な式だった場合は代入演算を行う
    1196                     char temporary[8192];
    1197                     sprintf(temporary,"%s=%s",VarName,InitBuf);
    1198                     OpcodeCalc(temporary);
     1216                    if( isRef ){
     1217                        SetRefVariable( VarName, InitBuf );
     1218                    }
     1219                    else{
     1220                        char temporary[8192];
     1221                        sprintf(temporary,"%s=%s",VarName,InitBuf);
     1222                        OpcodeCalc(temporary);
     1223                    }
    11991224                }
    12001225
     
    12271252
    12281253        //コンストラクタ呼び出し
    1229         if(TypeInfo.type==DEF_OBJECT&&(dwFlag&DIMFLAG_NONCALL_CONSTRACTOR)==0){
     1254        if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){
    12301255            CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter);
    12311256        }
     
    12391264    }
    12401265}
    1241 void OpcodeDim(char *Parameter,DWORD dwFlag){
     1266void OpcodeDim(char *Parameter,DWORD dwFlags){
    12421267    int i,i2,i3,IsStr=0;
    12431268    char temporary[8192];
     
    12611286            temporary[i2]=0;
    12621287
    1263             dim(temporary,dwFlag);
     1288            dim(temporary,dwFlags);
    12641289
    12651290            if(Parameter[i]=='\0') break;
     
    13221347        }
    13231348    }
    1324     else if(pRelativeVar->dwKind==VAR_REFLOCAL){
     1349    else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
    13251350        if(pRelativeVar->bOffsetOffset){
    13261351            //add r11,qword ptr[rsp+offset]
Note: See TracChangeset for help on using the changeset viewer.