Changeset 140 in dev for BasicCompiler_Common


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

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

Location:
BasicCompiler_Common
Files:
3 added
18 edited

Legend:

Unmodified
Added
Removed
  • 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.