Ignore:
Timestamp:
Jul 12, 2007, 2:58:26 AM (17 years ago)
Author:
dai_9181
Message:

コード全体のリファクタリングを実施

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r193 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24#include <jenga/include/smoothie/LexicalAnalysis.h>
     
    57#include <CodeGenerator.h>
    68#include <Compiler.h>
    7 #include <VariableImpl.h>
     9#include <Variable.h>
    810
    911#include "../BasicCompiler_Common/common.h"
     
    1113
    1214//変数
    13 Variables globalVars;
     15// TODO: xml未完成
    1416int AllGlobalVarSize;
    1517int AllInitGlobalVarSize;
     
    6466    }
    6567}
    66 bool GetArrayOffset(const int *SubScripts,char *array, const Type &type){
     68bool GetArrayOffset(const Subscripts &subscripts,char *array, const Type &type){
    6769    extern HANDLE hHeap;
    6870    int i,i2,i3,i4;
     
    8385        }
    8486        if(array[i]==','||array[i]=='\0'){
    85             if(SubScripts[i3]==-1){
     87            if( i3 >= (int)subscripts.size() )
     88            {
    8689                for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
    8790                return 0;
     
    9699
    97100            if(array[i]=='\0'){
    98                 if(SubScripts[i3]!=-1){
     101                if( i3 < (int)subscripts.size() )
     102                {
    99103                    for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
    100104                    return 0;
     
    131135        op_pop(REG_EAX);
    132136
    133         for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
     137        for(i2=i+1,i4=1;i2<i3;i2++) i4*=subscripts[i2]+1;
    134138
    135139        //imul eax,i4
     
    175179    char lpPtrOffset[VN_SIZE];  //第2次配列
    176180    char NestMember[VN_SIZE];   //入れ子メンバ
    177     CClass::RefType refType;
     181    ReferenceKind refType;
    178182    lstrcpy(VarName,member);
    179183    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
     
    195199
    196200    //アクセシビリティをチェック
    197     if(&objClass==Smoothie::Temp::pCompilingClass){
     201    if(&objClass==compiler.pCompilingClass){
    198202        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    199203        if(pMember->IsNoneAccess()){
     
    228232    //ポインタ変数の場合
    229233    if( resultType.IsPointer() ){
    230         if(pMember->SubScripts[0]==-1){
     234        if( pMember->GetSubscripts().size() == 0 ){
    231235            lstrcpy(lpPtrOffset,array);
    232236            array[0]=0;
     
    250254    if(array[0]){
    251255        //配列オフセット
    252         if(!GetArrayOffset(pMember->SubScripts,array,pMember->GetType())){
     256        if(!GetArrayOffset(pMember->GetSubscripts(),array,pMember->GetType())){
    253257            if(isErrorEnabled) SetError(14,member,cp);
    254258        }
    255259    }
    256     else if(pMember->SubScripts[0]!=-1){
     260    else if( pMember->GetSubscripts().size() > 0 ){
    257261        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    258262    }
     
    262266
    263267        if( resultType.IsObject() || resultType.IsStruct() ){
    264             if( refType != CClass::Dot ){
     268            if( refType != RefDot ){
    265269                if(isErrorEnabled) SetError(104,member,cp);
    266270                return false;
     
    278282                //pObj[n].member
    279283                if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() )
    280                     && refType != CClass::Dot ){
     284                    && refType != RefDot ){
    281285                        if(isErrorEnabled) SetError(104,member,cp);
    282286                        return false;
     
    292296                //pObj->member
    293297                if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() )
    294                     && refType != CClass::Pointer ){
     298                    && refType != RefPointer ){
    295299                        if(isErrorEnabled) SetError(104,member,cp);
    296300                        return false;
     
    306310            if(lpPtrOffset[0]){
    307311                //ppObj[n]->member
    308                 if( refType != CClass::Pointer ){
     312                if( refType != RefPointer ){
    309313                    if(isErrorEnabled) SetError(104,member,cp);
    310314                    return false;
     
    357361}
    358362
    359 bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss){
     363bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts ){
    360364    char variable[VN_SIZE];
    361365
     
    371375
    372376    // 先頭オブジェクトまたはクラス名と入れ子メンバに分割
    373     CClass::RefType refType;
     377    ReferenceKind refType;
    374378    char member[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    375379    GetVarFormatString(simpleName,array,lpPtrOffset,member,refType);
     
    384388    }
    385389
    386     const int *pSubScripts;
     390    const Subscripts *pSubscripts;
    387391    bool bConst = false;
    388392
     
    393397        //////////////////
    394398
    395         const Variable *pVar = UserProc::CompilingUserProc().localVars.BackSearch( Symbol( VarName ) );
     399        const Variable *pVar = UserProc::CompilingUserProc().GetLocalVars().BackSearch( Symbol( VarName ) );
    396400        if( pVar ){
    397401            //ポインタ変数の場合
    398             if( pVar->IsPointer() ){
     402            if( pVar->GetType().IsPointer() ){
    399403                if( !pVar->IsArray() ){
    400404                    lstrcpy(lpPtrOffset,array);
     
    410414            }
    411415
    412             pRelativeVar->offset=-pVar->offset;
     416            pRelativeVar->offset=-pVar->GetOffsetAddress();
    413417            pRelativeVar->bOffsetOffset=0;
    414418            if( pVar->IsRef() ){
     
    417421            }
    418422            else pRelativeVar->dwKind=VAR_LOCAL;
    419             resultType = *pVar;
    420             pSubScripts=pVar->GetSubScriptsPtr();
     423            resultType = pVar->GetType();
     424            pSubscripts = &pVar->GetSubscripts();
    421425            bConst = pVar->IsConst();
    422426
     
    425429    }
    426430
    427     if(Smoothie::Temp::pCompilingClass){
     431    if(compiler.pCompilingClass){
    428432        //////////////////////
    429433        // クラスメンバの参照
     
    438442            pRelativeVar->dwKind=VAR_DIRECTMEM;
    439443
    440             resultType.SetType( DEF_OBJECT, Smoothie::Temp::pCompilingClass );
     444            resultType.SetType( DEF_OBJECT, compiler.pCompilingClass );
    441445            return true;
    442446        }
     
    451455
    452456            bool isFound = false;
    453             BOOST_FOREACH( CMember *pMember, Smoothie::Temp::pCompilingClass->GetDynamicMembers() ){
     457            BOOST_FOREACH( CMember *pMember, compiler.pCompilingClass->GetDynamicMembers() ){
    454458                if( pMember->GetName() == VarName ){
    455459                    isFound = true;
     
    465469        if( isWriteAccess &&
    466470            pMethod->IsConst() &&
    467             Smoothie::Temp::pCompilingClass->IsCompilingConstructor() == false &&
    468             Smoothie::Temp::pCompilingClass->IsCompilingDestructor() == false
     471            compiler.pCompilingClass->IsCompilingConstructor() == false &&
     472            compiler.pCompilingClass->IsCompilingDestructor() == false
    469473            ){
    470474                SetError(131, NULL, cp );
     
    481485            isErrorEnabled,
    482486            isWriteAccess,
    483             *Smoothie::Temp::pCompilingClass,
     487            *compiler.pCompilingClass,
    484488            variable,
    485489            pRelativeVar,
     
    502506            GetNowStaticVarFullName(VarName,temporary);
    503507
    504             pVar = globalVars.Find( Symbol( temporary ) );
     508            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temporary ) );
    505509            if( pVar ){
    506510                goto GlobalOk;
     
    521525            char tempArray[VN_SIZE];
    522526            {
    523                 CClass::RefType refType;
     527                ReferenceKind refType;
    524528                GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
    525529            }
     
    533537            char temp2[VN_SIZE];
    534538            sprintf(temp2,"%s.%s",VarName,temporary);
    535             pVar = globalVars.Find( Symbol( temp2 ) );
     539            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temp2 ) );
    536540            if( pVar ){
    537541                lstrcpy(member,tempMember);
     
    541545        }
    542546
    543         if(Smoothie::Temp::pCompilingClass){
     547        if(compiler.pCompilingClass){
    544548            //自身のクラスから静的メンバを参照する場合
    545549            char temp2[VN_SIZE];
    546             sprintf(temp2,"%s.%s",Smoothie::Temp::pCompilingClass->GetName().c_str(),VarName);
    547             pVar = globalVars.Find( Symbol( temp2 ) );
     550            sprintf(temp2,"%s.%s",compiler.pCompilingClass->GetName().c_str(),VarName);
     551            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temp2 ) );
    548552            if( pVar ){
    549553                goto GlobalOk;
     
    555559        /////////////////////
    556560
    557         pVar = globalVars.BackSearch( Symbol( VarName ) );
     561        pVar = compiler.GetMeta().GetGlobalVars().BackSearch( Symbol( VarName ) );
    558562        if( pVar ){
    559563            goto GlobalOk;
     
    568572GlobalOk:
    569573        //ポインタ変数の場合
    570         if( pVar->IsPointer() ){
     574        if( pVar->GetType().IsPointer() ){
    571575            if( !pVar->IsArray() ){
    572576                lstrcpy(lpPtrOffset,array);
     
    582586        }
    583587
    584         pRelativeVar->offset=pVar->offset;
     588        pRelativeVar->offset=pVar->GetOffsetAddress();
    585589        pRelativeVar->bOffsetOffset=0;
    586590        if( pVar->IsRef() ){
     
    589593        }
    590594        else pRelativeVar->dwKind=VAR_GLOBAL;
    591         resultType = *pVar;
    592         pSubScripts=pVar->GetSubScriptsPtr();
     595        resultType = pVar->GetType();
     596        pSubscripts=&pVar->GetSubscripts();
    593597        bConst = pVar->IsConst();
    594598    }
     
    610614    }
    611615
    612     if(array[0]==0&&pSubScripts[0]!=-1){
     616    if( array[0] == 0 && pSubscripts->size() > 0 ){
    613617        //配列の先頭ポインタを示す場合
    614618        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    615         if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
     619
     620        if( pResultSubscripts )
     621        {
     622            (*pResultSubscripts) = *pSubscripts;
     623        }
    616624        return true;
    617625    }
     
    625633    }
    626634    if(array[0]){
    627         if(!GetArrayOffset(pSubScripts,array,resultType)){
     635        if(!GetArrayOffset(*pSubscripts,array,resultType)){
    628636            SetError(14,variable,cp);
    629637            pRelativeVar->dwKind=NON_VAR;
     
    634642        if( resultType.IsObject() || resultType.IsStruct() ){
    635643            //実態オブジェクトのメンバを参照(obj.member)
    636             if( refType != CClass::Dot ){
     644            if( refType != RefDot ){
    637645                SetError(104,VarName,cp);
    638646                pRelativeVar->dwKind=NON_VAR;
     
    649657            if(lpPtrOffset[0]){
    650658                //pObj[n].member
    651                 if( refType != CClass::Dot ){
     659                if( refType != RefDot ){
    652660                    SetError(104,VarName,cp);
    653661                    pRelativeVar->dwKind=NON_VAR;
     
    659667            else{
    660668                //pObj->member
    661                 if( refType != CClass::Pointer ){
     669                if( refType != RefPointer ){
    662670                    SetError(104,VarName,cp);
    663671                    pRelativeVar->dwKind=NON_VAR;
     
    677685            if(lpPtrOffset[0]){
    678686                //ppObj[n]->member
    679                 if( refType != CClass::Pointer ){
     687                if( refType != RefPointer ){
    680688                    SetError(104,VarName,cp);
    681689                    pRelativeVar->dwKind=NON_VAR;
     
    722730}
    723731
    724 bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,const char *lpszInitBuf){
     732bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
    725733    extern BYTE *initGlobalBuf;
    726734    int i2,i3;
     
    735743        int typeSize = type.GetSize();
    736744
    737         if(SubScripts[0]!=-1){
    738             typeSize*=JumpSubScripts(SubScripts+1);
    739             int i=0;
    740             i2=0;
    741             while(1){
    742                 if(SubScripts[0]<i2){
    743                     SetError(41,0,cp);
    744                     return 0;
    745                 }
    746                 i=GetOneParameter(InitBuf,i,temporary);
    747                 if(!SetInitGlobalData(
    748                     offset+i2*typeSize,
    749                     type,
    750                     SubScripts+1,
    751                     temporary)) return false;
    752                 i2++;
    753                 if(InitBuf[i]=='\0') break;
     745        if( subscripts.size() > 0 ){
     746            Subscripts nestSubscripts;
     747            for( int i=1; i<(int)subscripts.size(); i++ )
     748            {
     749                nestSubscripts.push_back( subscripts[i] );
     750            }
     751
     752            typeSize*=JumpSubScripts( nestSubscripts );
     753            {
     754                int i=0;
     755                i2=0;
     756                while(1){
     757                    if( subscripts[0] < i2 ){
     758                        SetError(41,0,cp);
     759                        return 0;
     760                    }
     761                    i=GetOneParameter(InitBuf,i,temporary);
     762                    if(!SetInitGlobalData(
     763                        offset+i2*typeSize,
     764                        type,
     765                        nestSubscripts,
     766                        temporary)) return false;
     767                    i2++;
     768                    if(InitBuf[i]=='\0') break;
     769                }
    754770            }
    755771            return true;
     
    772788                if(!SetInitGlobalData(offset+i3,
    773789                    pMember->GetType(),
    774                     pMember->SubScripts,
     790                    pMember->GetSubscripts(),
    775791                    temporary)) return false;
    776792            }
     
    793809    }
    794810
    795     if(SubScripts[0]!=-1){
     811    if( subscripts.size() > 0 ){
    796812        SetError(41,0,cp);
    797813        return false;
     
    861877    return true;
    862878}
    863 bool InitLocalVar(int offset,const Type &type,const int *SubScripts,const char *lpszInitBuf){
    864     int i,i2,i3;
     879bool InitLocalVar(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
     880    int i2,i3;
    865881    char temporary[VN_SIZE];
    866882    char InitBuf[VN_SIZE];
     
    873889        int typeSize = type.GetSize();
    874890
    875         if(SubScripts[0]!=-1){
    876             typeSize*=JumpSubScripts(SubScripts+1);
    877             i=0;
    878             i2=0;
    879             while(1){
    880                 if(SubScripts[0]<i2){
    881                     SetError(41,0,cp);
    882                     return false;
    883                 }
    884                 i=GetOneParameter(InitBuf,i,temporary);
    885                 if(!InitLocalVar(
    886                     offset+i2*typeSize,
    887                     type,
    888                     SubScripts+1,
    889                     temporary)) return false;
    890                 i2++;
    891                 if(InitBuf[i]=='\0') break;
     891        if( subscripts.size() > 0 ){
     892            Subscripts nestSubscripts;
     893            for( int i=1; i<(int)subscripts.size(); i++ )
     894            {
     895                nestSubscripts.push_back( subscripts[i] );
     896            }
     897
     898            typeSize*=JumpSubScripts( nestSubscripts );
     899            {
     900                int i=0;
     901                i2=0;
     902                while(1){
     903                    if( subscripts[0] < i2 ){
     904                        SetError(41,0,cp);
     905                        return 0;
     906                    }
     907                    i=GetOneParameter(InitBuf,i,temporary);
     908                    if(!InitLocalVar(
     909                        offset+i2*typeSize,
     910                        type,
     911                        nestSubscripts,
     912                        temporary)) return false;
     913                    i2++;
     914                    if(InitBuf[i]=='\0') break;
     915                }
    892916            }
    893917            return true;
     
    910934                if(!InitLocalVar(offset+i3,
    911935                    pMember->GetType(),
    912                     pMember->SubScripts,
     936                    pMember->GetSubscripts(),
    913937                    temporary)) return false;
    914938
     
    927951    ///////////////////////////////////////
    928952
    929     if(SubScripts[0]!=-1){
     953    if( subscripts.size() > 0 ){
    930954        SetError(41,0,cp);
    931955        return false;
     
    10751099}
    10761100
    1077 void dim( char *VarName,int *SubScripts,Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){
     1101void dim( char *VarName, const Subscripts &subscripts, Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){
    10781102    if( UserProc::IsGlobalAreaCompiling() ){
    10791103        /////////////////////////
     
    10811105        /////////////////////////
    10821106
    1083         AddGlobalVariable(VarName,SubScripts,type,InitBuf,ConstractParameter,dwFlags);
     1107        AddGlobalVariable(VarName,subscripts,type,InitBuf,ConstractParameter,dwFlags);
    10841108    }
    10851109    else{
     
    10881112        /////////////////
    10891113
    1090         if( UserProc::CompilingUserProc().localVars.DuplicateCheck( Symbol( VarName ) ) ){
     1114        if( UserProc::CompilingUserProc().GetLocalVars().DuplicateCheck( Symbol( VarName ) ) ){
    10911115            //2重定義のエラー
    10921116            SetError(15,VarName,cp);
     
    10961120        bool isConst = ( dwFlags & DIMFLAG_CONST ) ? true:false;
    10971121
    1098         Variable *pVar = new VariableImpl( VarName, type, isConst );
    1099 
    1100         if( SubScripts[0] != -1 ){
     1122        Variable *pVar = new Variable( VarName, type, isConst, false, ConstractParameter );
     1123
     1124        if( subscripts.size() > 0 ){
    11011125            //配列あり
    1102             pVar->SetArray( SubScripts );
    1103         }
    1104 
    1105         //コンストラクタ用パラメータ
    1106         pVar->paramStrForConstructor = ConstractParameter;
     1126            pVar->SetArray( subscripts );
     1127        }
    11071128
    11081129        //レキシカルスコープ
    1109         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    1110         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     1130        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     1131        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    11111132        pVar->bLiving=TRUE;
    11121133
     
    11151136
    11161137        // 変数を追加
    1117         UserProc::CompilingUserProc().localVars.push_back( pVar );
     1138        UserProc::CompilingUserProc().GetLocalVars().push_back( pVar );
    11181139
    11191140        //アラインメントを考慮
    1120         if( pVar->IsStruct() ){
    1121             int alignment = pVar->GetClass().iAlign;
     1141        if( pVar->GetType().IsStruct() ){
     1142            int alignment = pVar->GetType().GetClass().iAlign;
    11221143
    11231144            if( alignment ){
     
    11391160
    11401161        AllLocalVarSize += pVar->GetMemorySize();
    1141         pVar->offset = AllLocalVarSize;
     1162        pVar->SetOffsetAddress( AllLocalVarSize );
    11421163
    11431164        //レキシカルスコープ
    1144         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    1145         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     1165        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     1166        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    11461167        pVar->bLiving=TRUE;
    11471168
     
    11531174
    11541175            int result = 0;
    1155             if( !pVar->IsObject() ){
    1156                 result = InitLocalVar(-pVar->offset,
    1157                     *pVar,
    1158                     pVar->GetSubScriptsPtr(),
     1176            if( !pVar->GetType().IsObject() ){
     1177                result = InitLocalVar(-pVar->GetOffsetAddress(),
     1178                    pVar->GetType(),
     1179                    pVar->GetSubscripts(),
    11591180                    InitBuf);
    11601181            }
     
    11841205            //add eax,offset
    11851206            OpBuffer[obp++]=(char)0x05;
    1186             *((long *)(OpBuffer+obp))=-pVar->offset;
     1207            *((long *)(OpBuffer+obp))=-pVar->GetOffsetAddress();
    11871208            AddLocalVarAddrSchedule();
    11881209            obp+=sizeof(long);
     
    12041225    if( type.IsObject() &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
    12051226        char objectSize[255];
    1206         if( SubScripts[0] == -1 ){
     1227        if( subscripts.size() == 0 ){
    12071228            objectSize[0] = 0;
    12081229        }
    12091230        else{
    1210             if( SubScripts[1] != -1 ){
     1231            if( subscripts.size() > 1 ){
    12111232                SetError(300,NULL,cp);
    12121233            }
    1213             sprintf( objectSize, "%d", SubScripts[0] );
     1234            sprintf( objectSize, "%d", subscripts[0] );
    12141235        }
    12151236        Operator_New( type.GetClass(), objectSize, ConstractParameter, type );
     
    13231344
    13241345bool Compile_AddGlobalRootsForGc(){
    1325     UserProc *pUserProc_AddGlobalRootPtr = GetClassMethod( "_System_CGarbageCollection", "AddGlobalRootPtr" );
     1346    const UserProc *pUserProc_AddGlobalRootPtr = GetClassMethod( "_System_CGarbageCollection", "AddGlobalRootPtr" );
    13261347    if( !pUserProc_AddGlobalRootPtr ){
    13271348        SetError(3, "_System_CGarbageCollection.AddGlobalRootPtr", -1 );
     
    13291350    }
    13301351
    1331     BOOST_FOREACH( const Variable *pVar, globalVars ){
    1332         if( pVar->IsObject() || pVar->IsPointer() || pVar->IsStruct() ){
     1352    BOOST_FOREACH( const Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
     1353        if( pVar->GetType().IsObject() || pVar->GetType().IsPointer() || pVar->GetType().IsStruct() ){
    13331354            // オブジェクトまたはポインタだったとき
    13341355            // ※構造体も含む(暫定対応)
     
    13421363
    13431364            //mov eax,offset
    1344             op_mov_RV(REG_EAX,(int)pVar->offset);
     1365            op_mov_RV(REG_EAX,(int)pVar->GetOffsetAddress());
    13451366            obp-=sizeof(long);
    13461367            pobj_GlobalVarSchedule->add();
Note: See TracChangeset for help on using the changeset viewer.