Changeset 28 in dev for BasicCompiler_Common/Class.cpp


Ignore:
Timestamp:
Jan 8, 2007, 6:34:44 AM (17 years ago)
Author:
dai_9181
Message:

・【32ビットコンパイラ】戻り値に実態オブジェクトを持つインデクサを呼び出すと強制終了してしまうバグを修正。
・仮想関数のオーバーロードが正常に動作しないバグを修正。
・純仮想関数(抽象メソッド)が仮想関数でオーバーロードされていると、クラスのインスタンスが生成できてしまうバグを修正。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Class.cpp

    r27 r28  
    2525    char init_buf[VN_SIZE];
    2626    char constract_parameter[VN_SIZE];
    27     if(!GetDimentionFormat(buffer,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter))
    28         return;
     27    GetDimentionFormat(buffer,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter);
    2928
    3029    //重複チェック
    3130    if(pobj_c->DupliCheckAll(VarName)){
    3231        SetError(15,VarName,cp);
    33         return;
    3432    }
    3533
    3634    if(TypeInfo.type==DEF_OBJECT){
    37         if(TypeInfo.u.pobj_Class->IsHoldAbstractFunction()){
     35        if(TypeInfo.u.pobj_Class->IsAbstract()){
    3836            //抽象クラスだったとき
    3937            SetError(125,TypeInfo.u.pobj_Class->name,cp);
     
    303301        if( psi == ppobj_StaticMethod[i]->psi ) break;
    304302    }
    305     if( i == iMethodNum ){
     303    if( i == iStaticMethodNum ){
    306304        return NULL;
    307305    }
     
    326324}
    327325LONG_PTR CClass::GetVtblGlobalOffset(void){
     326
     327    //既に存在する場合はそれを返す
    328328    if(vtbl_offset!=-1) return vtbl_offset;
     329
     330
     331    //////////////////////////////////////
     332    // 存在しないときは新たに生成する
     333    //////////////////////////////////////
    329334
    330335    SUBINFO **ppsi;
     
    332337
    333338    //関数テーブルに値をセット
    334     int i,i2,i3=0;
    335     for(i=0;i < iMethodNum;i++){
     339    for( int i=0, i2=0; i < iMethodNum; i++ ){
    336340        if(ppobj_Method[i]->bVirtual){
    337             for(i2=iMethodNum-1; i2>=i; i2--){
    338                 if(lstrcmp(ppobj_Method[i]->psi->name,ppobj_Method[i2]->psi->name)==0){
    339                     pobj_CompilingClass->ppobj_Method[i2]->psi->bUse=1;
    340 
    341                     if(ppobj_Method[i2]->bAbstract){
    342                         extern int cp;
    343                         SetError(300,NULL,cp);
    344 
    345                         ppsi[i3]=0;
    346                     }
    347                     else ppsi[i3]=pobj_CompilingClass->ppobj_Method[i2]->psi;
    348                     i3++;
    349 
    350                     break;
    351                 }
    352             }
     341            ppobj_Method[i]->psi->bUse=1;
     342
     343            if(ppobj_Method[i]->bAbstract){
     344                extern int cp;
     345                SetError(300,NULL,cp);
     346
     347                ppsi[i2]=0;
     348            }
     349            else ppsi[i2]=ppobj_Method[i]->psi;
     350            i2++;
    353351        }
    354352    }
     
    356354    vtbl_offset=AddDataTable((char *)ppsi,vtbl_num*sizeof(LONG_PTR));
    357355
    358     for(i=0;i<vtbl_num;i++){
     356    for( int i=0; i < vtbl_num; i++ ){
    359357        pobj_Reloc->AddSchedule_DataSection(vtbl_offset+i*sizeof(LONG_PTR));
    360358    }
     
    379377    }
    380378}
    381 BOOL CClass::IsHoldAbstractFunction(void){
     379bool CClass::IsAbstract(){
    382380    //未実装の仮想関数を持つ場合は1を返す
    383381
    384     int i,i2,i3=0;
    385     for(i=0;i < iMethodNum;i++){
     382    for( int i=0; i < iMethodNum; i++ ){
    386383        if(ppobj_Method[i]->bVirtual){
    387             for(i2=iMethodNum-1; i2>=i; i2--){
    388                 if(lstrcmp(ppobj_Method[i]->psi->name,ppobj_Method[i2]->psi->name)==0){
    389 
    390                     if(ppobj_Method[i2]->bAbstract){
    391                         return 1;
    392                     }
    393 
    394                     break;
    395                 }
     384            if(ppobj_Method[i]->bAbstract){
     385                return true;
    396386            }
    397387        }
     
    399389
    400390    //コンポジションの関係にあるメンバも検査する
    401     for(i=0;i < iMemberNum;i++){
     391    for(int i=0;i < iMemberNum;i++){
    402392        if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
    403             if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsHoldAbstractFunction())
    404                 return 1;
    405         }
    406     }
    407 
    408     return 0;
     393            if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsAbstract())
     394                return true;
     395        }
     396    }
     397
     398    return false;
    409399}
    410400
     
    460450    return isCompilingDestructor;
    461451}
     452
     453
     454//自身と等しいクラスかどうかを確認
     455bool CClass::IsEquals( CClass *pClass ){
     456    if( this == pClass ) return true;
     457    return false;
     458}
     459
     460//自身の派生クラスかどうかを確認
     461bool CClass::IsSubClass( CClass *pClass ){
     462    pClass = pClass->pobj_InheritsClass;
     463    while( pClass ){
     464        if( this == pClass ) return true;
     465        pClass = pClass->pobj_InheritsClass;
     466    }
     467    return false;
     468}
     469
    462470
    463471
Note: See TracChangeset for help on using the changeset viewer.