Changeset 140 in dev for BasicCompiler_Common/Class.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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++;
Note: See TracChangeset for help on using the changeset viewer.