Changeset 40 in dev for BasicCompiler32/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
  • BasicCompiler32/Compile_Var.cpp

    r36 r40  
    179179    }
    180180
     181    CMember *pMember=pobj_c->ppobj_Member[i];
     182
    181183    //アクセシビリティをチェック
    182184    if(pobj_c==pobj_CompilingClass){
    183185        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    184         if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     186        if(pMember->dwAccess==ACCESS_NON){
    185187            if(isErrorEnabled) SetError(107,VarName,cp);
    186188            return 0;
     
    188190    }
    189191    else{
    190         if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
    191             pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     192        if((bPrivateAccess==0&&pMember->dwAccess==ACCESS_PRIVATE)||
     193            pMember->dwAccess==ACCESS_NON){
    192194            if(isErrorEnabled) SetError(107,VarName,cp);
    193195            return 0;
    194196        }
    195         else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
     197        else if(bPrivateAccess==0&&pMember->dwAccess==ACCESS_PROTECTED){
    196198            if(isErrorEnabled) SetError(108,VarName,cp);
    197199            return 0;
     
    201203    //Const定義の場合は書き込みアクセスを制限する
    202204    //※コンストラクタをコンパイル中の場合は例外的に許可する
    203     if( pobj_c->ppobj_Member[i]->IsConst() &&       //定数メンバである
     205    if( pMember->IsConst() &&       //定数メンバである
    204206        isWriteAccess &&                            //書き込みアクセスを要求されている
    205207        pobj_c->IsCompilingConstructor() == false   //コンストラクタ コンパイル中を除く
     
    209211    }
    210212
    211     *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
    212     *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
     213    *pType=pMember->TypeInfo.type;
     214    *plpNestIndex=pMember->TypeInfo.u.lpIndex;
    213215
    214216    //ポインタ変数の場合
    215217    if(IsPtrType(*pType)){
    216         if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
     218        if(pMember->SubScripts[0]==-1){
    217219            lstrcpy(lpPtrOffset,array);
    218220            array[0]=0;
     
    236238    if(array[0]){
    237239        //配列オフセット
    238         if(!GetArrayOffset(pobj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex))
     240        if(!GetArrayOffset(pMember->SubScripts,array,*pType,pMember->TypeInfo.u.lpIndex))
    239241            if(isErrorEnabled) SetError(14,member,cp);
    240242    }
    241     else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
     243    else if(pMember->SubScripts[0]!=-1){
    242244        *pType|=FLAG_PTR;
    243245    }
     
    320322            isErrorEnabled,
    321323            isWriteAccess,
    322             pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
     324            pMember->TypeInfo.u.pobj_Class,
    323325            NestMember,
    324326            pType,
     
    357359}
    358360
    359 BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){
     361BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, const char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){
    360362    extern BOOL bCompilingGlobal;
    361363    int i,RefType;
     
    907909    ///////////////////////////////////////
    908910
    909     if( type == DEF_OBJECT){
    910         //オブジェクトの場合はありえない
    911         SetError(300,NULL,cp);
    912         return 0;
    913     }
    914 
    915911    if(SubScripts[0]!=-1){
    916912        SetError(41,0,cp);
     
    10641060}
    10651061
    1066 void dim(char *Parameter,DWORD dwFlag){
     1062void dim(char *Parameter,DWORD dwFlags){
    10671063    extern BOOL bCompilingGlobal;
    10681064    extern HANDLE hHeap;
     
    10711067
    10721068
    1073     if(dwFlag & DIMFLAG_CONST){
     1069    //参照型かどうか
     1070    bool isRef = false;
     1071
     1072    i2 = 0;
     1073
     1074    if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){
     1075        //参照型
     1076        isRef = true;
     1077        Parameter += 2;
     1078    }
     1079
     1080
     1081    if(dwFlags & DIMFLAG_CONST){
    10741082        //////////////////////////////////
    10751083        // 定数変数の場合を考慮
    10761084        //////////////////////////////////
    1077         for(i2=0;;i2++){
     1085        for(;;i2++){
    10781086            if(Parameter[i2] == '=' ||
    10791087                Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
     
    11021110    char InitBuf[8192];
    11031111    char ConstractParameter[VN_SIZE];
    1104     if(!GetDimentionFormat(Parameter,VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
     1112    if(!GetDimentionFormat(Parameter, isRef, VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
    11051113        return;
    11061114
     
    11231131    TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    11241132
    1125     if(dwFlag&DIMFLAG_STATIC){
     1133    if(dwFlags&DIMFLAG_STATIC){
    11261134        if(bCompilingGlobal){
    11271135            SetError(60,NULL,cp);
     
    11371145        GetNowStaticVarFullName(VarName,temporary);
    11381146
    1139         AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
     1147        AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11401148
    11411149        /*
     
    11501158            /////////////////////////
    11511159
    1152             AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
     1160            AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11531161        }
    11541162        else{
     
    11681176
    11691177            LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
     1178            VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
     1179            MaxLocalVarNum++;
     1180
     1181            if( isRef ){
     1182                //参照型
     1183                pVar->fRef = REF_VARIABLE;
     1184                TypeSize = PTR_SIZE;
     1185            }
     1186            else pVar->fRef=0;
    11701187
    11711188            for(i2=1,i3=0;i3<255;i3++){
    11721189                //配列要素数
    1173                 LocalVar[MaxLocalVarNum].SubScripts[i3]=SubScripts[i3];
     1190                pVar->SubScripts[i3]=SubScripts[i3];
    11741191
    11751192                if(SubScripts[i3]==-1) break;
     
    11791196            if(VarSize%4) VarSize+=4-(VarSize%4);
    11801197
    1181             VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
    1182 
    1183             MaxLocalVarNum++;
    1184 
    11851198            //変数データを追加
    11861199            lstrcpy(pVar->name,VarName);
    1187             pVar->fRef=0;
    1188             if(dwFlag & DIMFLAG_CONST) pVar->bConst = true;
     1200            if(dwFlags & DIMFLAG_CONST) pVar->bConst = true;
    11891201            else pVar->bConst = false;
    11901202            if(SubScripts[0]==-1) pVar->bArray=0;
     
    12121224
    12131225                if(!result){
    1214                     //動的な式だった場合は代入演算を行う
    1215                     char temporary[8192];
    1216                     sprintf(temporary,"%s=%s",VarName,InitBuf);
    1217                     OpcodeCalc(temporary);
     1226                    if( isRef ){
     1227                        SetRefVariable( VarName, InitBuf );
     1228                    }
     1229                    else{
     1230                        char temporary[8192];
     1231                        sprintf(temporary,"%s=%s",VarName,InitBuf);
     1232                        OpcodeCalc(temporary);
     1233                    }
    12181234                }
    12191235
     
    12521268
    12531269        //コンストラクタ呼び出し
    1254         if(TypeInfo.type==DEF_OBJECT&&(dwFlag&DIMFLAG_NONCALL_CONSTRACTOR)==0){
     1270        if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){
    12551271            CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter);
    12561272        }
     
    12641280    }
    12651281}
    1266 void OpcodeDim(char *Parameter,DWORD dwFlag){
     1282void OpcodeDim(char *Parameter,DWORD dwFlags){
    12671283    int i,i2,i3,IsStr=0;
    12681284    char temporary[8192];
     
    12861302            temporary[i2]=0;
    12871303
    1288             dim(temporary,dwFlag);
     1304            dim(temporary,dwFlags);
    12891305
    12901306            if(Parameter[i]=='\0') break;
Note: See TracChangeset for help on using the changeset viewer.