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/BasicCompiler_Common/VariableOpe.cpp

    r199 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24#include <jenga/include/smoothie/LexicalAnalysis.h>
     
    46#include <Compiler.h>
    57#include <LexicalScopingImpl.h>
    6 #include <VariableImpl.h>
     8#include <Variable.h>
    79#include <NamespaceSupporter.h>
    810
     
    247249
    248250
    249 void GetArrange(char *variable,char *variAnswer,int *SubScripts){
     251void GetArrange(char *variable,char *variAnswer, Subscripts &subscripts ){
    250252    extern int cp;
    251     int i,i2,i3,i4;
     253    int i,i2,i4;
    252254    double dbl;
    253255    _int64 i64data;
     
    261263
    262264            variAnswer[i]=0;
    263             for(i++,i2=0,i3=0;;i++,i2++){
     265            for(i++,i2=0;;i++,i2++){
    264266                if(variable[i]==','){
    265267                    temporary[i2]=0;
     
    274276                    }
    275277
    276                     if(i64data<0){
     278                    if(i64data<0)
     279                    {
    277280                        //error
    278                         SubScripts[i3]=0;
     281                        subscripts.push_back( 0 );
    279282                    }
    280                     else SubScripts[i3]=(int)i64data;
    281                     i3++;
     283                    else
     284                    {
     285                        subscripts.push_back( (int)i64data );
     286                    }
    282287                    i2=-1;
    283288                    continue;
     
    299304                    temporary[i2]=0;
    300305                    if(i2==0){
    301                         SubScripts[i3]=-2;
     306                        subscripts.push_back( -2 );
    302307                        break;
    303308                    }
     
    314319                    if(i64data<0){
    315320                        //error
    316                         SubScripts[i3]=0;
     321                        subscripts.push_back( 0 );
    317322                    }
    318                     else SubScripts[i3]=(int)i64data;
    319                     SubScripts[i3+1]=-1;
     323                    else
     324                    {
     325                        subscripts.push_back( (int)i64data );
     326                    }
    320327                    break;
    321328                }
     
    330337        variAnswer[i]=variable[i];
    331338        if(variable[i]=='\0'){
    332             SubScripts[0]=-1;
    333339            break;
    334340        }
     
    337343
    338344
    339 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,CClass::RefType &refType){
     345BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,ReferenceKind &refType){
    340346    extern int cp;
    341347    int i,i2,i3;
     
    403409        if(buffer[i]=='.'){
    404410            lstrcpy(NestMember,buffer+i+1);
    405             refType = CClass::Dot;
     411            refType = RefDot;
    406412            buffer[i]=0;
    407413            break;
     
    409415        if(buffer[i]==1&&buffer[i+1]==ESC_PSMEM){
    410416            lstrcpy(NestMember,buffer+i+2);
    411             refType = CClass::Pointer;
     417            refType = RefPointer;
    412418            buffer[i]=0;
    413419            break;
     
    459465}
    460466
    461 int JumpSubScripts(const int *ss){
     467int JumpSubScripts( const Subscripts &subscripts ){
    462468    //DIMで定義された並んだ配列の数だけアドレスを進める
    463     int i,i2;
    464     for(i=0,i2=1;i<255;i++){
    465         if(ss[i]==-1) break;
    466         i2*=ss[i]+1;
     469    int i, i2;
     470    for( i=0,i2=1; i<(int)subscripts.size(); i++ ){
     471        i2 *= subscripts[i] + 1;
    467472    }
    468473    return i2;
     
    478483    char lpPtrOffset[VN_SIZE];      //第2次配列
    479484    char NestMember[VN_SIZE];   //入れ子メンバ
    480     CClass::RefType refType = CClass::Non;
     485    ReferenceKind refType = RefNon;
    481486    lstrcpy(VarName,lpszMember);
    482487    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
     
    496501
    497502    //アクセシビリティをチェック
    498     if( &objClass == Smoothie::Temp::pCompilingClass ){
     503    if( &objClass == compiler.pCompilingClass ){
    499504        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    500505        if( pMember->IsNoneAccess() ){
     
    519524    //ポインタ変数の場合
    520525    if( resultType.IsPointer() ){
    521         if(pMember->SubScripts[0]==-1){
     526        if( pMember->GetSubscripts().size() == 0 ){
    522527            lstrcpy(lpPtrOffset,array);
    523528            array[0]=0;
     
    531536    }
    532537
    533     if( refType != CClass::Non ){
     538    if( refType != RefNon ){
    534539        //入れ子構造の場合
    535540
     
    541546    }
    542547
    543     if(array[0]==0&&pMember->SubScripts[0]!=-1){
     548    if( array[0] == 0 && pMember->GetSubscripts().size() > 0 ){
    544549        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    545550        return true;
     
    573578
    574579    // 先頭オブジェクトまたはクラス名と入れ子メンバに分割
    575     CClass::RefType refType;
     580    ReferenceKind refType;
    576581    char member[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    577582    GetVarFormatString(simpleName,array,lpPtrOffset,member,refType);
     
    587592
    588593    const Variable *pVar = NULL;
    589     const int *pSubScripts;
    590594
    591595    if( UserProc::IsLocalAreaCompiling() ){
     
    594598        /////////////////
    595599
    596         pVar = UserProc::CompilingUserProc().localVars.BackSearch( Symbol( VarName ) );
     600        pVar = UserProc::CompilingUserProc().GetLocalVars().BackSearch( Symbol( VarName ) );
    597601        if( pVar ){
    598602            goto ok;
     
    600604    }
    601605
    602     if(Smoothie::Temp::pCompilingClass){
     606    if(compiler.pCompilingClass){
    603607        ///////////////////////
    604608        // クラスメンバの参照
     
    607611        if(lstrcmpi(variable,"This")==0){
    608612            //Thisオブジェクト
    609             resultType.SetType( DEF_OBJECT, Smoothie::Temp::pCompilingClass );
     613            resultType.SetType( DEF_OBJECT, compiler.pCompilingClass );
    610614            return true;
    611615        }
     
    620624
    621625            bool isFound = false;
    622             BOOST_FOREACH( CMember *pMember, Smoothie::Temp::pCompilingClass->GetDynamicMembers() ){
     626            BOOST_FOREACH( CMember *pMember, compiler.pCompilingClass->GetDynamicMembers() ){
    623627                if( pMember->GetName() == VarName ){
    624628                    isFound = true;
     
    629633        }
    630634
    631         return GetMemberType(*Smoothie::Temp::pCompilingClass,variable,resultType,1,isErrorEnabled);
     635        return GetMemberType(*compiler.pCompilingClass,variable,resultType,1,isErrorEnabled);
    632636    }
    633637
     
    643647        GetNowStaticVarFullName(VarName,temporary);
    644648
    645         pVar = globalVars.Find( Symbol( temporary ) );
     649        pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temporary ) );
    646650        if( pVar ){
    647651            goto ok;
     
    659663        char tempArray[VN_SIZE];
    660664        {
    661             CClass::RefType refType;
     665            ReferenceKind refType;
    662666            GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,refType);
    663667        }
     
    672676        sprintf(temp2,"%s.%s",VarName,temporary);
    673677
    674         pVar = globalVars.Find( Symbol( temp2 ) );
     678        pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temp2 ) );
    675679        if( pVar ){
    676680            lstrcpy(member,tempMember);
     
    680684    }
    681685
    682     if(Smoothie::Temp::pCompilingClass){
     686    if(compiler.pCompilingClass){
    683687        //自身のクラスから静的メンバを参照する場合
    684688        char temp2[VN_SIZE];
    685         sprintf(temp2,"%s.%s",Smoothie::Temp::pCompilingClass->GetName().c_str(),VarName);
    686 
    687         pVar = globalVars.Find( Symbol( temp2 ) );
     689        sprintf(temp2,"%s.%s",compiler.pCompilingClass->GetName().c_str(),VarName);
     690
     691        pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temp2 ) );
    688692        if( pVar ){
    689693            goto ok;
     
    696700    ////////////////////
    697701
    698     pVar = globalVars.BackSearch( Symbol( VarName ) );
     702    pVar = compiler.GetMeta().GetGlobalVars().BackSearch( Symbol( VarName ) );
    699703    if( pVar ){
    700704        goto ok;
     
    708712
    709713    //ポインタ変数の場合
    710     if( pVar->IsPointer() ){
     714    if( pVar->GetType().IsPointer() ){
    711715        if( !pVar->IsArray() ){
    712716            lstrcpy(lpPtrOffset,array);
     
    721725    }
    722726
    723     resultType = (*pVar);
    724     pSubScripts=pVar->GetSubScriptsPtr();
    725 
     727    resultType = pVar->GetType();
    726728
    727729    if(member[0]){
     
    732734    }
    733735
    734     if(array[0]==0&&pSubScripts[0]!=-1){
     736    if( array[0] == 0 && pVar->GetSubscripts().size() > 0 ){
    735737        //配列の先頭ポインタを示す場合
    736738        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
     
    751753}
    752754
    753 bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss ){
     755bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts ){
    754756    //読み取り専用で変数へアクセス
    755757    return GetVarOffset(
     
    759761        pRelativeVar,
    760762        resultType,
    761         pss);
    762 }
    763 bool GetVarOffsetReadWrite(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss ){
     763        pResultSubscripts
     764    );
     765}
     766bool GetVarOffsetReadWrite(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts ){
    764767    //読み書き両用で変数へアクセス
    765768    return GetVarOffset(
     
    769772        pRelativeVar,
    770773        resultType,
    771         pss);
     774        pResultSubscripts
     775    );
    772776}
    773777
     
    776780bool GetDimentionFormat( const char *buffer,
    777781                        char *VarName,
    778                         int *SubScripts,
     782                        Subscripts &subscripts,
    779783                        Type &type,
    780784                        char *InitBuf,
     
    924928    }
    925929
    926     GetArrange(variable,VarName,SubScripts);
     930    GetArrange(variable,VarName,subscripts);
    927931    return true;
    928932}
     
    934938    }
    935939
    936     UserProc &proc = UserProc::CompilingUserProc();
     940    const UserProc &proc = UserProc::CompilingUserProc();
    937941
    938942    //Static識別
     
    940944
    941945    //クラス名
    942     if(Smoothie::Temp::pCompilingClass){
    943         lstrcat(FullName,Smoothie::Temp::pCompilingClass->GetName().c_str());
     946    if(compiler.pCompilingClass){
     947        lstrcat(FullName,compiler.pCompilingClass->GetName().c_str());
    944948        lstrcat(FullName,"%");
    945949    }
     
    951955    //ID
    952956    char temp[255];
    953     sprintf(temp,"%x",proc.id);
     957    sprintf(temp,"%x",proc.GetId());
    954958    lstrcat(FullName,temp);
    955959    lstrcat(FullName,"%");
     
    962966
    963967
    964 void AddGlobalVariable( const char *name,int *SubScripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlag){
     968void AddGlobalVariable( const char *name, const Subscripts &subscripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlag){
    965969    /////////////////////////
    966970    // グローバル変数を追加
     
    969973    extern int AllGlobalVarSize;
    970974
    971     if( globalVars.DuplicateCheck( Symbol( name ) ) ){
     975    if( compiler.GetMeta().GetGlobalVars().DuplicateCheck( Symbol( name ) ) ){
    972976        //2重定義のエラー
    973977        SetError(15,name,cp);
     
    977981    bool isConst = ( dwFlag & DIMFLAG_CONST ) ? true:false;
    978982
    979     Variable *pVar = new VariableImpl( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes(), name, type, isConst );
    980 
    981     if( SubScripts[0] != -1 ){
     983    Variable *pVar = new Variable( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes(), name, type, isConst, false, ConstractParameter );
     984
     985    if( subscripts.size() > 0 ){
    982986        //配列あり
    983         pVar->SetArray( SubScripts );
    984     }
    985 
    986     //コンストラクタ用パラメータ
    987     pVar->paramStrForConstructor = ConstractParameter;
     987        pVar->SetArray( subscripts );
     988    }
    988989
    989990    //レキシカルスコープ
    990     pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    991     pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     991    pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     992    pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    992993    pVar->bLiving=TRUE;
    993994
     
    996997
    997998    // 変数を追加
    998     globalVars.push_back( pVar );
     999    compiler.GetMeta().GetGlobalVars().push_back( pVar );
    9991000
    10001001    //アラインメントを考慮
    10011002    int alignment = 0;
    1002     if( pVar->IsStruct() ){
    1003         alignment = pVar->GetClass().iAlign;
     1003    if( pVar->GetType().IsStruct() ){
     1004        alignment = pVar->GetType().GetClass().iAlign;
    10041005    }
    10051006
     
    10131014        }
    10141015
    1015         pVar->offset=AllInitGlobalVarSize;
     1016        pVar->SetOffsetAddress( AllInitGlobalVarSize );
    10161017        AllInitGlobalVarSize += pVar->GetMemorySize();
    10171018    }
     
    10251026        }
    10261027
    1027         pVar->offset=AllGlobalVarSize | 0x80000000;
     1028        pVar->SetOffsetAddress( AllGlobalVarSize | 0x80000000 );
    10281029        AllGlobalVarSize += pVar->GetMemorySize();
    10291030    }
     
    10311032    if(InitBuf[0]){
    10321033        int result = 0;
    1033         if( !pVar->IsObject() ){
     1034        if( !pVar->GetType().IsObject() ){
    10341035            //初期バッファにデータをセット
    10351036            extern BYTE *initGlobalBuf;
     
    10391040                AllInitGlobalVarSize);
    10401041
    1041             result = SetInitGlobalData(pVar->offset,
    1042                 *pVar,
    1043                 pVar->GetSubScriptsPtr(),
     1042            result = SetInitGlobalData(pVar->GetOffsetAddress(),
     1043                pVar->GetType(),
     1044                pVar->GetSubscripts(),
    10441045                InitBuf);
    10451046        }
     
    10701071        const CMethod *method = type.GetClass().GetDestructorMethod();
    10711072        if( method ){
    1072             method->pUserProc->Using();
     1073            method->GetUserProc().Using();
    10731074        }
    10741075    }
     
    11041105
    11051106        //定数と2重定義されていないる場合は抜け出す
    1106         if(CDBConst::obj.GetBasicType(VarName)){
     1107        if(compiler.GetMeta().GetGlobalConsts().GetBasicType(VarName)){
    11071108            return;
    11081109        }
    11091110
    11101111        //定数マクロとして定義されている場合は抜け出す
    1111         if(GetConstHash(VarName)){
     1112        if( compiler.GetMeta().GetGlobalConstMacros().IsExist( VarName ) )
     1113        {
    11121114            return;
    11131115        }
     
    11151117
    11161118    //構文を解析
    1117     int SubScripts[MAX_ARRAYDIM];
    11181119    Type type;
    11191120    char InitBuf[8192];
    11201121    char ConstractParameter[VN_SIZE];
    1121     if(!GetDimentionFormat(Parameter, VarName,SubScripts,type,InitBuf,ConstractParameter))
     1122    Subscripts subscripts;
     1123    if(!GetDimentionFormat(Parameter, VarName,subscripts,type,InitBuf,ConstractParameter))
    11221124        return;
    11231125
    11241126
    11251127    //定数と2重定義されていないかを調べる
    1126     if(CDBConst::obj.GetBasicType(VarName)){
     1128    if(compiler.GetMeta().GetGlobalConsts().GetBasicType(VarName)){
    11271129        SetError(15,VarName,cp);
    11281130        return;
     
    11301132
    11311133    //定数マクロとして定義されている場合
    1132     if(GetConstHash(VarName)){
     1134    if( compiler.GetMeta().GetGlobalConstMacros().IsExist( VarName ) ){
    11331135        SetError(15,VarName,cp);
    11341136        return;
     
    11651167        GetNowStaticVarFullName(VarName,temporary);
    11661168
    1167         dim( temporary,SubScripts,type,InitBuf,ConstractParameter,dwFlags );
     1169        dim( temporary,subscripts,type,InitBuf,ConstractParameter,dwFlags );
    11681170
    11691171        /*
     
    11731175    }
    11741176    else{
    1175         dim( VarName,SubScripts,type,InitBuf,ConstractParameter,dwFlags );
     1177        dim( VarName,subscripts,type,InitBuf,ConstractParameter,dwFlags );
    11761178    }
    11771179}
Note: See TracChangeset for help on using the changeset viewer.