Changeset 140 in dev


Ignore:
Timestamp:
Jun 15, 2007, 4:00:25 AM (17 years ago)
Author:
dai_9181
Message:

traceログ機能を搭載
動的メンバをstl::vectorにまとめた
シンボルをクラス化した

Files:
3 added
31 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/BasicCompiler.vcproj

    r135 r140  
    146146                Name="VCCLCompilerTool"
    147147                Optimization="2"
    148                 InlineFunctionExpansion="1"
     148                InlineFunctionExpansion="2"
     149                FavorSizeOrSpeed="1"
    149150                AdditionalIncludeDirectories="..\cpplibs\boost;..\BasicCompiler_Common\include"
    150151                PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;JPN"
     
    18401841                    <File
    18411842                        RelativePath="..\BasicCompiler_Common\src\Prototype.cpp"
     1843                        >
     1844                    </File>
     1845                    <File
     1846                        RelativePath="..\BasicCompiler_Common\src\Symbol.cpp"
    18421847                        >
    18431848                    </File>
     
    19521957                    >
    19531958                    <File
     1959                        RelativePath="..\BasicCompiler_Common\include\logger.h"
     1960                        >
     1961                    </File>
     1962                    <File
    19541963                        RelativePath="..\BasicCompiler_Common\include\Namespace.h"
    19551964                        >
     
    19611970                    <File
    19621971                        RelativePath="..\BasicCompiler_Common\Procedure.h"
     1972                        >
     1973                    </File>
     1974                    <File
     1975                        RelativePath="..\BasicCompiler_Common\include\Symbol.h"
    19631976                        >
    19641977                    </File>
  • BasicCompiler32/Compile_Object.cpp

    r135 r140  
    5959        if( subs.size() == 1 ){
    6060            char temporary[VN_SIZE];
    61             sprintf( temporary, "_System_TypeBase.Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
     61            sprintf( temporary, "ActiveBasic.Core._System_TypeBase.Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
    6262
    6363            Opcode_CallProc(temporary,
  • BasicCompiler32/Compile_ProcOp.cpp

    r135 r140  
    514514            }
    515515
    516             //新しいオブジェクト領域は0で初期化されているため、Nothingを明示的に代入する必要はない
    517 /*
    518             //実体クラスを持つメンバのコンストラクタ(引数有りを除く)を呼び出す
    519             for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
    520                 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    521                 if(pMember->IsObject()){
    522                     // オブジェクトメンバを発見したとき
    523 
    524                     sprintf(temporary, "This.%s=Nothing",
    525                         pMember->name );
    526                     OpcodeCalc( temporary );
    527                 }
    528             }
    529 */
    530 
    531516            //仮想関数テーブルを初期化
    532517            if(pobj_CompilingClass->vtbl_num&&
     
    608593                }
    609594            }
    610 
    611             //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる
    612             /*
    613             //※コンストラクタと逆順序で呼び出す
    614             int offset;
    615             int MemberTypeSize;
    616             int MemberObjectNum;
    617             offset=GetTypeSize(DEF_OBJECT,(LONG_PTR)pobj_CompilingClass);
    618             for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){
    619                 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    620 
    621                 MemberTypeSize=
    622                     GetTypeSize(pMember->TypeInfo.type,
    623                         pMember->TypeInfo.u.lpIndex);
    624 
    625                 MemberObjectNum=
    626                     JumpSubScripts(pMember->SubScripts);
    627 
    628                 offset-=MemberTypeSize*MemberObjectNum;
    629 
    630                 if(pMember->TypeInfo.type==DEF_OBJECT){
    631                     CMethod *method = pMember->TypeInfo.u.pobj_Class->GetDestructorMethod();
    632                     if( method ){
    633                         for(i4=MemberObjectNum-1;i4>=0;i4--){
    634                             //Thisポインタをecxにコピー
    635                             SetThisPtrToReg(REG_ECX);
    636 
    637                             //add ecx,offset
    638                             OpBuffer[obp++]=(char)0x81;
    639                             OpBuffer[obp++]=(char)0xC1;
    640                             *((long *)(OpBuffer+obp))=offset+i4*MemberTypeSize;
    641                             obp+=sizeof(long);
    642 
    643                             //push ecx
    644                             op_push(REG_ECX);
    645 
    646                             //call destructor
    647                             op_call( method->pUserProc );
    648                         }
    649                     }
    650                 }
    651             }*/
    652595        }
    653596    }
  • BasicCompiler32/Compile_Var.cpp

    r138 r140  
    158158}
    159159bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
    160     int i;
    161 
    162160
    163161    //////////////////////////////////////
     
    178176    ////////////////////////////
    179177
    180     int offset = objClass.GetMemberOffset( VarName, &i );
    181     if(i==objClass.iMemberNum){
     178    int memberIndex;
     179    int offset = objClass.GetMemberOffset( VarName, &memberIndex );
     180    if(memberIndex==objClass.GetDynamicMembers().size()){
    182181        if(isErrorEnabled) SetError(103,VarName,cp);
    183182        return false;
    184183    }
    185184
    186     CMember *pMember=objClass.ppobj_Member[i];
     185    CMember *pMember=objClass.GetDynamicMembers()[memberIndex];
    187186
    188187
     
    351350
    352351bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss){
    353     int i;
    354352    char variable[VN_SIZE];
    355353
     
    387385        //////////////////
    388386
    389         const Variable *pVar = UserProc::CompilingUserProc().localVars.BackSearch( VarName );
     387        const Variable *pVar = UserProc::CompilingUserProc().localVars.BackSearch( Symbol( VarName ) );
    390388        if( pVar ){
    391389            //ポインタ変数の場合
     
    444442            //クラス内メンバを参照するとき(通常)
    445443
    446             for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
    447                 if( pobj_CompilingClass->ppobj_Member[i]->GetName() == VarName ){
     444            bool isFound = false;
     445            BOOST_FOREACH( CMember *pMember, pobj_CompilingClass->GetDynamicMembers() ){
     446                if( pMember->GetName() == VarName ){
     447                    isFound = true;
    448448                    break;
    449449                }
    450450            }
    451             if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
     451            if( !isFound ) goto NonClassMember;
    452452        }
    453453
     
    494494            GetNowStaticVarFullName(VarName,temporary);
    495495
    496             pVar = globalVars.Find( temporary );
     496            pVar = globalVars.Find( Symbol( temporary ) );
    497497            if( pVar ){
    498498                goto GlobalOk;
     
    525525            char temp2[VN_SIZE];
    526526            sprintf(temp2,"%s.%s",VarName,temporary);
    527             pVar = globalVars.Find( temp2 );
     527            pVar = globalVars.Find( Symbol( temp2 ) );
    528528            if( pVar ){
    529529                lstrcpy(member,tempMember);
     
    537537            char temp2[VN_SIZE];
    538538            sprintf(temp2,"%s.%s",pobj_CompilingClass->GetName().c_str(),VarName);
    539             pVar = globalVars.Find( temp2 );
     539            pVar = globalVars.Find( Symbol( temp2 ) );
    540540            if( pVar ){
    541541                goto GlobalOk;
     
    547547        /////////////////////
    548548
    549         pVar = globalVars.BackSearch( VarName );
     549        pVar = globalVars.BackSearch( Symbol( VarName ) );
    550550        if( pVar ){
    551551            goto GlobalOk;
     
    716716bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,const char *lpszInitBuf){
    717717    extern BYTE *initGlobalBuf;
    718     int i,i2,i3;
     718    int i2,i3;
    719719    char temporary[VN_SIZE];
    720720    char InitBuf[VN_SIZE];
     
    729729        if(SubScripts[0]!=-1){
    730730            typeSize*=JumpSubScripts(SubScripts+1);
    731             i=0;
     731            int i=0;
    732732            i2=0;
    733733            while(1){
     
    751751            const CClass &objClass = type.GetClass();
    752752
    753             for(i=0,i2=0;i2<objClass.iMemberNum;i2++){
     753            int i = 0;
     754            BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
     755                if(InitBuf[i]=='\0'){
     756                    SetError(41,0,cp);
     757                    return false;
     758                }
     759
    754760                i=GetOneParameter(InitBuf,i,temporary);
    755761
    756                 i3=objClass.GetMemberOffset( objClass.ppobj_Member[i2]->GetName().c_str(), NULL );
     762                i3=objClass.GetMemberOffset( pMember->GetName().c_str(), NULL );
    757763
    758764                if(!SetInitGlobalData(offset+i3,
    759                     objClass.ppobj_Member[i2]->GetType(),
    760                     objClass.ppobj_Member[i2]->SubScripts,
     765                    pMember->GetType(),
     766                    pMember->SubScripts,
    761767                    temporary)) return false;
    762 
    763                 if(InitBuf[i]=='\0') break;
    764             }
    765             if(i2+1!=objClass.iMemberNum){
    766                 SetError(41,0,cp);
    767                 return false;
    768768            }
    769769            return true;
     
    889889            const CClass &objClass = type.GetClass();
    890890
    891             for(i=0,i2=0;i2<objClass.iMemberNum;i2++){
     891            int i = 0;
     892            BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
     893                if(InitBuf[i]=='\0'){
     894                    SetError(41,0,cp);
     895                    return false;
     896                }
     897
    892898                i=GetOneParameter(InitBuf,i,temporary);
    893899
    894                 i3=objClass.GetMemberOffset( objClass.ppobj_Member[i2]->GetName().c_str(), NULL );
     900                i3=objClass.GetMemberOffset( pMember->GetName().c_str(), NULL );
    895901
    896902                if(!InitLocalVar(offset+i3,
    897                     objClass.ppobj_Member[i2]->GetType(),
    898                     objClass.ppobj_Member[i2]->SubScripts,
     903                    pMember->GetType(),
     904                    pMember->SubScripts,
    899905                    temporary)) return false;
    900906
    901907                if(InitBuf[i]=='\0') break;
    902             }
    903             if(i2+1!=objClass.iMemberNum){
    904                 SetError(41,0,cp);
    905                 return 0;
    906908            }
    907909            return true;
     
    10781080        /////////////////
    10791081
    1080         if( UserProc::CompilingUserProc().localVars.DuplicateCheck( VarName ) ){
     1082        if( UserProc::CompilingUserProc().localVars.DuplicateCheck( Symbol( VarName ) ) ){
    10811083            //2重定義のエラー
    10821084            SetError(15,VarName,cp);
  • BasicCompiler32/MakePeHdr.cpp

    r105 r140  
    259259        pSub_System_GC_free_for_SweepingDelete->Using();
    260260
    261     if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "_System_TypeBase.InitializeUserTypes",1 ) ){
     261    if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "ActiveBasic.Core._System_TypeBase.InitializeUserTypes",1 ) ){
    262262        pSubStaticMethod_System_TypeBase_InitializeUserTypes->Using();
    263263        pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc();
  • BasicCompiler32/Opcode.h

    r138 r140  
    232232
    233233private:
    234     bool _overload_check( int level, const Parameters &targetParms, const Type &targetResultType );
    235     UserProc *OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs );
     234    bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType );
    236235public:
    237     UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs );
     236    UserProc *_OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType = false );
     237    UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType = false );
    238238
    239239    void ApplyDefaultParameters( const Parameters &params );
  • BasicCompiler64/BasicCompiler.vcproj

    r137 r140  
    350350                Name="VCCLCompilerTool"
    351351                Optimization="2"
     352                InlineFunctionExpansion="2"
     353                FavorSizeOrSpeed="1"
    352354                AdditionalIncludeDirectories="..\cpplibs\boost;..\BasicCompiler_Common\include"
    353355                PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;JPN;_AMD64_;_WIN64"
     
    480482                    >
    481483                    <File
     484                        RelativePath="..\BasicCompiler_Common\include\logger.h"
     485                        >
     486                    </File>
     487                    <File
    482488                        RelativePath="..\BasicCompiler_Common\include\Namespace.h"
    483489                        >
     
    489495                    <File
    490496                        RelativePath="..\BasicCompiler_Common\Procedure.h"
     497                        >
     498                    </File>
     499                    <File
     500                        RelativePath="..\BasicCompiler_Common\include\Symbol.h"
    491501                        >
    492502                    </File>
     
    15921602                    </File>
    15931603                    <File
     1604                        RelativePath="..\BasicCompiler_Common\src\Symbol.cpp"
     1605                        >
     1606                    </File>
     1607                    <File
    15941608                        RelativePath="..\BasicCompiler_Common\Type.cpp"
    15951609                        >
  • BasicCompiler64/Compile_Object.cpp

    r135 r140  
    5757        if( subs.size() == 1 ){
    5858            char temporary[VN_SIZE];
    59             sprintf( temporary, "_System_TypeBase.Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
     59            sprintf( temporary, "ActiveBasic.Core._System_TypeBase.Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
    6060
    6161            Opcode_CallProc(temporary,
  • BasicCompiler64/Compile_ProcOp.cpp

    r135 r140  
    566566            }
    567567
    568             //新しいオブジェクト領域は0で初期化されているため、Nothingを明示的に代入する必要はない
    569 /*
    570             //実体クラスを持つメンバのコンストラクタ(引数有りを除く)を呼び出す
    571             for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
    572                 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    573                 if(pMember->IsObject()){
    574                     // オブジェクトメンバを発見したとき
    575 
    576                     sprintf(temporary, "This.%s=Nothing",
    577                         pMember->name );
    578                     OpcodeCalc( temporary );
    579                 }
    580             }
    581 */
    582 
    583568            //仮想関数テーブルを初期化
    584569            if(pobj_CompilingClass->vtbl_num&&
     
    659644                }
    660645            }
    661 
    662             //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる
    663             /*
    664             //※コンストラクタと逆順序で呼び出す
    665             for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){
    666                 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    667                 int MemberTypeSize=
    668                     GetTypeSize(pMember->TypeInfo.type,
    669                         pMember->TypeInfo.u.lpIndex);
    670 
    671                 int MemberObjectNum=
    672                     JumpSubScripts(pMember->SubScripts);
    673 
    674                 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL );
    675 
    676                 if(pMember->IsObject()){
    677                     CMethod *method = pMember->GetClass().GetDestructorMethod();
    678                     if( method ){
    679                         for(i4=MemberObjectNum-1;i4>=0;i4--){
    680                             //Thisポインタをrcxにコピー
    681                             SetThisPtrToReg(REG_RCX);
    682 
    683                             //add rcx,offset
    684                             op_add_RV(REG_RCX,offset+i4*MemberTypeSize);
    685 
    686                             //call destructor
    687                             op_call(method->pUserProc);
    688                         }
    689                     }
    690                 }
    691             }*/
    692646        }
    693647    }
  • BasicCompiler64/Compile_Var.cpp

    r138 r140  
    187187}
    188188bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
    189     int i;
    190 
    191189
    192190    //////////////////////////////////////
     
    207205    ////////////////////////////
    208206
    209     int offset = objClass.GetMemberOffset( VarName, &i );
    210     if(i==objClass.iMemberNum){
     207    int memberIndex;
     208    int offset = objClass.GetMemberOffset( VarName, &memberIndex );
     209    if( memberIndex == objClass.GetDynamicMembers().size() ){
    211210        if(isErrorEnabled) SetError(103,VarName,cp);
    212211        return false;
    213212    }
    214213
    215     CMember *pMember=objClass.ppobj_Member[i];
     214    CMember *pMember = objClass.GetDynamicMembers()[memberIndex];
    216215
    217216
     
    379378}
    380379bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss){
    381     int i;
    382380    char variable[VN_SIZE];
    383381
     
    471469            //クラス内メンバを参照するとき(通常)
    472470
    473             for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
    474                 if( pobj_CompilingClass->ppobj_Member[i]->GetName() == VarName ){
     471            bool isFound = false;
     472            BOOST_FOREACH( CMember *pMember, pobj_CompilingClass->GetDynamicMembers() ){
     473                if( pMember->GetName() == VarName ){
     474                    isFound = true;
    475475                    break;
    476476                }
    477477            }
    478             if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
     478            if( !isFound ) goto NonClassMember;
    479479        }
    480480
     
    773773            const CClass &objClass = type.GetClass();
    774774
    775             for(i=0,i2=0;i2<objClass.iMemberNum;i2++){
     775            int i = 0;
     776            BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
     777                if(InitBuf[i]=='\0'){
     778                    SetError(41,0,cp);
     779                    return false;
     780                }
     781
    776782                i=GetOneParameter(InitBuf,i,temporary);
    777783
    778                 i3=objClass.GetMemberOffset( objClass.ppobj_Member[i2]->GetName().c_str(), NULL );
     784                i3=objClass.GetMemberOffset( pMember->GetName().c_str(), NULL );
    779785
    780786                if(!SetInitGlobalData(offset+i3,
    781                     objClass.ppobj_Member[i2]->GetType(),
    782                     objClass.ppobj_Member[i2]->SubScripts,
     787                    pMember->GetType(),
     788                    pMember->SubScripts,
    783789                    temporary)) return false;
    784 
    785                 if(InitBuf[i]=='\0') break;
    786             }
    787             if(i2+1!=objClass.iMemberNum){
    788                 SetError(41,0,cp);
    789                 return false;
    790790            }
    791791            return true;
     
    911911            const CClass &objClass = type.GetClass();
    912912
    913             for(i=0,i2=0;i2<objClass.iMemberNum;i2++){
     913            int i = 0;
     914            BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
     915                if(InitBuf[i]=='\0'){
     916                    SetError(41,0,cp);
     917                    return false;
     918                }
     919
    914920                i=GetOneParameter(InitBuf,i,temporary);
    915921
    916                 i3=objClass.GetMemberOffset( objClass.ppobj_Member[i2]->GetName().c_str(), NULL );
     922                i3=objClass.GetMemberOffset( pMember->GetName().c_str(), NULL );
    917923
    918924                if(!InitLocalVar(offset+i3,
    919                     objClass.ppobj_Member[i2]->GetType(),
    920                     objClass.ppobj_Member[i2]->SubScripts,
     925                    pMember->GetType(),
     926                    pMember->SubScripts,
    921927                    temporary)) return false;
    922928
    923929                if(InitBuf[i]=='\0') break;
    924             }
    925             if(i2+1!=objClass.iMemberNum){
    926                 SetError(41,0,cp);
    927                 return 0;
    928930            }
    929931            return true;
  • BasicCompiler64/MakePeHdr.cpp

    r129 r140  
    240240        pSub_System_GC_free_for_SweepingDelete->Using();
    241241
    242     if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "_System_TypeBase.InitializeUserTypes",1 ) ){
     242    if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "ActiveBasic.Core._System_TypeBase.InitializeUserTypes",1 ) ){
    243243        pSubStaticMethod_System_TypeBase_InitializeUserTypes->Using();
    244244        pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc();
  • BasicCompiler64/NumOpe.cpp

    r135 r140  
    524524        //New演算子(オブジェクト生成)
    525525
    526         if( !Operator_New( expression+2, baseType, resultType ) ){
    527             return false;
    528         }
     526        if( pobj_BlockReg->check(REG_RAX) ){
     527            SetError();
     528        }
     529
     530        //////////////////////////////////////////////////////
     531        /////    レジスタ資源のバックアップ
     532        {   BACKUP_REGISTER_RESOURCE
     533        //////////////////////////////////////////////////////
     534
     535            if( !Operator_New( expression+2, baseType, resultType ) ){
     536                return false;
     537            }
     538
     539        /////////////////////////////////////////////
     540        //////   レジスタ資源を復元
     541            RESTORE_REGISTER_RESOURCE
     542        }////////////////////////////////////////////
    529543
    530544        //mov reg,rax
  • BasicCompiler64/Opcode.h

    r138 r140  
    353353
    354354private:
    355     bool _overload_check( int level, const Parameters &params, const Type &returnType );
    356     UserProc *OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs );
     355    bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType );
     356
    357357public:
    358     UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs );
     358    UserProc *_OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType = false );
     359    UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType = false );
    359360
    360361    void ApplyDefaultParameters( const Parameters &params );
  • BasicCompiler_Common/BasicCompiler.cpp

    r139 r140  
    548548
    549549    //MessageBox(0,"starting compiler/debugger","ActiveBasic",MB_OK);
     550    trace( "Start ActiveBasic Compiler!" );
    550551
    551552    //コモンコントロールを初期化
     
    840841    }
    841842
     843    trace("Complete ActiveBasic Compiler!");
     844
    842845
    843846    return 0;
  • BasicCompiler_Common/Class.cpp

    r139 r140  
    1515
    1616CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name )
    17     : Prototype( namespaceScopes, name )
     17    : isReady( false )
     18    , Prototype( namespaceScopes, name )
    1819    , importedNamespaces( importedNamespaces )
    1920    , ConstructorMemberSubIndex( 0 )
     
    2122    , classType( Class )
    2223    , pobj_InheritsClass( NULL )
    23     , ppobj_Member( NULL )
    24     , iMemberNum( 0 )
    2524    , vtbl_num( 0 )
    2625    , iAlign( 0 )
     
    3231}
    3332CClass::~CClass(){
    34     int i;
    35 
    36     if(ppobj_Member){
    37         //メンバ
    38         for(i=0;i<iMemberNum;i++){
    39             delete ppobj_Member[i];
    40         }
    41         HeapDefaultFree(ppobj_Member);
    42         ppobj_Member=0;
    43     }
    44 
    45     //静的メンバ
     33    // 動的メンバ
     34    foreach( CMember *member, dynamicMembers ){
     35        delete member;
     36    }
     37
     38    // 静的メンバ
    4639    foreach( CMember *member, staticMembers ){
    4740        delete member;
     
    149142    }
    150143
    151     if( inheritsClass.ppobj_Member == 0 ){
     144    if( !inheritsClass.IsReady() ){
    152145        //継承先が読み取られていないとき
    153146        pobj_LoopRefCheck->add(this->GetName().c_str());
     
    157150
    158151    //メンバをコピー
    159     ppobj_Member=(CMember **)HeapReAlloc(
    160         hHeap,
    161         0,
    162         ppobj_Member,
    163         ( iMemberNum + inheritsClass.iMemberNum )*sizeof(CMember *));
    164     for(int i3=0;i3<inheritsClass.iMemberNum;i3++){
    165         ppobj_Member[iMemberNum]=new CMember( *inheritsClass.ppobj_Member[i3] );
     152    BOOST_FOREACH( CMember *inheritsClassDynamicMember, inheritsClass.dynamicMembers ){
     153        CMember *pMember = new CMember( *inheritsClassDynamicMember );
    166154
    167155        // アクセシビリティ
    168         if( inheritsClass.ppobj_Member[i3]->IsPrivate() ){
    169             ppobj_Member[iMemberNum]->SetAccessibility( Prototype::None );
     156        if( inheritsClassDynamicMember->IsPrivate() ){
     157            pMember->SetAccessibility( Prototype::None );
    170158        }
    171159        else{
    172             ppobj_Member[iMemberNum]->SetAccessibility( inheritsClass.ppobj_Member[i3]->GetAccessibility() );
    173         }
    174 
    175         iMemberNum++;
     160            pMember->SetAccessibility( inheritsClassDynamicMember->GetAccessibility() );
     161        }
     162
     163        dynamicMembers.push_back( pMember );
    176164    }
    177165
     
    216204    }
    217205
    218     if( inheritsInterface.ppobj_Member == 0 ){
     206    if( !inheritsInterface.IsReady() ){
    219207        //継承先が読み取られていないとき
    220208        pobj_LoopRefCheck->add(this->GetName().c_str());
     
    255243}
    256244void CClass::AddMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer ){
    257     ppobj_Member = (CMember **)HeapReAlloc( hHeap, 0, ppobj_Member, ( iMemberNum + 1 ) * sizeof(CMember *) );
    258     ppobj_Member[iMemberNum] = new CMember( this, accessibility, isConst, isRef, buffer );
    259     iMemberNum++;
     245    CMember *pMember = new CMember( this, accessibility, isConst, isRef, buffer );
     246    dynamicMembers.push_back( pMember );
    260247}
    261248void CClass::AddStaticMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine ){
    262     CMember *member = new CMember( this, accessibility, isConst, isRef, buffer, nowLine );
    263     staticMembers.push_back( member );
     249    CMember *pMember = new CMember( this, accessibility, isConst, isRef, buffer, nowLine );
     250    staticMembers.push_back( pMember );
    264251}
    265252BOOL CClass::DupliCheckAll(const char *name){
     
    281268    //重複チェック
    282269
    283     //メンバ
    284     for( int i=0;i<iMemberNum;i++){
    285         if( GetName() == ppobj_Member[i]->GetName() ){
     270    // 動的メンバ
     271    BOOST_FOREACH( CMember *pMember, dynamicMembers ){
     272        if( GetName() == pMember->GetName() ){
    286273            return 1;
    287274        }
    288275    }
    289276
    290     //静的メンバ
    291     foreach( CMember *member, staticMembers ){
    292         if( GetName() == member->GetName() ){
     277    // 静的メンバ
     278    foreach( CMember *pMember, staticMembers ){
     279        if( GetName() == pMember->GetName() ){
    293280            return 1;
    294281        }
     
    321308int CClass::GetMemberOffset( const char *memberName, int *pMemberNum ) const
    322309{
    323     int i,i2,offset;
     310    int i2,offset;
    324311
    325312    //仮想関数が存在する場合は関数リストへのポインタのサイズを追加
     
    332319
    333320    int iMaxAlign=0;
    334     for(i=0;i<iMemberNum;i++){
    335         CMember *pMember = ppobj_Member[i];
     321    int i = -1;
     322    BOOST_FOREACH( CMember *pMember, dynamicMembers ){
     323        i++;
    336324
    337325        i2 = pMember->GetType().GetSize();
     
    393381int CClass::GetAlignment() const
    394382{
    395     int i;
    396383    int alignment,member_size;
    397384
     
    399386    else alignment=0;
    400387
    401     for(i=0;i<iMemberNum;i++){
    402         CMember *pMember = ppobj_Member[i];
    403 
     388    BOOST_FOREACH( CMember *pMember, dynamicMembers ){
    404389        if(pMember->GetType().IsStruct()){
    405390            //メンバクラスのアラインメントを取得
     
    969954
    970955BOOL CDBClass::MemberVar_LoopRefCheck(const CClass &objClass){
    971     int i,i2,bRet=1;
    972     for(i=0;i<objClass.iMemberNum;i++){
    973         const CMember *pMember = objClass.ppobj_Member[i];
     956    int i2,bRet=1;
     957    BOOST_FOREACH( CMember *pMember, objClass.dynamicMembers ){
    974958        if(pMember->GetType().IsStruct()){
    975959            //循環参照でないかをチェック
     
    10551039            }
    10561040
    1057             if(pobj_c->ppobj_Member){
     1041            if(pobj_c->IsReady()){
    10581042                //既に先読みされているとき
    10591043                continue;
    10601044            }
    10611045
    1062             //メンバ用メモリを初期化
    1063             pobj_c->ppobj_Member=(CMember **)HeapAlloc(hHeap,0,1);
    1064             pobj_c->iMemberNum=0;
     1046            pobj_c->Readed();
    10651047
    10661048            pobj_c->ConstructorMemberSubIndex=-1;
     
    12061188            }
    12071189
    1208             if(pobj_c->ppobj_Member){
     1190            if(pobj_c->IsReady()){
    12091191                //既に先読みされているとき
    12101192                continue;
     
    12131195            pobj_c->iAlign=iAlign;
    12141196
    1215             //メンバ用メモリを初期化
    1216             pobj_c->ppobj_Member=(CMember **)HeapAlloc(hHeap,0,1);
    1217             pobj_c->iMemberNum=0;
     1197            pobj_c->Readed();
    12181198
    12191199            pobj_c->ConstructorMemberSubIndex=-1;
     
    13811361
    13821362
    1383                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetType().IsStruct()){
    1384                             if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetType().GetClass().ppobj_Member==0){
     1363                        if(pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().IsStruct()){
     1364                            if( !pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().GetClass().IsReady() ){
    13851365                                //参照先が読み取られていないとき
    1386                                 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetType().GetClass().GetName().c_str());
     1366                                GetClass_recur(pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().GetClass().GetName().c_str());
    13871367                            }
    13881368                        }
    13891369
    13901370
    1391                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetType().IsStruct()){
     1371                        if(pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().IsStruct()){
    13921372                            //循環参照のチェック
    13931373                            pobj_LoopRefCheck->add(pobj_c->GetName().c_str());
    1394                             if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetType().GetClass())){
     1374                            if(!MemberVar_LoopRefCheck(pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().GetClass())){
    13951375                                //エラー回避
    1396                                 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetType().SetBasicType( DEF_PTR_VOID );
     1376                                pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().SetBasicType( DEF_PTR_VOID );
    13971377                            }
    13981378                            pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
     
    14811461        char referenceOffsetsBuffer[1024] = "";
    14821462        int numOfReference = 0;
    1483         for( int i=0; i<objClass.iMemberNum; i++ ){
    1484             CMember &member = *objClass.ppobj_Member[i];
    1485 
    1486             if( member.GetType().IsObject() || member.GetType().IsPointer() ){
     1463        BOOST_FOREACH( CMember *pMember, objClass.dynamicMembers ){
     1464            if( pMember->GetType().IsObject() || pMember->GetType().IsPointer() ){
    14871465                if( referenceOffsetsBuffer[0] ){
    14881466                    lstrcat( referenceOffsetsBuffer, "," );
     
    14911469                sprintf( referenceOffsetsBuffer + lstrlen( referenceOffsetsBuffer ),
    14921470                    "%d",
    1493                     objClass.GetMemberOffset( member.GetName().c_str() ) );
     1471                    objClass.GetMemberOffset( pMember->GetName().c_str() ) );
    14941472
    14951473                numOfReference++;
  • BasicCompiler_Common/Class.h

    r137 r140  
    3838    friend CDebugSection;
    3939
     40    bool isReady;
     41    void Readed(){
     42        isReady = true;
     43    }
     44    bool IsReady() const{
     45        return isReady;
     46    }
     47
    4048    // importされている名前空間
    4149    NamespaceScopesCollection importedNamespaces;
     
    4755    Type blittableType;
    4856
    49     //静的メンバ情報
    50     std::vector<CMember *> staticMembers;
    51 
    52     //メソッド情報
     57    // 動的メンバ
     58    Members dynamicMembers;
     59
     60    // 静的メンバ
     61    Members staticMembers;
     62
     63    // 動的メソッド
    5364    Methods methods;
    5465    int ConstructorMemberSubIndex;
    5566    int DestructorMemberSubIndex;
    5667
    57     //静的メソッド情報
     68    // 静的メソッド
    5869    Methods staticMethods;
    5970
     
    7384    const CClass *pobj_InheritsClass;
    7485
    75     //メンバ情報
    76     CMember **ppobj_Member;
    77     int iMemberNum;
    78 
    7986    //仮想関数の数
    8087    int vtbl_num;
     
    129136    BOOL DupliCheckAll(const char *name);
    130137    BOOL DupliCheckMember(const char *name);
     138
     139    const Members &GetDynamicMembers() const
     140    {
     141        return dynamicMembers;
     142    }
    131143
    132144    const Methods &GetMethods() const
  • BasicCompiler_Common/DebugMiddleFile.cpp

    r137 r140  
    5050void CDebugSection::make(void){
    5151    extern INCLUDEFILEINFO IncludeFileInfo;
    52     int i2,i3,i4,i5,BufferSize;
     52    int i2,i3,i5,BufferSize;
    5353
    5454    if(buffer){
     
    324324
    325325        //メンバ
    326         *(long *)(buffer+i2)=pobj_c->iMemberNum;
    327         i2+=sizeof(long);
    328         for(i4=0;i4<pobj_c->iMemberNum;i4++){
     326        *(long *)(buffer+i2)=(int)pobj_c->dynamicMembers.size();
     327        i2+=sizeof(long);
     328        foreach( CMember *member, pobj_c->dynamicMembers ){
    329329            // 名前
    330             lstrcpy(buffer+i2,pobj_c->ppobj_Member[i4]->GetName().c_str());
     330            lstrcpy(buffer+i2,member->GetName().c_str());
    331331            i2+=lstrlen(buffer+i2)+1;
    332332
    333333            // 型
    334             *(long *)(buffer+i2)=pobj_c->ppobj_Member[i4]->GetType().GetBasicType();
     334            *(long *)(buffer+i2)=member->GetType().GetBasicType();
    335335            i2+=sizeof(long);
    336336
    337337            // 型の拡張情報
    338             SetLpIndex_DebugFile(buffer,&i2,pobj_c->ppobj_Member[i4]->GetType());
     338            SetLpIndex_DebugFile(buffer,&i2,member->GetType());
    339339
    340340            // アクセシビリティ
    341             *(Prototype::Accessibility *)(buffer+i2)=pobj_c->ppobj_Member[i4]->GetAccessibility();
     341            *(Prototype::Accessibility *)(buffer+i2)=member->GetAccessibility();
    342342            i2+=sizeof(Prototype::Accessibility);
    343343
    344             memcpy(buffer+i2,pobj_c->ppobj_Member[i4]->SubScripts,sizeof(int)*MAX_ARRAYDIM);
     344            memcpy(buffer+i2,member->SubScripts,sizeof(int)*MAX_ARRAYDIM);
    345345            i2+=sizeof(int)*MAX_ARRAYDIM;
    346346
     
    705705        i2+=sizeof(long);
    706706
    707         //メンバ
    708         pobj_c->iMemberNum=*(long *)(buffer+i2);
    709         i2+=sizeof(long);
    710         pobj_c->ppobj_Member=
    711             (CMember **)HeapAlloc(hHeap,0,pobj_c->iMemberNum*sizeof(CMember *));
    712         for(i4=0;i4<pobj_c->iMemberNum;i4++){
    713 
     707        //静的メンバ
     708        int nDynamicMember = *(long *)(buffer+i2);
     709        i2+=sizeof(long);
     710        for( i4=0; i4<nDynamicMember; i4++ ){
    714711            // 名前
    715712            string name = (char *)(buffer+i2);
     
    727724            i2+=sizeof(Prototype::Accessibility);
    728725
    729             pobj_c->ppobj_Member[i4]=new CMember( accessibility, name, type, false );
    730 
    731             memcpy(pobj_c->ppobj_Member[i4]->SubScripts,buffer+i2,sizeof(int)*MAX_ARRAYDIM);
     726            CMember *member=new CMember( accessibility, name, type, false );
     727
     728            memcpy(member->SubScripts,buffer+i2,sizeof(int)*MAX_ARRAYDIM);
    732729            i2+=sizeof(int)*MAX_ARRAYDIM;
     730
     731            pobj_c->dynamicMembers.push_back( member );
    733732        }
    734733
  • BasicCompiler_Common/ParamImpl.cpp

    r116 r140  
    9898}
    9999
    100 bool ParamImpl::_overload_check( int level, const Parameters &targetParms, const Type &targetResultType ){
     100bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType ){
    101101    //パラメータを識別してオーバーロードを解決
    102102
     
    153153                        return false;
    154154                }
     155                if( argType.IsPointer() || param.IsPointer() )
     156                {
     157                    // ポインタ型の不整合は認めない
     158                    return false;
     159                }
    155160            }
    156161            else if(level==OVERLOAD_LEVEL6){
     
    190195}
    191196
    192 UserProc *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs ){
    193     int sw=0;
    194     UserProc *pUserProc = NULL;
    195 
    196     for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
    197         foreach( UserProc *pTempUserProc, subs ){
    198 
    199             //エラーチェック
    200             if(_overload_check( level, pTempUserProc->Params(), pTempUserProc->ReturnType() )){
    201                 if(sw){
    202                     SetError(52,name,cp);
    203                     return 0;
    204                 }
    205                 sw=1;
    206 
    207                 pUserProc = pTempUserProc;
    208             }
    209         }
    210 
    211         if( sw ) break;
    212     }
    213 
    214     if(!sw){
    215         SetError(52,name,cp);
    216         return 0;
    217     }
    218 
    219     return pUserProc;
    220 }
    221 UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs ){
     197UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType ){
    222198    int sw=0;
    223199    UserProc *pUserProc;
     
    228204        foreach( UserProc *pTempUserProc, subs ){
    229205
    230             //エラーチェック
    231             if(_overload_check( level, pTempUserProc->Params(), Type() )){
     206            if(EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type() )){
     207                trace( "レベル" << level <<    " ○適合..." << pTempUserProc->_paramStr );
     208
    232209                if(sw){
    233                     return OverloadSolutionWithReturnType(name,subs);
     210                    if( isEnabledReturnType ){
     211                        SetError(52,name,cp);
     212
     213                        return 0;
     214                    }
     215                    else{
     216                        // 戻り値も比較するモードにして再びオーバーロード解決を試みる
     217
     218                        trace( "戻り値も比較するモードに切り替えてオーバーロード解決を試みる" );
     219
     220                        return OverloadSolution(name,subs, true);
     221                    }
    234222                }
    235223                sw=1;
    236224
    237225                pUserProc = pTempUserProc;
     226            }
     227            else
     228            {
     229                trace( "レベル" << level <<    " ×不適合..." << pTempUserProc->_paramStr );
    238230            }
    239231        }
     
    260252    if(!sw){
    261253        SetError(52,name,cp);
     254
    262255        return 0;
    263256    }
    264257
     258
    265259    return pUserProc;
     260}
     261UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType ){
     262    trace( "" );
     263    trace( "■■■■■■■■■■■■■■■■■■" );
     264    trace( "■■■ オーバーロード解決(" << name << ")" );
     265
     266    UserProc *result = _OverloadSolution( name, subs, isEnabledReturnType );
     267
     268    trace( "■■■ ここまで" );
     269    trace( "■■■■■■■■■■■■■■■■■■" );
     270    trace( "" );
     271
     272    return result;
    266273}
    267274
  • BasicCompiler_Common/Procedure.cpp

    r135 r140  
    487487    pGlobalProc->SetParamsAndReturnType( buffer + i, nowLine, true );
    488488
    489 #ifdef _DEBUG
     489
    490490    pGlobalProc->_paramStr = buffer + i;
    491 #endif
     491
    492492
    493493
  • BasicCompiler_Common/Procedure.h

    r116 r140  
    9292class UserProc : public Procedure
    9393{
    94 #ifdef _DEBUG
    9594public:
    9695    string _paramStr;
    97 #endif
    9896
    9997private:
  • BasicCompiler_Common/Subroutine.cpp

    r135 r140  
    602602    pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic );
    603603
    604 #ifdef _DEBUG
    605604    pUserProc->_paramStr = buffer + i;
    606 #endif
    607605
    608606
  • BasicCompiler_Common/Type.cpp

    r131 r140  
    490490
    491491        if( !( index == 0 || index == -1 ) ){
     492            if( pClass->GetNamespaceScopes().size() >= 1 )
     493            {
     494                return pClass->GetNamespaceScopes().ToString() + "." + pClass->GetName();
     495            }
    492496            return pClass->GetName();
    493497        }
  • BasicCompiler_Common/VarList.cpp

    r137 r140  
    155155}
    156156void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr){
    157     int i;
    158157    char VarData[VN_SIZE],VarName[VN_SIZE];
    159158    TV_INSERTSTRUCT tv;
     
    165164    tv.item.pszText=VarData;
    166165
    167     for(i=0;i<objClass.iMemberNum;i++){
     166    BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
    168167        if(bPtr){
    169168            lstrcpy(VarName,"->");
    170             lstrcat(VarName,objClass.ppobj_Member[i]->GetName().c_str());
     169            lstrcat(VarName,pMember->GetName().c_str());
    171170        }
    172171        else{
    173172            lstrcpy(VarName,".");
    174             lstrcat(VarName,objClass.ppobj_Member[i]->GetName().c_str());
     173            lstrcat(VarName,pMember->GetName().c_str());
    175174        }
    176175
    177176        LONG_PTR offset;
    178177        int i2;
    179         offset=objClass.GetMemberOffset( objClass.ppobj_Member[i]->GetName().c_str(), &i2 );
    180 
    181         if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
     178        offset=objClass.GetMemberOffset( pMember->GetName().c_str(), &i2 );
     179
     180        if(pMember->SubScripts[0]!=-1){
    182181            //構造体内の配列
    183182            sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
     
    188187            VarList_Array(hVarTree,hParent,
    189188                pTopOffset+offset,
    190                 objClass.ppobj_Member[i]->GetType(),
    191                 objClass.ppobj_Member[i]->SubScripts);
     189                pMember->GetType(),
     190                pMember->SubScripts);
    192191        }
    193192        else{
     
    196195                &tv,
    197196                VarName,
    198                 objClass.ppobj_Member[i]->GetType(),
     197                pMember->GetType(),
    199198                pTopOffset+offset);
    200199        }
     
    323322}
    324323void RefreshLocalVar(void){
    325     int i,i2,i3,sw;
     324    int i2,i3,sw;
    326325    char temporary[VN_SIZE];
    327326    TV_INSERTSTRUCT tv;
     
    415414    //Thisポインタを取得
    416415    LONG_PTR pThis;
    417     const Variable *pVar = pUserProc->localVars.Find( "_System_LocalThis" );
     416    const Variable *pVar = pUserProc->localVars.Find( Symbol( "_System_LocalThis" ) );
    418417    if( !pVar ){
    419418        return;
     
    422421    ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&accessBytes);
    423422
    424     for(i=0;i<pUserProc->GetParentClassPtr()->iMemberNum;i++){
    425         offset=pUserProc->GetParentClassPtr()->GetMemberOffset( pUserProc->GetParentClassPtr()->ppobj_Member[i]->GetName().c_str(),&i2);
    426 
    427         if(pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts[0]!=-1){
     423    BOOST_FOREACH( CMember *pMember, pUserProc->GetParentClassPtr()->GetDynamicMembers() ){
     424        offset=pUserProc->GetParentClassPtr()->GetMemberOffset( pMember->GetName().c_str(),&i2);
     425
     426        if(pMember->SubScripts[0]!=-1){
    428427            //配列
    429428            sprintf(temporary,"%s %s(&H%X)",
    430                 pUserProc->GetParentClassPtr()->ppobj_Member[i]->GetName().c_str(),
     429                pMember->GetName().c_str(),
    431430                STRING_ARRAY,
    432431                (ULONG_PTR)offset);
     
    437436            VarList_Array(hVarTree_This,hParent,
    438437                pThis+offset,
    439                 pUserProc->GetParentClassPtr()->ppobj_Member[i]->GetType(),
    440                 pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts);
     438                pMember->GetType(),
     439                pMember->SubScripts);
    441440        }
    442441        else{
    443442            VarList_Insert(hVarTree_This,&tv,
    444                 pUserProc->GetParentClassPtr()->ppobj_Member[i]->GetName().c_str(),
    445                 pUserProc->GetParentClassPtr()->ppobj_Member[i]->GetType(),
     443                pMember->GetName().c_str(),
     444                pMember->GetType(),
    446445                pThis+offset);
    447446        }
  • BasicCompiler_Common/Variable.cpp

    r103 r140  
    11#include "common.h"
    22
    3 bool Variable::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
     3bool Variable::IsEqualSymbol( const Symbol &symbol, bool isSupportStaticMember ) const
    44{
    5     if( GetName() != name ){
    6         return false;
    7     }
    8     return NamespaceScopes::IsSameArea( this->namespaceScopes, namespaceScopes );
    9 }
    10 bool Variable::IsEqualSymbol( const string &fullName ) const
    11 {
    12     char AreaName[VN_SIZE] = "";        //オブジェクト変数
    13     char NestName[VN_SIZE] = "";        //入れ子メンバ
    14     bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
    15 
    16     if( IsEqualSymbol( NamespaceScopes( AreaName ), NestName ) ){
     5    if( GetName() == symbol.GetName()
     6        && NamespaceScopes::IsSameArea( this->namespaceScopes, symbol.GetNamespaceScopes() ) )
     7    {
    178        return true;
    189    }
    1910
    20     if( isNest ){
     11    if( isSupportStaticMember && symbol.GetNamespaceScopes().size() >= 1 )
     12    {
    2113        // 静的メンバを考慮
     14        NamespaceScopes namespaceScopes( symbol.GetNamespaceScopes() );
     15        string name = namespaceScopes[namespaceScopes.size()-1] + "." + symbol.GetName();
     16        namespaceScopes.pop_back();
    2217
    23         char AreaName2[VN_SIZE] = "";       //オブジェクト変数
    24         char NestName2[VN_SIZE] = "";       //入れ子メンバ
    25         bool isNest = SplitMemberName( AreaName, AreaName2, NestName2 );
    26         lstrcat( NestName2, "." );
    27         lstrcat( NestName2, NestName );
    28 
    29         return IsEqualSymbol( NamespaceScopes( AreaName2 ), NestName2 );
     18        return IsEqualSymbol( Symbol( namespaceScopes, name ), false );
    3019    }
    31 
    3220    return false;
    3321}
  • BasicCompiler_Common/Variable.h

    r103 r140  
    22
    33#include "Type.h"
     4#include <Symbol.h>
    45
    56class Variable : public Type
     
    6162    }
    6263
    63     bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const;
    64     bool IsEqualSymbol( const string &name ) const;
     64    bool IsEqualSymbol( const Symbol &symbol, bool isSupportStaticMember = true ) const;
    6565
    6666    void ConstOff(){
     
    157157    }
    158158
    159     bool DuplicateCheck( const string &varName ) const
     159    bool DuplicateCheck( const Symbol &symbol ) const
    160160    {
    161161        //レキシカルスコープを考慮して重複判定
     
    165165                && var.ScopeLevel == obj_LexScopes.GetNowLevel()    //現在のスコープと同一レベル
    166166                ){
    167                     if( var.IsEqualSymbol( varName ) ){
     167                    if( var.IsEqualSymbol( symbol ) ){
    168168                        return true;
    169169                    }
     
    173173    }
    174174
    175     const Variable *BackSearch( const string &varName ) const
     175    const Variable *BackSearch( const Symbol &symbol ) const
    176176    {
    177177        //レキシカルスコープを考慮してバックサーチ
     
    181181                && var.ScopeLevel <= obj_LexScopes.GetNowLevel()    //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
    182182                ){
    183                     if( var.IsEqualSymbol( varName ) ){
     183                    if( var.IsEqualSymbol( symbol ) ){
    184184                        return &var;
    185185                    }
     
    189189    }
    190190
    191     const Variable *Find( const string &varName )const
     191    const Variable *Find( const Symbol &symbol )const
    192192    {
    193193        int max = (int)this->size();
    194194        for( int i=0; i<max; i++ ){
    195195            Variable *pVar = (*this)[i];
    196             if( pVar->IsEqualSymbol( varName ) ){
     196            if( pVar->IsEqualSymbol( symbol ) ){
    197197                return pVar;
    198198            }
     
    205205
    206206
     207
  • BasicCompiler_Common/VariableOpe.cpp

    r138 r140  
    547547bool GetMemberType( const CClass &objClass, const char *lpszMember, Type &resultType, BOOL bPrivateAccess, bool isErrorEnabled){
    548548    extern int cp;
    549     int i;
    550549
    551550    //クラス、配列の構成要素を解析する
     
    558557    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
    559558
    560     for(i=0;i<objClass.iMemberNum;i++){
    561         if( objClass.ppobj_Member[i]->GetName() == VarName ){
     559    bool isFound = false;
     560    CMember *pMember = NULL;
     561    BOOST_FOREACH( pMember, objClass.GetDynamicMembers() ){
     562        if( pMember->GetName() == VarName ){
     563            isFound = true;
    562564            break;
    563565        }
    564566    }
    565     if(i==objClass.iMemberNum){
     567    if( !isFound ){
    566568        if(isErrorEnabled) SetError(103,VarName,cp);
    567569        return false;
     
    571573    if( &objClass == pobj_CompilingClass ){
    572574        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    573         if( objClass.ppobj_Member[i]->IsNoneAccess() ){
     575        if( pMember->IsNoneAccess() ){
    574576            if(isErrorEnabled) SetError(107,VarName,cp);
    575577            return false;
     
    577579    }
    578580    else{
    579         if(( bPrivateAccess==0 && objClass.ppobj_Member[i]->IsPrivate() )||
    580             objClass.ppobj_Member[i]->IsNoneAccess() ){
     581        if(( bPrivateAccess==0 && pMember->IsPrivate() )||
     582            pMember->IsNoneAccess() ){
    581583            if(isErrorEnabled) SetError(107,VarName,cp);
    582584            return false;
    583585        }
    584         else if( bPrivateAccess==0 && objClass.ppobj_Member[i]->IsProtected() ){
     586        else if( bPrivateAccess==0 && pMember->IsProtected() ){
    585587            if(isErrorEnabled) SetError(108,VarName,cp);
    586588            return false;
     
    588590    }
    589591
    590     resultType = objClass.ppobj_Member[i]->GetType();
     592    resultType = pMember->GetType();
    591593
    592594    //ポインタ変数の場合
    593595    if( resultType.IsPointer() ){
    594         if(objClass.ppobj_Member[i]->SubScripts[0]==-1){
     596        if(pMember->SubScripts[0]==-1){
    595597            lstrcpy(lpPtrOffset,array);
    596598            array[0]=0;
     
    607609        //入れ子構造の場合
    608610
    609         return GetMemberType( objClass.ppobj_Member[i]->GetType().GetClass(),
     611        return GetMemberType( pMember->GetType().GetClass(),
    610612            NestMember,
    611613            resultType,
     
    614616    }
    615617
    616     if(array[0]==0&&objClass.ppobj_Member[i]->SubScripts[0]!=-1){
     618    if(array[0]==0&&pMember->SubScripts[0]!=-1){
    617619        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    618620        return true;
     
    633635}
    634636bool GetVarType( const char *nameBuffer, Type &resultType, bool isErrorEnabled){
    635     int i;
    636637    char variable[VN_SIZE];
    637638
     
    668669        /////////////////
    669670
    670         pVar = UserProc::CompilingUserProc().localVars.BackSearch( VarName );
     671        pVar = UserProc::CompilingUserProc().localVars.BackSearch( Symbol( VarName ) );
    671672        if( pVar ){
    672673            goto ok;
     
    693694            //クラス内メンバを参照するとき(通常)
    694695
    695             for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
    696                 if( pobj_CompilingClass->ppobj_Member[i]->GetName() == VarName ){
     696            bool isFound = false;
     697            BOOST_FOREACH( CMember *pMember, pobj_CompilingClass->GetDynamicMembers() ){
     698                if( pMember->GetName() == VarName ){
     699                    isFound = true;
    697700                    break;
    698701                }
    699702            }
    700             if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
     703            if( !isFound ) goto NonClassMember;
    701704        }
    702705
     
    715718        GetNowStaticVarFullName(VarName,temporary);
    716719
    717         pVar = globalVars.Find( temporary );
     720        pVar = globalVars.Find( Symbol( temporary ) );
    718721        if( pVar ){
    719722            goto ok;
     
    744747        sprintf(temp2,"%s.%s",VarName,temporary);
    745748
    746         pVar = globalVars.Find( temp2 );
     749        pVar = globalVars.Find( Symbol( temp2 ) );
    747750        if( pVar ){
    748751            lstrcpy(member,tempMember);
     
    757760        sprintf(temp2,"%s.%s",pobj_CompilingClass->GetName().c_str(),VarName);
    758761
    759         pVar = globalVars.Find( temp2 );
     762        pVar = globalVars.Find( Symbol( temp2 ) );
    760763        if( pVar ){
    761764            goto ok;
     
    768771    ////////////////////
    769772
    770     pVar = globalVars.BackSearch( VarName );
     773    pVar = globalVars.BackSearch( Symbol( VarName ) );
    771774    if( pVar ){
    772775        goto ok;
     
    10411044    extern int AllGlobalVarSize;
    10421045
    1043     if( globalVars.DuplicateCheck( name ) ){
     1046    if( globalVars.DuplicateCheck( Symbol( name ) ) ){
    10441047        //2重定義のエラー
    10451048        SetError(15,name,cp);
  • BasicCompiler_Common/WatchList.cpp

    r137 r140  
    104104
    105105int Debugging_GetMember( const CClass &objClass,char *member,RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
    106     int i,i2;
     106    int i2;
    107107
    108108    //直接参照に切り替え
     
    124124    ////////////////////////////
    125125
    126     int offset = objClass.GetMemberOffset( VarName, &i );
    127     if(i==objClass.iMemberNum) return 0;
     126    int memberIndex;
     127    int offset = objClass.GetMemberOffset( VarName, &memberIndex );
     128    if(memberIndex==objClass.GetDynamicMembers().size()) return 0;
     129
     130    CMember *pMember = objClass.GetDynamicMembers()[memberIndex];
    128131
    129132
    130133    //アクセシビリティをチェック
    131     if(( bPrivateAccess==0 && objClass.ppobj_Member[i]->IsPrivate() )||
    132         objClass.ppobj_Member[i]->IsNoneAccess() ){
     134    if(( bPrivateAccess==0 && pMember->IsPrivate() )||
     135        pMember->IsNoneAccess() ){
    133136        return 0;
    134137    }
    135     else if(bPrivateAccess==0&&objClass.ppobj_Member[i]->IsProtected())
     138    else if(bPrivateAccess==0&&pMember->IsProtected())
    136139        return 0;
    137140
    138     resultType = objClass.ppobj_Member[i]->GetType();
     141    resultType = pMember->GetType();
    139142
    140143    //ポインタ変数の場合
    141144    if( resultType.IsPointer() ){
    142         if(objClass.ppobj_Member[i]->SubScripts[0]==-1){
     145        if(pMember->SubScripts[0]==-1){
    143146            lstrcpy(lpPtrOffset,array);
    144147            array[0]=0;
     
    154157        //配列オフセット
    155158        i2=Debugging_GetArray(
    156             objClass.ppobj_Member[i]->SubScripts,
     159            pMember->SubScripts,
    157160            array,
    158161            resultType,
     
    167170        }
    168171    }
    169     else if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
     172    else if(pMember->SubScripts[0]!=-1){
    170173        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    171174    }
     
    209212        }
    210213
    211         i2=Debugging_GetMember(objClass.ppobj_Member[i]->GetType().GetClass(),
     214        i2=Debugging_GetMember(pMember->GetType().GetClass(),
    212215            NestMember,
    213216            pRelativeVar,
     
    322325int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss){
    323326    extern HANDLE hDebugProcess;
    324     int i,i2,i3;
     327    int i2,i3;
    325328    char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    326329    LONG_PTR lpData;
     
    339342    /////////////////
    340343    if( UserProc::IsLocalAreaCompiling() ){
    341         const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( VarName );
     344        const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( Symbol( VarName ) );
    342345
    343346        if( pVar ){
     
    379382            //クラス内メンバを参照するとき(通常)
    380383
    381             for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
    382                 if( pobj_CompilingClass->ppobj_Member[i]->GetName() == VarName ){
     384            bool isFound = false;
     385            BOOST_FOREACH( CMember *pMember, pobj_CompilingClass->GetDynamicMembers() ){
     386                if( pMember->GetName() == VarName ){
     387                    isFound = true;
    383388                    break;
    384389                }
    385390            }
    386             if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
     391            if( !isFound ) goto NonClassMember;
    387392        }
    388393
  • BasicCompiler_Common/common.h

    r135 r140  
    4747
    4848#ifdef _AMD64_
    49 #define VER_INFO        "(x64) CP4(rev.265)"
     49#define VER_INFO        "(x64) (rev.275)"
    5050#else
    51 #define VER_INFO        "CP4(rev.265)"
     51#define VER_INFO        "(rev.275)"
    5252#endif
    5353
     
    153153#define EXE_HEADER_SIZE 0x1000
    154154
     155
     156// ログ生成を行うためのクラス
     157#include <logger.h>
    155158
    156159// クラス管理用のクラス
  • BasicCompiler_Common/error.cpp

    r131 r140  
    344344    SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)temp2);
    345345
     346
    346347    if(num==-2){
    347348        //コンパイルメッセージ
     
    355356            extern BOOL bError;
    356357            bError=1;
     358
     359            // ログに出力
     360            trace( "error - " << temp2 );
    357361        }
    358362        else{
    359363            extern int WarningNum;
    360364            WarningNum++;
     365
     366            // ログに出力
     367            trace( "warning - " << temp2 );
    361368        }
    362369    }
  • BasicCompiler_Common/include/Member.h

    r138 r140  
    6363    static void InitStaticMember(void);
    6464};
     65typedef std::vector<CMember *> Members;
  • BasicCompiler_Common/src/Namespace.cpp

    r107 r140  
    33
    44NamespaceScopes::NamespaceScopes( const string &namespaceStr ){
    5     int i = 0;
    6     while( i < (int)namespaceStr.size() ){
    7         char temporary[VN_SIZE];
    8         for( int i2=0; ; i2++, i++ ){
    9             if( namespaceStr[i] == '.' || namespaceStr[i] == '\0' ){
    10                 temporary[i2] = 0;
    11                 break;
    12             }
    13             temporary[i2] = namespaceStr[i];
     5    if( namespaceStr.size() == 0 ){
     6        return;
     7    }
     8
     9    string::size_type i = 0;
     10    while( true ){
     11        string::size_type i2 = namespaceStr.find( '.', i );
     12
     13        string tempName = namespaceStr.substr( i, i2-i );
     14
     15        push_back( tempName );
     16
     17        if( i2 == string::npos ){
     18            break;
    1419        }
    15         push_back( temporary );
    1620
    17         if( namespaceStr[i] == '.' ){
    18             i++;
    19         }
     21        i = i2 + 1;
    2022    }
    2123}
Note: See TracChangeset for help on using the changeset viewer.