Changeset 135 in dev for BasicCompiler_Common/Class.cpp


Ignore:
Timestamp:
Jun 6, 2007, 12:58:40 AM (17 years ago)
Author:
dai_9181
Message:

Method/Memberのリファクタリング

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Class.cpp

    r134 r135  
    1212
    1313CMember *pCompilingMethod;
    14 
    15 
    16 
    17 CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, bool isRef, char *buffer, int nowLine ){
    18     extern int cp;
    19 
    20                         if( strstr(buffer,"environVarName")){
    21                             int test=0;
    22                         }
    23 
    24     //構文を解析
    25     char VarName[VN_SIZE];
    26     char init_buf[VN_SIZE];
    27     char constract_parameter[VN_SIZE];
    28     GetDimentionFormat(buffer,VarName,SubScripts,*this,init_buf,constract_parameter);
    29 
    30     //重複チェック
    31     if(pobj_c->DupliCheckAll(VarName)){
    32         SetError(15,VarName,cp);
    33     }
    34 
    35     //メンバ名
    36     name=(char *)HeapAlloc(hHeap,0,lstrlen(VarName)+1);
    37     lstrcpy(name,VarName);
    38 
    39     //アクセス権
    40     dwAccess=access;
    41 
    42     //定数扱いかどうか
    43     this->isConst = isConst;
    44 
    45     //初期データ
    46     InitBuf=(char *)HeapAlloc(hHeap,0,lstrlen(init_buf)+1);
    47     lstrcpy(InitBuf,init_buf);
    48 
    49     //コンストラクタ用のパラメータ
    50     ConstractParameter=(char *)HeapAlloc(hHeap,0,lstrlen(constract_parameter)+1);
    51     lstrcpy(ConstractParameter,constract_parameter);
    52 
    53     //ソースコードの位置
    54     source_code_address=nowLine;
    55 }
    56 CMember::CMember(CMember &member):
    57     Type( member )
    58 {
    59 
    60     //name
    61     name=(char *)HeapAlloc(hHeap,0,lstrlen(member.name)+1);
    62     lstrcpy(name,member.name);
    63 
    64     //定数扱いかどうか
    65     isConst = member.isConst;
    66 
    67     //SubScripts
    68     memcpy(SubScripts,member.SubScripts,MAX_ARRAYDIM*sizeof(int));
    69 
    70     //ソースコードの位置
    71     source_code_address=member.source_code_address;
    72 }
    73 CMember::CMember(){
    74     memset(this,0,sizeof(CMember));
    75 }
    76 CMember::~CMember(){
    77     HeapDefaultFree(name);
    78     if(InitBuf) HeapDefaultFree(InitBuf);
    79     if(ConstractParameter) HeapDefaultFree(ConstractParameter);
    80 }
    81 
    82 bool CMember::IsConst(){
    83     return isConst;
    84 }
    85 
    86 void CMember::InitStaticMember(void){
    87     //静的メンバをグローバル領域に作成
    88 
    89     //イテレータをリセット
    90     extern CDBClass *pobj_DBClass;
    91     pobj_DBClass->Iterator_Reset();
    92 
    93     int back_cp=cp;
    94 
    95     while(pobj_DBClass->Iterator_HasNext()){
    96         CClass &objClass = *pobj_DBClass->Iterator_GetNext();
    97 
    98         // 名前空間をセット
    99         Smoothie::Lexical::liveingNamespaceScopes = objClass.GetNamespaceScopes();
    100 
    101         int i=0;
    102         foreach( CMember *member, objClass.staticMembers ){
    103             char temporary[VN_SIZE];
    104             sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->name);
    105             dim(
    106                 temporary,
    107                 member->SubScripts,
    108                 *member,
    109                 member->InitBuf,
    110                 member->ConstractParameter,
    111                 0);
    112 
    113             //ネイティブコードバッファの再確保
    114             ReallocNativeCodeBuffer();
    115 
    116             i++;
    117         }
    118     }
    119 
    120     Smoothie::Lexical::liveingNamespaceScopes.clear();
    121 
    122     cp=back_cp;
    123 }
    124 
    125 
    126 
    127 //コピーコンストラクタ
    128 CMethod::CMethod(CMethod *pMethod)
    129     : pUserProc( pMethod->pUserProc )
    130     , dwAccess( pMethod->dwAccess )
    131     , bAbstract( pMethod->bAbstract )
    132     , bVirtual( pMethod->bVirtual )
    133     , isConst( pMethod->isConst )
    134     , isStatic( pMethod->isStatic )
    135 {
    136 }
    137 
    138 CMethod::CMethod( UserProc *pUserProc, DWORD dwAccess, BOOL bAbstract, BOOL bVirtual, bool isConst, bool isStatic )
    139     : pUserProc( pUserProc )
    140     , dwAccess( dwAccess )
    141     , bAbstract( bAbstract )
    142     , bVirtual( bVirtual )
    143     , isConst( isConst )
    144     , isStatic( isStatic )
    145     , pobj_InheritsClass( NULL )
    146 {
    147 }
    148 CMethod::~CMethod(){
    149 }
    150 
    15114
    15215
     
    18447        delete member;
    18548    }
    186 
    187     //メソッド
    188     foreach( CMethod *method, methods ){
    189         delete method;
    190     }
    191 
    192     //静的メソッド
    193     foreach( CMethod *method, staticMethods ){
    194         delete method;
    195     }
    19649}
    19750
     
    321174
    322175    //メソッドをコピー
    323     foreach( CMethod *baseMethod, inheritsClass.methods ){
    324         CMethod *method = new CMethod( baseMethod );
     176    foreach( const CMethod *pBaseMethod, inheritsClass.methods ){
     177        CMethod *pMethod = new DynamicMethod( *pBaseMethod );
    325178
    326179        //dwAccess
    327         if(baseMethod->dwAccess==ACCESS_PRIVATE)
    328             method->dwAccess=ACCESS_NON;
    329         else method->dwAccess=baseMethod->dwAccess;
     180        if(pBaseMethod->dwAccess==ACCESS_PRIVATE)
     181            pMethod->dwAccess=ACCESS_NON;
     182        else pMethod->dwAccess=pBaseMethod->dwAccess;
    330183
    331184        //pobj_Inherits
    332185        // ※継承元のClassIndexをセット(入れ子継承を考慮する)
    333         if(baseMethod->pobj_InheritsClass==0)
    334             method->pobj_InheritsClass=&inheritsClass;
    335         else
    336             method->pobj_InheritsClass=
    337                 baseMethod->pobj_InheritsClass;
    338 
    339         methods.push_back( method );
     186        if(pBaseMethod->GetInheritsClassPtr()==0){
     187            pMethod->SetInheritsClassPtr( &inheritsClass );
     188        }
     189        else{
     190            pMethod->SetInheritsClassPtr( pBaseMethod->GetInheritsClassPtr() );
     191        }
     192
     193        methods.push_back( pMethod );
    340194    }
    341195
     
    364218
    365219    //メソッドをコピー
    366     foreach( CMethod *baseMethod, inheritsInterface.methods ){
    367         CMethod *method = new CMethod( baseMethod );
     220    foreach( const CMethod *pBaseMethod, inheritsInterface.methods ){
     221        CMethod *pMethod = new DynamicMethod( *pBaseMethod );
    368222
    369223        //dwAccess
    370         if(baseMethod->dwAccess==ACCESS_PRIVATE)
    371             method->dwAccess=ACCESS_NON;
    372         else method->dwAccess=baseMethod->dwAccess;
     224        if(pBaseMethod->dwAccess==ACCESS_PRIVATE)
     225            pMethod->dwAccess=ACCESS_NON;
     226        else pMethod->dwAccess=pBaseMethod->dwAccess;
    373227
    374228        //pobj_Inherits
    375229        // ※継承元のClassIndexをセット(入れ子継承を考慮する)
    376         if(baseMethod->pobj_InheritsClass==0)
    377             method->pobj_InheritsClass=&inheritsInterface;
    378         else
    379             method->pobj_InheritsClass=
    380                 baseMethod->pobj_InheritsClass;
    381 
    382         methods.push_back( method );
     230        if(pBaseMethod->GetInheritsClassPtr()==0){
     231            pMethod->SetInheritsClassPtr( &inheritsInterface );
     232        }
     233        else{
     234            pMethod->SetInheritsClassPtr( pBaseMethod->GetInheritsClassPtr() );
     235        }
     236
     237        methods.push_back( pMethod );
    383238    }
    384239
     
    399254    staticMembers.push_back( member );
    400255}
    401 void CClass::AddMethod( UserProc *pUserProc,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ){
    402     CMethod *method = new CMethod( pUserProc, dwAccess, bAbstract, bVirtual, isConst, false );
    403 
    404     methods.push_back( method );
    405 
    406     // プロシージャオブジェクトと関連付け
    407     pUserProc->SetMethod( method );
    408 }
    409 void CClass::AddStaticMethod(UserProc *pUserProc,DWORD dwAccess){
    410     CMethod *method = new CMethod( pUserProc, dwAccess, FALSE, FALSE, false, true );
    411 
    412     staticMethods.push_back( method );
    413 
    414     // プロシージャオブジェクトと関連付け
    415     pUserProc->SetMethod( method );
    416 }
    417256BOOL CClass::DupliCheckAll(const char *name){
    418257    //重複チェック
     
    422261
    423262    //メソッド
    424     foreach( CMethod *method, methods ){
    425         if( lstrcmp( name, method->pUserProc->GetName().c_str() ) == 0 ){
     263    foreach( const CMethod *pMethod, methods ){
     264        if( lstrcmp( name, pMethod->pUserProc->GetName().c_str() ) == 0 ){
    426265            return 1;
    427266        }
     
    435274    //メンバ
    436275    for( int i=0;i<iMemberNum;i++){
    437         if( GetName() == ppobj_Member[i]->name ){
     276        if( GetName() == ppobj_Member[i]->GetName() ){
    438277            return 1;
    439278        }
     
    442281    //静的メンバ
    443282    foreach( CMember *member, staticMembers ){
    444         if( GetName() == member->name ){
     283        if( GetName() == member->GetName() ){
    445284            return 1;
    446285        }
     
    449288    return 0;
    450289}
    451 CMethod *CClass::GetMethodInfo( UserProc *pUserProc ) const
    452 {
    453     for( int i=(int)methods.size()-1; i>=0; i-- ){
    454         if( pUserProc == methods[i]->pUserProc ){
    455             return methods[i];
    456         }
    457     }
    458     return NULL;
    459 }
    460 CMethod *CClass::GetStaticMethodInfo( UserProc *pUserProc ) const
    461 {
    462     for( int i=(int)staticMethods.size()-1; i>=0; i-- ){
    463         if( pUserProc == staticMethods[i]->pUserProc ) return staticMethods[i];
    464     }
    465     return NULL;
    466 }
    467 bool CClass::IsExistMethod( const char *name ) const
    468 {
    469     foreach( CMethod *method, methods ){
    470         if( method->pUserProc->GetName() == name ) return true;
    471     }
    472     return false;
    473 }
    474 bool CClass::IsExistStaticMethod( const char *name ) const
    475 {
    476     foreach( CMethod *method, staticMethods ){
    477         if( method->pUserProc->GetName() == name ) return true;
    478     }
    479     return false;
    480 }
    481 
    482 void CClass::EnumStaticMethod( const char *methodName, vector<UserProc *> &subs ) const
    483 {
    484     foreach( CMethod *method, staticMethods ){
    485         if( method->pUserProc->GetName() == methodName ){
    486             subs.push_back( method->pUserProc );
    487         }
    488     }
    489 }
    490 
    491 void CClass::EnumMethod( const char *methodName, vector<UserProc *> &subs ) const
    492 {
    493     //オブジェクトのメンバ関数の場合
    494     //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
    495     for( int i=(int)methods.size()-1; i>=0; i-- ){
    496         if( methods[i]->pUserProc->GetName() == methodName ){
    497             subs.push_back( methods[i]->pUserProc );
    498         }
    499     }
    500 }
    501 
    502 void CClass::EnumMethod( const BYTE idOperatorCalc, vector<UserProc *> &subs ) const
    503 {
    504     //オブジェクトのメンバ関数の場合
    505     //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
    506     for( int i=(int)methods.size()-1; i>=0; i-- ){
    507         UserProc *pUserProc = methods[i]->pUserProc;
    508         const char *temp = pUserProc->GetName().c_str();
    509         if(temp[0]==1&&temp[1]==ESC_OPERATOR){
    510             if((BYTE)temp[2]==idOperatorCalc){
    511                 subs.push_back( pUserProc );
    512             }
    513         }
    514     }
    515 }
    516290
    517291//デフォルト コンストラクタ メソッドを取得
    518 CMethod *CClass::GetConstructorMethod() const
     292const CMethod *CClass::GetConstructorMethod() const
    519293{
    520294    if( ConstructorMemberSubIndex == -1 ) return NULL;
     
    523297
    524298//デストラクタ メソッドを取得
    525 CMethod *CClass::GetDestructorMethod() const
     299const CMethod *CClass::GetDestructorMethod() const
    526300{
    527301    if( DestructorMemberSubIndex == -1 ) return NULL;
     
    584358        if(memberName){
    585359            //メンバ指定がある場合は、オフセットを返す
    586             if(lstrcmp(pMember->name,memberName)==0){
     360            if( pMember->GetName() == memberName ){
    587361                if(pMemberNum) *pMemberNum=i;
    588362                return offset;
     
    644418{
    645419    int n = 0;
    646     foreach( CMethod *method, methods ){
    647         if( method->pUserProc == pUserProc ) break;
    648         if( method->bVirtual ) n++;
     420    foreach( const CMethod *pMethod, methods ){
     421        if( pMethod->pUserProc == pUserProc ) break;
     422        if( pMethod->IsVirtual() ) n++;
    649423    }
    650424    return n;
     
    667441    //関数テーブルに値をセット
    668442    int i2 = 0;
    669     foreach( CMethod *method, methods ){
    670         if(method->bVirtual){
    671             method->pUserProc->Using();
    672 
    673             if(method->bAbstract){
     443    foreach( const CMethod *pMethod, methods ){
     444        if(pMethod->IsVirtual()){
     445            pMethod->pUserProc->Using();
     446
     447            if(pMethod->IsAbstract()){
    674448                extern int cp;
    675449                SetError(300,NULL,cp);
     
    678452            }
    679453            else{
    680                 ppsi[i2]=method->pUserProc;
     454                ppsi[i2]=pMethod->pUserProc;
    681455            }
    682456            i2++;
     
    712486    // 未実装(abstract)の仮想関数を持つ場合はtrueを返す
    713487
    714     foreach( CMethod *method, methods ){
    715         if(method->bVirtual){
    716             if(method->bAbstract){
     488    foreach( const CMethod *pMethod, methods ){
     489        if(pMethod->IsVirtual()){
     490            if(pMethod->IsAbstract()){
    717491                return true;
    718492            }
     
    1063837
    1064838
    1065 void CDBClass::AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, BOOL bAbstract,
    1066                          BOOL bVirtual, BOOL bOverride, char *buffer, int nowLine){
     839void CDBClass::AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, bool isAbstract,
     840                         bool isVirtual, bool isOverride, char *buffer, int nowLine){
    1067841    int i,i2;
    1068842    char temporary[VN_SIZE];
     
    1080854    //関数ハッシュへ登録
    1081855    GlobalProc *pUserProc;
    1082     pUserProc=AddSubData( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,bVirtual,pobj_c, (bStatic!=0) );
     856    pUserProc=AddSubData( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,isVirtual,pobj_c, (bStatic!=0) );
    1083857    if(!pUserProc) return;
    1084858
     
    1129903
    1130904    //メソッド
    1131     foreach( CMethod *method, pobj_c->methods ){
     905    foreach( const CMethod *pMethod, pobj_c->methods ){
    1132906        //基底クラスと重複する場合はオーバーライドを行う
    1133         if(method->pobj_InheritsClass) continue;
    1134 
    1135         if( method->pUserProc->GetName() == temporary ){
    1136             if( method->pUserProc->Params().Equals( pUserProc->Params() ) ){
     907        if( pMethod->GetInheritsClassPtr() ) continue;
     908
     909        if( pMethod->pUserProc->GetName() == temporary ){
     910            if( pMethod->pUserProc->Params().Equals( pUserProc->Params() ) ){
    1137911                //関数名、パラメータ属性が合致したとき
    1138912                SetError(15,pUserProc->GetName().c_str(),nowLine);
     
    1143917
    1144918    //仮想関数の場合
    1145     if(bAbstract) pUserProc->CompleteCompile();
     919    if( isAbstract ) pUserProc->CompleteCompile();
    1146920
    1147921    //メソッドのオーバーライド
    1148     foreach( CMethod *method, pobj_c->methods ){
    1149         if( method->pUserProc->GetName() == temporary ){
    1150             if( method->pUserProc->Params().Equals( pUserProc->Params() ) ){
    1151 
    1152                 if(method->bVirtual){
     922    foreach( CMethod *pMethod, pobj_c->methods ){
     923        if( pMethod->pUserProc->GetName() == temporary ){
     924            if( pMethod->pUserProc->Params().Equals( pUserProc->Params() ) ){
     925
     926                if(pMethod->IsVirtual()){
    1153927                    //メンバ関数を上書き
    1154                     method->pUserProc=pUserProc;
    1155                     method->bAbstract=0;
    1156 
    1157                     if(!bOverride){
     928                    pMethod->pUserProc=pUserProc;
     929                    pMethod->Override();
     930
     931                    if( !isOverride ){
    1158932                        SetError(127,NULL,nowLine);
    1159933                    }
    1160                     if(method->dwAccess!=dwAccess){
     934                    if(pMethod->dwAccess!=dwAccess){
    1161935                        SetError(128,NULL,nowLine);
    1162936                    }
    1163937
    1164                     pUserProc->SetMethod( method );
     938                    pUserProc->SetMethod( pMethod );
    1165939                    return;
    1166940                }
     
    1169943    }
    1170944
    1171     if(bVirtual){
     945    if( isVirtual ){
    1172946        pobj_c->vtbl_num++;
    1173947    }
    1174948
    1175     if(bOverride){
     949    if( isOverride ){
    1176950        SetError(12,"Override",nowLine);
    1177951    }
    1178952
    1179953    if(bStatic){
    1180         pobj_c->AddStaticMethod(pUserProc,dwAccess);
     954        pobj_c->staticMethods.AddStatic(pUserProc,dwAccess);
    1181955    }
    1182956    else{
    1183         pobj_c->AddMethod(pUserProc, dwAccess, isConst, bAbstract, bVirtual);
     957        pobj_c->methods.Add(pUserProc, dwAccess, isConst, isAbstract, isVirtual);
    1184958    }
    1185959}
     
    15171291                else i3=0;
    15181292
    1519                 BOOL bVirtual=0,bAbstract=0,bOverride=0;
     1293                bool isVirtual = false, isAbstract = false, isOverride = false;
    15201294                if(i3==ESC_ABSTRACT){
    1521                     bAbstract=1;
    1522                     bVirtual=1;
     1295                    isAbstract=1;
     1296                    isVirtual=1;
    15231297                    i+=2;
    15241298
     
    15261300                }
    15271301                else if(i3==ESC_VIRTUAL){
    1528                     bAbstract=0;
    1529                     bVirtual=1;
     1302                    isAbstract=0;
     1303                    isVirtual=1;
    15301304                    i+=2;
    15311305
     
    15331307                }
    15341308                else if(i3==ESC_OVERRIDE){
    1535                     bOverride=1;
    1536                     bVirtual=1;
     1309                    isOverride=1;
     1310                    isVirtual=1;
    15371311
    15381312                    i+=2;
     
    16191393                        bStatic,
    16201394                        isConst,
    1621                         bAbstract,
    1622                         bVirtual,
    1623                         bOverride,
     1395                        isAbstract,
     1396                        isVirtual,
     1397                        isOverride,
    16241398                        temporary,
    16251399                        sub_address);
    16261400
    1627                     if(bAbstract) continue;
     1401                    if( isAbstract ) continue;
    16281402
    16291403                    for(;;i++){
     
    16991473                sprintf( referenceOffsetsBuffer + lstrlen( referenceOffsetsBuffer ),
    17001474                    "%d",
    1701                     objClass.GetMemberOffset( member.name ) );
     1475                    objClass.GetMemberOffset( member.GetName().c_str() ) );
    17021476
    17031477                numOfReference++;
     
    18221596        pCompilingClass->Using();
    18231597
    1824         pCompilingMethod = pCompilingClass->GetMethodInfo( pUserProc );
     1598        pCompilingMethod = pCompilingClass->methods.GetMethodPtr( pUserProc );
    18251599        if( !pCompilingMethod ){
    1826             pCompilingMethod = pCompilingClass->GetStaticMethodInfo( pUserProc );
     1600            pCompilingMethod = pCompilingClass->staticMethods.GetMethodPtr( pUserProc );
    18271601            if( !pCompilingMethod ){
    18281602                SetError(300,NULL,cp);
     
    18381612    return pCompilingClass;
    18391613}
    1840 CMethod *CDBClass::GetNowCompilingMethodInfo(){
     1614const CMethod *CDBClass::GetNowCompilingMethodInfo(){
    18411615    return pCompilingMethod;
    18421616}
Note: See TracChangeset for help on using the changeset viewer.