Changeset 64 in dev for BasicCompiler_Common/Variable.cpp


Ignore:
Timestamp:
Mar 8, 2007, 2:49:34 AM (17 years ago)
Author:
dai_9181
Message:

すべてのオブジェクトを参照型に切り替えた。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Variable.cpp

    r63 r64  
    157157    else if(IsPtrType(type))        return PTR_SIZE;
    158158
    159     else if(type==DEF_OBJECT){
     159    else if( type == DEF_STRUCT ){
    160160        CClass *pobj_c;
    161161        pobj_c=(CClass *)lpIndex;
    162         if(!pobj_c) return 0;
     162        if(!pobj_c){
     163            SetError(300,NULL,cp);
     164            return 0;
     165        }
     166
    163167        return pobj_c->GetSize();
     168    }
     169
     170    else if(type==DEF_OBJECT){
     171        return PTR_SIZE;
    164172    }
    165173    else{
     
    232240    if(pobj_c){
    233241        *lpNum=(LONG_PTR)pobj_c;
    234         return DEF_OBJECT;
     242
     243        if( pobj_c->IsStructure() ){
     244            return DEF_STRUCT;
     245        }
     246        else{
     247            return DEF_OBJECT;
     248        }
    235249    }
    236250
     
    282296
    283297    //オブジェクト
    284     else if(type==DEF_OBJECT){
     298    else if(type==DEF_OBJECT || type==DEF_STRUCT){
    285299        if(lpIndex==0) lstrcpy(name,"non");
    286300        else{
     
    296310        else{
    297311            extern PROCPTRINFO *pProcPtrInfo;
    298             if(pProcPtrInfo[lpIndex].ReturnType==-1)
     312            if(pProcPtrInfo[lpIndex].ReturnType==DEF_NON)
    299313                lstrcpy(name,"*Sub");
    300314            else lstrcpy(name,"*Function");
     
    316330}
    317331
    318 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, int &RefType, char *member ){
     332bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ){
    319333    int p1 = 0, p2 = 0;
    320334
     
    323337        if( term[i] == '[' ){
    324338            i = JumpStringInBracket( term, i + 1 );
     339            if( term[i] == '\0' ) break;
    325340            continue;
    326341        }
     
    328343            int temp_p = i;
    329344            i = JumpStringInPare( term, i + 1 ) + 1;
     345            if( term[i] == '\0' ) break;
    330346            if( term[i] == '.'
    331347                || term[i] == 1 && term[i] == ESC_PSMEM ){
     
    348364    //参照タイプ
    349365    if( term[p2] == '.' ){
    350         RefType = DEF_OBJECT;
     366        refType = CClass::Dot;
    351367    }
    352368    else{
    353         RefType = DEF_PTR_OBJECT;
     369        refType = CClass::Pointer;
    354370        p2++;
    355371    }
     
    361377}
    362378
    363 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,int *pRefType){
     379BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,CClass::RefType &refType){
    364380    extern int cp;
    365381    int i,i2,i3;
     
    369385    array2[0]=0;
    370386    NestMember[0]=0;
    371     *pRefType=0;
    372387    for(i=0;;i++){
    373388        if(buffer[i]=='\"'){
     
    428443        if(buffer[i]=='.'){
    429444            lstrcpy(NestMember,buffer+i+1);
    430             *pRefType=DEF_OBJECT;
     445            refType = CClass::Dot;
    431446            buffer[i]=0;
    432447            break;
     
    434449        if(buffer[i]==1&&buffer[i+1]==ESC_PSMEM){
    435450            lstrcpy(NestMember,buffer+i+2);
    436             *pRefType=DEF_PTR_OBJECT;
     451            refType = CClass::Pointer;
    437452            buffer[i]=0;
    438453            break;
     
    614629    char lpPtrOffset[VN_SIZE];      //第2次配列
    615630    char NestMember[VN_SIZE];   //入れ子メンバ
    616     int object_type;            //"."参照のときは0、"->"参照のときは1
     631    CClass::RefType refType = CClass::Non;
    617632    lstrcpy(VarName,member);
    618     if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&object_type)) return 0;
     633    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0;
    619634
    620635    for(i=0;i<pobj_c->iMemberNum;i++){
     
    664679    }
    665680
    666     if(object_type){
     681    if( refType != CClass::Non ){
    667682        //入れ子構造の場合
    668683
     
    704719
    705720
    706     int RefType;
    707     if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){
     721    CClass::RefType refType;
     722    if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){
    708723        // 戻り値オブジェクトのメンバを直接参照しているとき
    709724        //例: func().member
     
    723738
    724739    lstrcpy(VarName,variable);
    725     GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
     740    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    726741
    727742    int *pSubScripts;
     
    825840        char tempMember[VN_SIZE];
    826841        char tempArray[VN_SIZE];
    827         GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i);
     842        {
     843            CClass::RefType refType;
     844            GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,refType);
     845        }
    828846
    829847        char temp2[VN_SIZE];
     
    897915
    898916    if(member[0]){
    899         if(NATURAL_TYPE(type)==DEF_OBJECT)
    900             return GetMemberType((CClass *)lpIndex,member,plpIndex,0,bError);
     917        if( NATURAL_TYPE(type)==DEF_OBJECT
     918            || NATURAL_TYPE(type)==DEF_STRUCT){
     919                return GetMemberType((CClass *)lpIndex,member,plpIndex,0,bError);
     920        }
    901921    }
    902922
     
    921941}
    922942
    923 BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     943BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){
    924944    //読み取り専用で変数へアクセス
    925945    return GetVarOffset(
     
    932952        pss);
    933953}
    934 BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     954BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){
    935955    //読み書き両用で変数へアクセス
    936956    return GetVarOffset(
     
    10951115    }
    10961116
     1117    /*
     1118    TODO: 消す
    10971119    if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' && isRef == false ){
    10981120        if( pTypeInfo->u.pobj_Class->GetCopyConstructorMethod() ){
     
    11011123            InitBuf[0] = 0;
    11021124        }
    1103     }
     1125    }*/
    11041126
    11051127    GetArrange(variable,VarName,SubScripts);
     
    11911213    lstrcpy(pVar->ConstractParameter,ConstractParameter);
    11921214
    1193     if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){
    1194         //初期バッファがあるとき
    1195         pVar->offset=AllInitGlobalVarSize;
    1196         AllInitGlobalVarSize+=VarSize;
    1197     }
    1198     else{
    1199         //初期バッファがないとき
    1200         pVar->offset=AllGlobalVarSize | 0x80000000;
    1201         AllGlobalVarSize+=VarSize;
    1202     }
    1203 
    12041215    //レキシカルスコープ
    12051216    pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     
    12101221    pVar->source_code_address=cp;
    12111222
    1212     //初期バッファにデータをセット
    1213     extern BYTE *initGlobalBuf;
    1214     initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
    1215         HEAP_ZERO_MEMORY,
    1216         initGlobalBuf,
    1217         AllInitGlobalVarSize);
     1223    //アラインメントを考慮
     1224    int alignment = 0;
     1225    if( pVar->type==DEF_STRUCT ){
     1226        alignment = pVar->u.pobj_c->iAlign;
     1227    }
     1228
     1229    if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){
     1230        //初期バッファがあるとき
     1231
     1232        if( alignment ){
     1233            if( AllInitGlobalVarSize % alignment ){
     1234                AllInitGlobalVarSize += alignment - (AllInitGlobalVarSize % alignment);
     1235            }
     1236        }
     1237
     1238        pVar->offset=AllInitGlobalVarSize;
     1239        AllInitGlobalVarSize+=VarSize;
     1240    }
     1241    else{
     1242        //初期バッファがないとき
     1243
     1244        if( alignment ){
     1245            if( AllGlobalVarSize % alignment ){
     1246                AllGlobalVarSize += alignment - (AllGlobalVarSize % alignment);
     1247            }
     1248        }
     1249
     1250        pVar->offset=AllGlobalVarSize | 0x80000000;
     1251        AllGlobalVarSize+=VarSize;
     1252    }
     1253
    12181254    if(InitBuf[0]){
    1219         if( pVar->type == DEF_OBJECT && InitBuf[0] != '[' ){
    1220             //単発式が初期値のオブジェクトの場合
    1221             //初期値をコピーコンストラクタに渡す
    1222 
    1223             if( isRef ){
    1224                 SetRefVariable( name, InitBuf );
    1225             }
    1226         }
    1227         else{
    1228             int result = SetInitGlobalData(pVar->offset,
     1255        int result = 0;
     1256        if( pVar->type != DEF_OBJECT ){
     1257            //初期バッファにデータをセット
     1258            extern BYTE *initGlobalBuf;
     1259            initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
     1260                HEAP_ZERO_MEMORY,
     1261                initGlobalBuf,
     1262                AllInitGlobalVarSize);
     1263
     1264            result = SetInitGlobalData(pVar->offset,
    12291265                pVar->type,
    12301266                pVar->u.index,
    12311267                pVar->SubScripts,
    12321268                InitBuf);
    1233 
    1234             if(!result){
    1235                 //動的な式だった場合は代入演算を行う
    1236 
    1237                 //初期代入時のみ、書き込みアクセスを許可する
    1238                 bool bConstBack = pVar->bConst;
    1239                 pVar->bConst = false;
    1240 
    1241                 //代入
    1242                 char temporary[8192];
    1243                 sprintf(temporary,"%s=%s",name,InitBuf);
    1244                 OpcodeCalc(temporary);
    1245 
    1246                 //アクセス制限を元に戻す
    1247                 pVar->bConst = bConstBack;
    1248             }
     1269        }
     1270
     1271        if(!result){
     1272            //動的な式だった場合は代入演算を行う
     1273
     1274            //初期代入時のみ、書き込みアクセスを許可する
     1275            bool bConstBack = pVar->bConst;
     1276            pVar->bConst = false;
     1277
     1278            //代入
     1279            char temporary[8192];
     1280            sprintf(temporary,"%s=%s",name,InitBuf);
     1281            OpcodeCalc(temporary);
     1282
     1283            //アクセス制限を元に戻す
     1284            pVar->bConst = bConstBack;
    12491285        }
    12501286    }
     
    12601296
    12611297/*
     1298    TODO: 消す
    12621299    if(pTypeInfo->type==DEF_OBJECT){
    12631300        //利用対象のクラスコンストラクタ、デストラクタに使用チェックをつける
Note: See TracChangeset for help on using the changeset viewer.