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/BasicCompiler64/Compile_Var.cpp

    r198 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;
     
    8688    }
    8789}
    88 bool GetArrayOffset(const int *SubScripts,char *array, const Type &type){
     90bool GetArrayOffset(const Subscripts &subscripts,char *array, const Type &type){
    8991    extern HANDLE hHeap;
    9092    int i,i2,i3,i4;
     
    105107        }
    106108        if(array[i]==','||array[i]=='\0'){
    107             if(SubScripts[i3]==-1){
     109            if( i3 >= (int)subscripts.size() )
     110            {
    108111                for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
    109112                return false;
     
    118121
    119122            if(array[i]=='\0'){
    120                 if(SubScripts[i3]!=-1){
     123                if( i3 < (int)subscripts.size() )
     124                {
    121125                    for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
    122126                    return false;
     
    166170        pobj_sf->pop(REG_R12);
    167171
    168         for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
     172        for(i2=i+1,i4=1;i2<i3;i2++) i4*=subscripts[i2]+1;
    169173
    170174        //imul reg,i4
     
    204208    char lpPtrOffset[VN_SIZE];  //第2次配列
    205209    char NestMember[VN_SIZE];   //入れ子メンバ
    206     CClass::RefType refType;
     210    ReferenceKind refType;
    207211    lstrcpy(VarName,member);
    208212    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
     
    224228
    225229    //アクセシビリティをチェック
    226     if(&objClass==Smoothie::Temp::pCompilingClass){
     230    if(&objClass==compiler.pCompilingClass){
    227231        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    228232        if(pMember->IsNoneAccess()){
     
    257261    //ポインタ変数の場合
    258262    if( resultType.IsPointer() ){
    259         if(pMember->SubScripts[0]==-1){
     263        if( pMember->GetSubscripts().size() == 0 ){
    260264            lstrcpy(lpPtrOffset,array);
    261265            array[0]=0;
     
    280284    if(array[0]){
    281285        //配列オフセット
    282         if(!GetArrayOffset(pMember->SubScripts,array,pMember->GetType())){
     286        if(!GetArrayOffset(pMember->GetSubscripts(),array,pMember->GetType())){
    283287            if(isErrorEnabled) SetError(14,member,cp);
    284288        }
    285289    }
    286     else if(pMember->SubScripts[0]!=-1){
     290    else if( pMember->GetSubscripts().size() > 0 ){
    287291        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    288292    }
     
    292296
    293297        if( resultType.IsObject() || resultType.IsStruct() ){
    294             if( refType != CClass::Dot ){
     298            if( refType != RefDot ){
    295299                if(isErrorEnabled) SetError(104,member,cp);
    296300                return false;
     
    308312                //pObj[n].member
    309313                if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() )
    310                     && refType != CClass::Dot ){
     314                    && refType != RefDot ){
    311315                        if(isErrorEnabled) SetError(104,member,cp);
    312316                        return false;
     
    322326                //pObj->member
    323327                if( (resultType.IsObjectPtr() || resultType.IsStructPtr() )
    324                     && refType != CClass::Pointer ){
     328                    && refType != RefPointer ){
    325329                        if(isErrorEnabled) SetError(104,member,cp);
    326330                        return false;
     
    336340            if(lpPtrOffset[0]){
    337341                //ppObj[n]->member
    338                 if( refType != CClass::Pointer ){
     342                if( refType != RefPointer ){
    339343                    if(isErrorEnabled) SetError(104,member,cp);
    340344                    return false;
     
    385389    SetReg_WholeVariable(DEF_PTR_VOID,&RelativeVar,reg);
    386390}
    387 bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss){
     391bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts ){
    388392    char variable[VN_SIZE];
    389393
     
    399403
    400404    // 先頭オブジェクトまたはクラス名と入れ子メンバに分割
    401     CClass::RefType refType;
     405    ReferenceKind refType;
    402406    char member[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    403407    GetVarFormatString(simpleName,array,lpPtrOffset,member,refType);
     
    412416    }
    413417
    414     const int *pSubScripts;
     418    const Subscripts *pSubscripts;
    415419    bool bConst = false;
    416420
     
    421425        //////////////////
    422426
    423         const Variable *pVar = UserProc::CompilingUserProc().localVars.BackSearch( VarName );
     427        const Variable *pVar = UserProc::CompilingUserProc().GetLocalVars().BackSearch( Symbol( VarName ) );
    424428        if( pVar ){
    425429            //ポインタ変数の場合
    426             if( pVar->IsPointer() ){
     430            if( pVar->GetType().IsPointer() ){
    427431                if( !pVar->IsArray() ){
    428432                    lstrcpy(lpPtrOffset,array);
     
    438442            }
    439443
    440             pRelativeVar->offset=-pVar->offset;
     444            pRelativeVar->offset=-pVar->GetOffsetAddress();
    441445            pRelativeVar->bOffsetOffset=0;
    442446            if( pVar->IsRef() ){
     
    445449            }
    446450            else pRelativeVar->dwKind=VAR_LOCAL;
    447             resultType = *pVar;
    448             pSubScripts=pVar->GetSubScriptsPtr();
     451            resultType = pVar->GetType();
     452            pSubscripts = &pVar->GetSubscripts();
    449453            bConst = pVar->IsConst();
    450454
     
    454458
    455459
    456     if(Smoothie::Temp::pCompilingClass){
     460    if(compiler.pCompilingClass){
    457461        //////////////////////
    458462        // クラスメンバの参照
     
    465469            pRelativeVar->dwKind=VAR_DIRECTMEM;
    466470
    467             resultType.SetType( DEF_OBJECT, Smoothie::Temp::pCompilingClass );
     471            resultType.SetType( DEF_OBJECT, compiler.pCompilingClass );
    468472            return true;
    469473        }
     
    478482
    479483            bool isFound = false;
    480             BOOST_FOREACH( CMember *pMember, Smoothie::Temp::pCompilingClass->GetDynamicMembers() ){
     484            BOOST_FOREACH( CMember *pMember, compiler.pCompilingClass->GetDynamicMembers() ){
    481485                if( pMember->GetName() == VarName ){
    482486                    isFound = true;
     
    492496        if( isWriteAccess &&
    493497            pMethod->IsConst() &&
    494             Smoothie::Temp::pCompilingClass->IsCompilingConstructor() == false &&
    495             Smoothie::Temp::pCompilingClass->IsCompilingDestructor() == false
     498            compiler.pCompilingClass->IsCompilingConstructor() == false &&
     499            compiler.pCompilingClass->IsCompilingDestructor() == false
    496500            ){
    497501                SetError(131, NULL, cp );
     
    505509            isErrorEnabled,
    506510            isWriteAccess,
    507             *Smoothie::Temp::pCompilingClass,
     511            *compiler.pCompilingClass,
    508512            variable,
    509513            pRelativeVar,
     
    526530            GetNowStaticVarFullName(VarName,temporary);
    527531
    528             pVar = globalVars.Find( temporary );
     532            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temporary ) );
    529533            if( pVar ){
    530534                goto GlobalOk;
     
    545549            char tempArray[VN_SIZE];
    546550            {
    547                 CClass::RefType refType;
     551                ReferenceKind refType;
    548552                GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
    549553            }
     
    557561            char temp2[VN_SIZE];
    558562            sprintf(temp2,"%s.%s",VarName,temporary);
    559             pVar = globalVars.Find( temp2 );
     563            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temp2 ) );
    560564            if( pVar ){
    561565                lstrcpy(member,tempMember);
     
    565569        }
    566570
    567         if(Smoothie::Temp::pCompilingClass){
     571        if(compiler.pCompilingClass){
    568572            //自身のクラスから静的メンバを参照する場合
    569573            char temp2[VN_SIZE];
    570             sprintf(temp2,"%s.%s",Smoothie::Temp::pCompilingClass->GetName().c_str(),VarName);
    571             pVar = globalVars.Find( temp2 );
     574            sprintf(temp2,"%s.%s",compiler.pCompilingClass->GetName().c_str(),VarName);
     575            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temp2 ) );
    572576            if( pVar ){
    573577                goto GlobalOk;
     
    579583        /////////////////////
    580584
    581         pVar = globalVars.BackSearch( VarName );
     585        pVar = compiler.GetMeta().GetGlobalVars().BackSearch( Symbol( VarName ) );
    582586        if( pVar ){
    583587            goto GlobalOk;
     
    592596GlobalOk:
    593597        //ポインタ変数の場合
    594         if( pVar->IsPointer() ){
     598        if( pVar->GetType().IsPointer() ){
    595599            if( !pVar->IsArray() ){
    596600                lstrcpy(lpPtrOffset,array);
     
    606610        }
    607611
    608         pRelativeVar->offset=pVar->offset;
     612        pRelativeVar->offset=pVar->GetOffsetAddress();
    609613        pRelativeVar->bOffsetOffset=0;
    610614        if( pVar->IsRef() ){
     
    613617        }
    614618        else pRelativeVar->dwKind=VAR_GLOBAL;
    615         resultType = *pVar;
    616         pSubScripts=pVar->GetSubScriptsPtr();
     619        resultType = pVar->GetType();
     620        pSubscripts=&pVar->GetSubscripts();
    617621        bConst = pVar->IsConst();
    618622    }
     
    634638    }
    635639
    636     if(array[0]==0&&pSubScripts[0]!=-1){
     640    if( array[0] == 0 && pSubscripts->size() > 0 ){
    637641        //配列の先頭ポインタを示す場合
    638642        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    639         if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
     643
     644        if( pResultSubscripts )
     645        {
     646            (*pResultSubscripts) = *pSubscripts;
     647        }
    640648        return true;
    641649    }
     
    649657    }
    650658    if(array[0]){
    651         if(!GetArrayOffset(pSubScripts,array,resultType)){
     659        if(!GetArrayOffset(*pSubscripts,array,resultType)){
    652660            SetError(14,variable,cp);
    653661            pRelativeVar->dwKind=NON_VAR;
     
    658666        if( resultType.IsObject() || resultType.IsStruct() ){
    659667            //実態オブジェクトのメンバを参照(obj.member)
    660             if( refType != CClass::Dot ){
     668            if( refType != RefDot ){
    661669                SetError(104,VarName,cp);
    662670                pRelativeVar->dwKind=NON_VAR;
     
    673681            if(lpPtrOffset[0]){
    674682                //pObj[n].member
    675                 if( refType != CClass::Dot ){
     683                if( refType != RefDot ){
    676684                    SetError(104,VarName,cp);
    677685                    pRelativeVar->dwKind=NON_VAR;
     
    683691            else{
    684692                //pObj->member
    685                 if( refType != CClass::Pointer ){
     693                if( refType != RefPointer ){
    686694                    SetError(104,VarName,cp);
    687695                    pRelativeVar->dwKind=NON_VAR;
     
    700708            if(lpPtrOffset[0]){
    701709                //ppObj[n]->member
    702                 if( refType != CClass::Pointer ){
     710                if( refType != RefPointer ){
    703711                    SetError(104,VarName,cp);
    704712                    pRelativeVar->dwKind=NON_VAR;
     
    744752}
    745753
    746 bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,const char *lpszInitBuf){
     754bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
    747755    extern BYTE *initGlobalBuf;
    748     int i,i2,i3;
     756    int i2,i3;
    749757    char temporary[VN_SIZE];
    750758    char InitBuf[VN_SIZE];
     
    757765        int typeSize = type.GetSize();
    758766
    759         if(SubScripts[0]!=-1){
    760             typeSize*=JumpSubScripts(SubScripts+1);
    761             i=0;
    762             i2=0;
    763             while(1){
    764                 if(SubScripts[0]<i2){
    765                     SetError(41,0,cp);
    766                     return 0;
    767                 }
    768                 i=GetOneParameter(InitBuf,i,temporary);
    769                 if(!SetInitGlobalData(
    770                     offset+i2*typeSize,
    771                     type,
    772                     SubScripts+1,
    773                     temporary)) return false;
    774                 i2++;
    775                 if(InitBuf[i]=='\0') break;
     767        if( subscripts.size() > 0 ){
     768            Subscripts nestSubscripts;
     769            for( int i=1; i<(int)subscripts.size(); i++ )
     770            {
     771                nestSubscripts.push_back( subscripts[i] );
     772            }
     773
     774            typeSize*=JumpSubScripts( nestSubscripts );
     775            {
     776                int i=0;
     777                i2=0;
     778                while(1){
     779                    if( subscripts[0] < i2 ){
     780                        SetError(41,0,cp);
     781                        return 0;
     782                    }
     783                    i=GetOneParameter(InitBuf,i,temporary);
     784                    if(!SetInitGlobalData(
     785                        offset+i2*typeSize,
     786                        type,
     787                        nestSubscripts,
     788                        temporary)) return false;
     789                    i2++;
     790                    if(InitBuf[i]=='\0') break;
     791                }
    776792            }
    777793            return true;
     
    794810                if(!SetInitGlobalData(offset+i3,
    795811                    pMember->GetType(),
    796                     pMember->SubScripts,
     812                    pMember->GetSubscripts(),
    797813                    temporary)) return false;
    798814            }
     
    815831    }
    816832
    817     if(SubScripts[0]!=-1){
     833    if( subscripts.size() > 0 ){
    818834        SetError(41,0,cp);
    819835        return false;
     
    883899    return true;
    884900}
    885 bool InitLocalVar(int offset,const Type &type,const int *SubScripts,const char *lpszInitBuf){
    886     int i,i2,i3;
     901bool InitLocalVar(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
     902    int i2,i3;
    887903    char temporary[VN_SIZE];
    888904    char InitBuf[VN_SIZE];
     
    895911        int typeSize = type.GetSize();
    896912
    897         if(SubScripts[0]!=-1){
    898             typeSize*=JumpSubScripts(SubScripts+1);
    899             i=0;
    900             i2=0;
    901             while(1){
    902                 if(SubScripts[0]<i2){
    903                     SetError(41,0,cp);
    904                     return false;
    905                 }
    906                 i=GetOneParameter(InitBuf,i,temporary);
    907                 if(!InitLocalVar(
    908                     offset+i2*typeSize,
    909                     type,
    910                     SubScripts+1,
    911                     temporary)) return false;
    912                 i2++;
    913                 if(InitBuf[i]=='\0') break;
     913        if( subscripts.size() > 0 ){
     914            Subscripts nestSubscripts;
     915            for( int i=1; i<(int)subscripts.size(); i++ )
     916            {
     917                nestSubscripts.push_back( subscripts[i] );
     918            }
     919
     920            typeSize*=JumpSubScripts( nestSubscripts );
     921            {
     922                int i=0;
     923                i2=0;
     924                while(1){
     925                    if( subscripts[0] < i2 ){
     926                        SetError(41,0,cp);
     927                        return 0;
     928                    }
     929                    i=GetOneParameter(InitBuf,i,temporary);
     930                    if(!InitLocalVar(
     931                        offset+i2*typeSize,
     932                        type,
     933                        nestSubscripts,
     934                        temporary)) return false;
     935                    i2++;
     936                    if(InitBuf[i]=='\0') break;
     937                }
    914938            }
    915939            return true;
     
    932956                if(!InitLocalVar(offset+i3,
    933957                    pMember->GetType(),
    934                     pMember->SubScripts,
     958                    pMember->GetSubscripts(),
    935959                    temporary)) return false;
    936960
     
    949973    ///////////////////////////////////////
    950974
    951     if(SubScripts[0]!=-1){
     975    if( subscripts.size() > 0 ){
    952976        SetError(41,0,cp);
    953977        return false;
     
    10611085}
    10621086
    1063 void dim( char *VarName,int *SubScripts,Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){
     1087void dim( char *VarName, const Subscripts &subscripts, Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){
    10641088    if( UserProc::IsGlobalAreaCompiling() ){
    10651089        /////////////////////////
     
    10671091        /////////////////////////
    10681092
    1069         //OpcodeOthers( ( (string)"OutputDebugString(Ex\"" + VarName + "\r\n\")" ).c_str() );
    1070         AddGlobalVariable(VarName,SubScripts,type,InitBuf,ConstractParameter,dwFlags);
     1093        AddGlobalVariable(VarName,subscripts,type,InitBuf,ConstractParameter,dwFlags);
    10711094    }
    10721095    else{
     
    10751098        /////////////////
    10761099
    1077         if( UserProc::CompilingUserProc().localVars.DuplicateCheck( VarName ) ){
     1100        if( UserProc::CompilingUserProc().GetLocalVars().DuplicateCheck( VarName ) ){
    10781101            //2重定義のエラー
    10791102            SetError(15,VarName,cp);
     
    10831106        bool isConst = ( dwFlags & DIMFLAG_CONST ) ? true:false;
    10841107
    1085         Variable *pVar = new VariableImpl( VarName, type, isConst );
    1086 
    1087         if( SubScripts[0] != -1 ){
     1108        Variable *pVar = new Variable( VarName, type, isConst, false, ConstractParameter );
     1109
     1110        if( subscripts.size() > 0 ){
    10881111            //配列あり
    1089             pVar->SetArray( SubScripts );
    1090         }
    1091 
    1092         //コンストラクタ用パラメータ
    1093         pVar->paramStrForConstructor = ConstractParameter;
     1112            pVar->SetArray( subscripts );
     1113        }
    10941114
    10951115        //レキシカルスコープ
    1096         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    1097         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     1116        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     1117        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    10981118        pVar->bLiving=TRUE;
    10991119
     
    11021122
    11031123        // 変数を追加
    1104         UserProc::CompilingUserProc().localVars.push_back( pVar );
     1124        UserProc::CompilingUserProc().GetLocalVars().push_back( pVar );
    11051125
    11061126        //アラインメントを考慮
    1107         if( pVar->IsStruct() ){
    1108             int alignment = pVar->GetClass().iAlign;
     1127        if( pVar->GetType().IsStruct() ){
     1128            int alignment = pVar->GetType().GetClass().iAlign;
    11091129
    11101130            if( alignment ){
     
    11261146
    11271147        AllLocalVarSize += pVar->GetMemorySize();
    1128         pVar->offset = AllLocalVarSize;
     1148        pVar->SetOffsetAddress( AllLocalVarSize );
    11291149
    11301150        //レキシカルスコープ
    1131         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    1132         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     1151        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     1152        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    11331153        pVar->bLiving=TRUE;
    11341154
     
    11401160
    11411161            int result = 0;
    1142             if( !pVar->IsObject() ){
    1143                 result = InitLocalVar(-pVar->offset,
    1144                     *pVar,
    1145                     pVar->GetSubScriptsPtr(),
     1162            if( !pVar->GetType().IsObject() ){
     1163                result = InitLocalVar(-pVar->GetOffsetAddress(),
     1164                    pVar->GetType(),
     1165                    pVar->GetSubscripts(),
    11461166                    InitBuf);
    11471167            }
     
    11711191
    11721192            //add rcx, offset
    1173             op_add_RV( REG_RCX, -pVar->offset );
     1193            op_add_RV( REG_RCX, -pVar->GetOffsetAddress() );
    11741194            obp-=sizeof(long);
    11751195            AddLocalVarAddrSchedule();
     
    11861206    if( type.IsObject() &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
    11871207        char objectSize[255];
    1188         if( SubScripts[0] == -1 ){
     1208        if( subscripts.size() == 0 ){
    11891209            objectSize[0] = 0;
    11901210        }
    11911211        else{
    1192             if( SubScripts[1] != -1 ){
     1212            if( subscripts.size() > 1 ){
    11931213                SetError(300,NULL,cp);
    11941214            }
    1195             sprintf( objectSize, "%d", SubScripts[0] );
     1215            sprintf( objectSize, "%d", subscripts[0] );
    11961216        }
    11971217        Operator_New( type.GetClass(), objectSize, ConstractParameter, type );
     
    13041324
    13051325bool Compile_AddGlobalRootsForGc(){
    1306     UserProc *pUserProc_AddGlobalRootPtr = GetClassMethod( "_System_CGarbageCollection", "AddGlobalRootPtr" );
     1326    const UserProc *pUserProc_AddGlobalRootPtr = GetClassMethod( "_System_CGarbageCollection", "AddGlobalRootPtr" );
    13071327    if( !pUserProc_AddGlobalRootPtr ){
    13081328        SetError(3, "_System_CGarbageCollection.AddGlobalRootPtr", -1 );
     
    13101330    }
    13111331
    1312     BOOST_FOREACH( const Variable *pVar, globalVars ){
    1313         if( pVar->IsObject() || pVar->IsPointer() || pVar->IsStruct() ){
     1332    BOOST_FOREACH( const Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
     1333        if( pVar->GetType().IsObject() || pVar->GetType().IsPointer() || pVar->GetType().IsStruct() ){
    13141334            // オブジェクトまたはポインタだったとき
    13151335            // ※構造体も含む(暫定対応)
     
    13211341            // ルートポインタを引き渡す
    13221342            //mov rdx,offset
    1323             op_mov_RV(sizeof(_int64), REG_RDX,(int)pVar->offset);
     1343            op_mov_RV(sizeof(_int64), REG_RDX,(int)pVar->GetOffsetAddress());
    13241344            obp-=sizeof(long);
    13251345            pobj_GlobalVarSchedule->add();
Note: See TracChangeset for help on using the changeset viewer.