Changeset 131 in dev for BasicCompiler_Common/Class.cpp


Ignore:
Timestamp:
Jun 4, 2007, 7:49:17 AM (17 years ago)
Author:
dai_9181
Message:

Prototypeクラスを用意した。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Class.cpp

    r129 r131  
    102102        foreach( CMember *member, objClass.staticMembers ){
    103103            char temporary[VN_SIZE];
    104             sprintf(temporary,"%s.%s",objClass.name,member->name);
     104            sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->name);
    105105            dim(
    106106                temporary,
     
    151151
    152152
    153 CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name )
    154     : namespaceScopes( namespaceScopes )
     153CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name )
     154    : Prototype( namespaceScopes, name )
    155155    , importedNamespaces( importedNamespaces )
    156156    , ConstructorMemberSubIndex( 0 )
     
    168168    , pobj_NextClass( NULL )
    169169{
    170     this->name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
    171     lstrcpy(this->name,name);
    172170}
    173171CClass::~CClass(){
    174172    int i;
    175 
    176     //クラス名
    177     HeapDefaultFree(name);
    178173
    179174    if(ppobj_Member){
     
    202197}
    203198
     199bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const
     200{
     201    BOOST_FOREACH( const InheritedInterface &objInterface, interfaces ){
     202        if( pInterfaceClass == &objInterface.GetInterfaceClass() ){
     203            return true;
     204        }
     205    }
     206    return false;
     207}
     208
    204209bool CClass::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
    205210{
     
    253258}
    254259
    255 bool CClass::Inherits( const CClass &inheritsClass, int nowLine ){
     260bool CClass::Inherits( const char *inheritNames, int nowLine ){
     261    int i = 0;
     262    bool isInheritsClass = false;
     263    while( true ){
     264
     265        char temporary[VN_SIZE];
     266        for( int i2=0;; i++, i2++ ){
     267            if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
     268                temporary[i2] = 0;
     269                break;
     270            }
     271            temporary[i2] = inheritNames[i];
     272        }
     273
     274        //継承元クラスを取得
     275        const CClass *pInheritsClass = pobj_DBClass->Find(temporary);
     276        if( !pInheritsClass ){
     277            SetError(106,temporary,i);
     278            return false;
     279        }
     280
     281        if( pInheritsClass->IsInterface() ){
     282            // インターフェイスを継承する
     283            if( !InheritsInterface( *pInheritsClass, nowLine ) ){
     284                return false;
     285            }
     286        }
     287        else if( pInheritsClass->IsClass() ){
     288            // クラスを継承する
     289            isInheritsClass = true;
     290
     291            if( !InheritsClass( *pInheritsClass, nowLine ) ){
     292                return false;
     293            }
     294        }
     295        else{
     296            SetError(135,NULL,nowLine);
     297            return false;
     298        }
     299
     300        if( inheritNames[i] == '\0' ){
     301            break;
     302        }
     303        i++;
     304    }
     305
     306    if( !isInheritsClass ){
     307        // クラスを一つも継承していないとき
     308        const CClass *pObjectClass = pobj_DBClass->Find("Object");
     309        if( !pObjectClass ){
     310            SetError(106,"Object",i);
     311            return false;
     312        }
     313
     314        if( !InheritsClass( *pObjectClass, i ) ){
     315            return false;
     316        }
     317    }
     318
     319    return true;
     320}
     321bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){
    256322
    257323    //ループ継承でないかをチェック
    258324    if(pobj_LoopRefCheck->check(inheritsClass)){
    259         SetError(123,inheritsClass.name,nowLine);
     325        SetError(123,inheritsClass.GetName(),nowLine);
    260326        return false;
    261327    }
     
    263329    if( inheritsClass.ppobj_Member == 0 ){
    264330        //継承先が読み取られていないとき
    265         pobj_LoopRefCheck->add(this->name);
    266         pobj_DBClass->GetClass_recur(inheritsClass.name);
    267         pobj_LoopRefCheck->del(this->name);
     331        pobj_LoopRefCheck->add(this->GetName().c_str());
     332        pobj_DBClass->GetClass_recur(inheritsClass.GetName().c_str());
     333        pobj_LoopRefCheck->del(this->GetName().c_str());
    268334    }
    269335
     
    317383    //ループ継承でないかをチェック
    318384    if(pobj_LoopRefCheck->check(inheritsInterface)){
    319         SetError(123,inheritsInterface.name,nowLine);
     385        SetError(123,inheritsInterface.GetName(),nowLine);
    320386        return false;
    321387    }
     
    323389    if( inheritsInterface.ppobj_Member == 0 ){
    324390        //継承先が読み取られていないとき
    325         pobj_LoopRefCheck->add(this->name);
    326         pobj_DBClass->GetClass_recur(inheritsInterface.name);
    327         pobj_LoopRefCheck->del(this->name);
     391        pobj_LoopRefCheck->add(this->GetName().c_str());
     392        pobj_DBClass->GetClass_recur(inheritsInterface.GetName().c_str());
     393        pobj_LoopRefCheck->del(this->GetName().c_str());
    328394    }
    329395
     
    348414    }
    349415
     416    interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtbl_num ) );
     417
    350418    //仮想関数の数
    351419    vtbl_num += inheritsInterface.vtbl_num;
    352 
    353     /*
    354     TODO: インターフェイス向けの機構を作る
    355     //継承先のクラスをメンバとして保持する
    356     pobj_InheritsClass = &inheritsInterface;
    357     */
    358420
    359421    return true;
     
    404466    //メンバ
    405467    for( int i=0;i<iMemberNum;i++){
    406         if(lstrcmp(name,ppobj_Member[i]->name)==0){
     468        if( GetName() == ppobj_Member[i]->name ){
    407469            return 1;
    408470        }
     
    411473    //静的メンバ
    412474    foreach( CMember *member, staticMembers ){
    413         if( lstrcmp( name, member->name ) == 0 ){
     475        if( GetName() == member->name ){
    414476            return 1;
    415477        }
     
    10661128    BOOL fConstructor=0,bDestructor=0;
    10671129
    1068     if(lstrcmp(temporary,pobj_c->name)==0){
     1130    if(lstrcmp(temporary,pobj_c->GetName().c_str())==0){
    10691131        //コンストラクタの場合
    10701132
     
    10771139    else if(temporary[0]=='~'){
    10781140        //デストラクタの場合はその名前が正しいかチェックを行う
    1079         if(lstrcmp(temporary+1,pobj_c->name)!=0)
     1141        if(lstrcmp(temporary+1,pobj_c->GetName().c_str())!=0)
    10801142            SetError(117,NULL,nowLine);
    10811143        else
     
    11701232            if(pobj_LoopRefCheck->check(pMember->GetClass())){
    11711233                extern int cp;
    1172                 SetError(124,pMember->GetClass().name,cp);
     1234                SetError(124,pMember->GetClass().GetName(),cp);
    11731235                return 0;
    11741236            }
    11751237
    1176             pobj_LoopRefCheck->add(objClass.name);
     1238            pobj_LoopRefCheck->add(objClass.GetName().c_str());
    11771239
    11781240            i2=MemberVar_LoopRefCheck(pMember->GetClass());
    11791241            if(bRet==1) bRet=i2;
    11801242
    1181             pobj_LoopRefCheck->del(objClass.name);
     1243            pobj_LoopRefCheck->del(objClass.GetName().c_str());
    11821244        }
    11831245    }
     
    12431305
    12441306            if(lpszInheritsClass){
    1245                 if(lstrcmp(lpszInheritsClass,pobj_c->name)!=0){
     1307                if(lstrcmp(lpszInheritsClass,pobj_c->GetName().c_str())!=0){
    12461308                    //継承先先読み用
    12471309                    continue;
     
    12711333                }
    12721334
    1273                 if(lstrcmpi(temporary,pobj_c->name)==0){
     1335                if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
    12741336                    SetError(105,temporary,i);
    12751337                    goto Interface_InheritsError;
     
    12841346
    12851347                //継承させる
    1286                 if( !pobj_c->InheritsInterface( *pInheritsClass, i ) ){
     1348                if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){
    12871349                    goto Interface_InheritsError;
    12881350                }
     
    13941456
    13951457            if(lpszInheritsClass){
    1396                 if(lstrcmp(lpszInheritsClass,pobj_c->name)!=0){
     1458                if( pobj_c->GetName() != lpszInheritsClass ){
    13971459                    //継承先先読み用
    13981460                    continue;
     
    14181480            else dwAccess=ACCESS_PUBLIC;
    14191481
    1420             if( lstrcmp( pobj_c->name, "Object" ) == 0 || dwClassType == ESC_TYPE ){
    1421                 //継承無し
    1422                 pobj_c->pobj_InheritsClass=0;
    1423 
    1424                 //仮想関数の数を初期化
    1425                 pobj_c->vtbl_num=0;
     1482            if( pobj_c->GetName() == "Object" || dwClassType == ESC_TYPE ){
     1483                // 継承無し
     1484                pobj_c->pobj_InheritsClass = NULL;
     1485
     1486                // 仮想関数の数を初期化
     1487                pobj_c->vtbl_num = 0;
    14261488            }
    14271489            else{
     
    14391501                    }
    14401502
    1441                     if(lstrcmpi(temporary,pobj_c->name)==0){
     1503                    if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
    14421504                        SetError(105,temporary,i);
    14431505                        goto InheritsError;
     
    14501512                }
    14511513
    1452                 //継承元クラスを取得
    1453                 const CClass *pInheritsClass = Find(temporary);
    1454                 if( !pInheritsClass ){
    1455                     SetError(106,temporary,i);
    1456                     goto InheritsError;
    1457                 }
    1458 
    1459                 if( pInheritsClass->IsInterface() ){
    1460                     // クラスを継承していないとき
    1461                     const CClass *pObjectClass = Find("Object");
    1462                     if( !pObjectClass ){
    1463                         SetError(106,"Object",i);
    1464                         goto InheritsError;
    1465                     }
    1466 
    1467                     if( !pobj_c->Inherits( *pObjectClass, i ) ){
    1468                         goto InheritsError;
    1469                     }
    1470                 }
    1471 
    1472                 //継承させる
    1473                 if( !pobj_c->Inherits( *pInheritsClass, i ) ){
    1474                     goto InheritsError;
    1475                 }
     1514                pobj_c->Inherits( temporary, i );
    14761515            }
    14771516InheritsError:
     
    15961635                            if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().ppobj_Member==0){
    15971636                                //参照先が読み取られていないとき
    1598                                 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().name);
     1637                                GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().GetName().c_str());
    15991638                            }
    16001639                        }
     
    16031642                        if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){
    16041643                            //循環参照のチェック
    1605                             pobj_LoopRefCheck->add(pobj_c->name);
     1644                            pobj_LoopRefCheck->add(pobj_c->GetName().c_str());
    16061645                            if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass())){
    16071646                                //エラー回避
    16081647                                pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->SetBasicType( DEF_PTR_VOID );
    16091648                            }
    1610                             pobj_LoopRefCheck->del(pobj_c->name);
     1649                            pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
    16111650                        }
    16121651                    }
     
    17091748            , 1
    17101749            , ESC_NEW
    1711             , ""                        // 名前空間 (TODO: 実装)
    1712             , objClass.name             // クラス名
    1713             , referenceOffsetsBuffer    // 参照メンバオフセット配列
    1714             , numOfReference            // 参照メンバの個数
     1750            , ""                            // 名前空間 (TODO: 実装)
     1751            , objClass.GetName().c_str()    // クラス名
     1752            , referenceOffsetsBuffer        // 参照メンバオフセット配列
     1753            , numOfReference                // 参照メンバの個数
    17151754            );
    17161755
     
    17491788            sprintf( temporary
    17501789                , "tempType=Search(\"%s\",\"%s\")"
    1751                 , ""                // 名前空間 (TODO: 実装)
    1752                 , objClass.name     // クラス名
     1790                , ""                            // 名前空間 (TODO: 実装)
     1791                , objClass.GetName().c_str()    // クラス名
    17531792                );
    17541793
     
    17591798                , "tempType.SetBaseType(Search(\"%s\",\"%s\"))"
    17601799                , ""                                // 名前空間 (TODO: 実装)
    1761                 , objClass.pobj_InheritsClass->name // 基底クラス名
     1800                , objClass.pobj_InheritsClass->GetName().c_str()    // 基底クラス名
    17621801                );
    17631802
Note: See TracChangeset for help on using the changeset viewer.