Changeset 141 in dev


Ignore:
Timestamp:
Jun 15, 2007, 1:12:14 PM (17 years ago)
Author:
dai_9181
Message:

CClass::vtblNumをリファクタリングした。
インターフェイスを継承したとき、Objectクラスがインターフェイスの後ろに配置されてしまうバグを修正(どんなときも、Objectクラスが一番最初に継承されるべき)

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_ProcOp.cpp

    r140 r141  
    515515
    516516            //仮想関数テーブルを初期化
    517             if(pobj_CompilingClass->vtbl_num&&
    518                 pobj_CompilingClass->IsAbstract()==false){
     517            if( pobj_CompilingClass->IsExistVirtualFunctions()
     518                && !pobj_CompilingClass->IsAbstract() ){
    519519                    //関数テーブルに値をセット
    520520                    int offset = (int)pobj_CompilingClass->GetVtblGlobalOffset();
  • BasicCompiler64/Compile_ProcOp.cpp

    r140 r141  
    567567
    568568            //仮想関数テーブルを初期化
    569             if(pobj_CompilingClass->vtbl_num&&
    570                 pobj_CompilingClass->IsAbstract()==false){
     569            if( pobj_CompilingClass->IsExistVirtualFunctions()
     570                && !pobj_CompilingClass->IsAbstract() ){
    571571                    //関数テーブルに値をセット
    572572                    int offset = (int)pobj_CompilingClass->GetVtblGlobalOffset();
  • BasicCompiler_Common/Class.cpp

    r140 r141  
    2222    , classType( Class )
    2323    , pobj_InheritsClass( NULL )
    24     , vtbl_num( 0 )
     24    , vtblNum( 0 )
    2525    , iAlign( 0 )
    2626    , vtbl_offset( -1 )
     
    9090        const CClass *pInheritsClass = pobj_DBClass->Find(temporary);
    9191        if( !pInheritsClass ){
    92             SetError(106,temporary,i);
     92            SetError(106,temporary,nowLine);
    9393            return false;
    9494        }
    9595
    9696        if( pInheritsClass->IsInterface() ){
    97             // インターフェイスを継承する
    98             if( !InheritsInterface( *pInheritsClass, nowLine ) ){
    99                 return false;
    100             }
     97            // インターフェイスはあとで継承する
    10198        }
    10299        else if( pInheritsClass->IsClass() ){
     
    127124        }
    128125
    129         if( !InheritsClass( *pObjectClass, i ) ){
     126        if( !InheritsClass( *pObjectClass, nowLine ) ){
    130127            return false;
    131128        }
     129    }
     130
     131    i=0;
     132    while( true ){
     133
     134        char temporary[VN_SIZE];
     135        for( int i2=0;; i++, i2++ ){
     136            if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
     137                temporary[i2] = 0;
     138                break;
     139            }
     140            temporary[i2] = inheritNames[i];
     141        }
     142
     143        //継承元クラスを取得
     144        const CClass *pInheritsClass = pobj_DBClass->Find(temporary);
     145        if( !pInheritsClass ){
     146            SetError(106,temporary,nowLine);
     147            return false;
     148        }
     149
     150        if( pInheritsClass->IsInterface() ){
     151            // インターフェイスを継承する
     152            if( !InheritsInterface( *pInheritsClass, nowLine ) ){
     153                return false;
     154            }
     155        }
     156        else if( pInheritsClass->IsClass() ){
     157            // クラスはさっき継承した
     158        }
     159        else{
     160            SetError(135,NULL,nowLine);
     161            return false;
     162        }
     163
     164        if( inheritNames[i] == '\0' ){
     165            break;
     166        }
     167        i++;
    132168    }
    133169
     
    189225
    190226    //仮想関数の数
    191     vtbl_num += inheritsClass.vtbl_num;
     227    AddVtblNum( inheritsClass.GetVtblNum() );
    192228
    193229    //継承先のクラスをメンバとして保持する
     
    235271    }
    236272
    237     interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtbl_num ) );
     273    interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtblNum ) );
    238274
    239275    //仮想関数の数
    240     vtbl_num += inheritsInterface.vtbl_num;
     276    AddVtblNum( inheritsInterface.GetVtblNum() );
    241277
    242278    return true;
     
    308344int CClass::GetMemberOffset( const char *memberName, int *pMemberNum ) const
    309345{
    310     int i2,offset;
     346    int i2;
    311347
    312348    //仮想関数が存在する場合は関数リストへのポインタのサイズを追加
    313     if(vtbl_num) offset=PTR_SIZE;
    314     else offset=0;
     349    int offset = IsExistVirtualFunctions() ? PTR_SIZE : 0;
    315350
    316351    int alignment;
     
    381416int CClass::GetAlignment() const
    382417{
    383     int alignment,member_size;
    384 
    385     if(vtbl_num) alignment=PTR_SIZE;
    386     else alignment=0;
     418    //仮想関数が存在する場合は関数リストへのポインタのサイズを追加
     419    int alignment = IsExistVirtualFunctions() ? PTR_SIZE : 0;
    387420
    388421    BOOST_FOREACH( CMember *pMember, dynamicMembers ){
     422        int member_size;
    389423        if(pMember->GetType().IsStruct()){
    390424            //メンバクラスのアラインメントを取得
     
    431465
    432466    UserProc **ppsi;
    433     ppsi=(UserProc **)HeapAlloc(hHeap,0,vtbl_num*sizeof(GlobalProc *));
     467    ppsi=(UserProc **)HeapAlloc(hHeap,0,GetVtblNum()*sizeof(GlobalProc *));
    434468
    435469    //関数テーブルに値をセット
     
    452486    }
    453487
    454     vtbl_offset=dataTable.AddBinary((void *)ppsi,vtbl_num*sizeof(LONG_PTR));
    455 
    456     for( int i=0; i < vtbl_num; i++ ){
     488    vtbl_offset=dataTable.AddBinary((void *)ppsi,GetVtblNum()*sizeof(LONG_PTR));
     489
     490    for( int i=0; i < GetVtblNum(); i++ ){
    457491        pobj_Reloc->AddSchedule_DataSection(vtbl_offset+i*sizeof(LONG_PTR));
    458492    }
     
    469503
    470504    int i;
    471     for(i=0;i<vtbl_num;i++){
     505    for(i=0;i<GetVtblNum();i++){
    472506        GlobalProc *pUserProc;
    473507        pUserProc=(GlobalProc *)pVtbl[i];
     
    938972
    939973    if( isVirtual ){
    940         pobj_c->vtbl_num++;
     974        pobj_c->AddVtblNum( 1 );
    941975    }
    942976
     
    10811115
    10821116                //仮想関数の数を初期化
    1083                 pobj_c->vtbl_num=0;
     1117                pobj_c->SetVtblNum( 0 );
    10841118            }
    10851119Interface_InheritsError:
     
    12141248
    12151249                // 仮想関数の数を初期化
    1216                 pobj_c->vtbl_num = 0;
     1250                pobj_c->SetVtblNum( 0 );
    12171251            }
    12181252            else{
  • BasicCompiler_Common/Class.h

    r140 r141  
    6565    int ConstructorMemberSubIndex;
    6666    int DestructorMemberSubIndex;
     67    int vtblNum;                    // 仮想関数の数
    6768
    6869    // 静的メソッド
     
    8485    const CClass *pobj_InheritsClass;
    8586
    86     //仮想関数の数
    87     int vtbl_num;
    88 
    8987    //アラインメント値
    9088    int iAlign;
     
    156154    //デストラクタ メソッドを取得
    157155    const CMethod *GetDestructorMethod() const;
     156
     157    // vtblに存在する仮想関数の数
     158    int GetVtblNum() const
     159    {
     160        return vtblNum;
     161    }
     162    void SetVtblNum( int vtblNum )
     163    {
     164        this->vtblNum = vtblNum;
     165    }
     166    void AddVtblNum( int vtblNum )
     167    {
     168        this->vtblNum += vtblNum;
     169    }
     170    bool IsExistVirtualFunctions() const
     171    {
     172        return ( vtblNum > 0 );
     173    }
    158174
    159175    // メンバの総合サイズを取得
  • BasicCompiler_Common/DebugMiddleFile.cpp

    r140 r141  
    316316
    317317        //仮想関数の数
    318         *(long *)(buffer+i2)=pobj_c->vtbl_num;
     318        *(long *)(buffer+i2)=pobj_c->GetVtblNum();
    319319        i2+=sizeof(long);
    320320
     
    698698
    699699        //仮想関数の数
    700         pobj_c->vtbl_num=*(long *)(buffer+i2);
     700        pobj_c->SetVtblNum( *(long *)(buffer+i2) );
    701701        i2+=sizeof(long);
    702702
  • BasicCompiler_Common/common.h

    r140 r141  
    4747
    4848#ifdef _AMD64_
    49 #define VER_INFO        "(x64) (rev.275)"
     49#define VER_INFO        "(x64) (rev.280)"
    5050#else
    51 #define VER_INFO        "(rev.275)"
     51#define VER_INFO        "(rev.280)"
    5252#endif
    5353
Note: See TracChangeset for help on using the changeset viewer.