Changeset 27 in dev


Ignore:
Timestamp:
Jan 7, 2007, 6:51:20 AM (17 years ago)
Author:
dai_9181
Message:

静的メンバ、静的メソッド周りを修正。

Files:
13 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_CallProc.cpp

    r26 r27  
    240240        if(ObjectName[0]){
    241241            if(lstrcmpi(ObjectName,"Super")==0){
    242                 //クラスメンバ関数内からスーパークラスの呼び出し
     242                //クラスメンバ関数内から基底クラスの呼び出し
    243243                pobj_c=pobj_CompilingClass;
    244244            }
     
    270270        // メソッド情報を取得
    271271        /////////////////////////////////
    272         pMethod = pobj_c->GetMethodInfo( psi );
    273         if( !pMethod ){
     272        pMethod = NULL;
     273        if( ! bStatic ) pMethod = pobj_c->GetMethodInfo( psi );
     274        if( ! pMethod ){
    274275            //動的メソッドが取得できなかったときは静的メソッドを当たる
    275276            pMethod = pobj_c->GetStaticMethodInfo( psi );
  • BasicCompiler32/Compile_ProcOp.cpp

    r18 r27  
    449449            pobj_CompilingClass->NotifyStartConstructorCompile();
    450450
    451             //スーパークラスかどうかの識別
    452             //(継承元がインターフェイスの場合もスーパークラスと見なす)
     451            //基底クラスかどうかの識別
     452            //(継承元がインターフェイスの場合も基底クラスと見なす)
    453453            BOOL bThisIsSuperClass;
    454454            if(pobj_CompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1;
     
    461461            if(!bThisIsSuperClass){
    462462                /* サブクラスコンストラクタをコンパイルしているときは、
    463                     スーパークラスのコンストラクタを呼び出す */
     463                    基底クラスのコンストラクタを呼び出す */
    464464
    465465                i3=cp+1;
     
    474474                if(lstrcmp(temporary,
    475475                    pobj_CompilingClass->pobj_InheritsClass->name)==0){
    476                     //スーパークラスのコンストラクタを呼び出す
     476                    //基底クラスのコンストラクタを呼び出す
    477477                    cp=i3;
    478478                    for(i4=0;;cp++,i4++){
     
    497497                }
    498498                else{
    499                     //スーパークラスのコンストラクタを暗黙的に呼び出す
     499                    //基底クラスのコンストラクタを暗黙的に呼び出す
    500500                    i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex;
    501501                    Opcode_CallProc("",
     
    607607            if(pobj_CompilingClass->pobj_InheritsClass){
    608608                /* サブクラスのデストラクタをコンパイルしているときは、
    609                     スーパークラスのデストラクタを呼び出す */
     609                    基底クラスのデストラクタを呼び出す */
    610610
    611611                i3=pobj_CompilingClass->pobj_InheritsClass->DestructorMemberSubIndex;
  • BasicCompiler32/Compile_Var.cpp

    r20 r27  
    498498
    499499
    500     ////////////////////
    501     // グローバル変数
    502     ////////////////////
    503 
    504     for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
    505         if(GlobalVar[i].bLiving){
    506             if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    507         }
    508     }
    509     if(i>=0){
    510         goto GlobalOk;
    511     }
    512 
    513 
    514500    //////////////////////////
    515501    // クラスの静的メンバ
     
    518504    if(member[0]){
    519505        lstrcpy(temporary,member);
    520         GetVarFormatString(temporary,array,lpPtrOffset,member,&i);
     506        char tempMember[VN_SIZE];
     507        char tempArray[VN_SIZE];
     508        GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i);
    521509
    522510        char temp2[VN_SIZE];
     
    527515
    528516        if(i!=MaxGlobalVarNum){
     517            lstrcpy(member,tempMember);
     518            lstrcpy(array,tempArray);
    529519            goto GlobalOk;
    530520        }
     
    543533        }
    544534    }
     535
     536
     537    ////////////////////
     538    // グローバル変数
     539    ////////////////////
     540
     541    for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
     542        if(GlobalVar[i].bLiving){
     543            if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
     544        }
     545    }
     546    if(i>=0){
     547        goto GlobalOk;
     548    }
     549
    545550
    546551    if(isErrorEnabled) SetError(3,variable,cp);
  • BasicCompiler64/Compile_CallProc.cpp

    r26 r27  
    245245        if(ObjectName[0]){
    246246            if(lstrcmpi(ObjectName,"Super")==0){
    247                 //クラスメンバ関数内からスーパークラスの呼び出し
     247                //クラスメンバ関数内から基底クラスの呼び出し
    248248                pobj_c=pobj_CompilingClass;
    249249            }
     
    275275        // メソッド情報を取得
    276276        /////////////////////////////////
    277         pMethod = pobj_c->GetMethodInfo( psi );
    278         if( !pMethod ){
     277        pMethod = NULL;
     278        if( ! bStatic ) pMethod = pobj_c->GetMethodInfo( psi );
     279        if( ! pMethod ){
    279280            //動的メソッドが取得できなかったときは静的メソッドを当たる
    280281            pMethod = pobj_c->GetStaticMethodInfo( psi );
  • BasicCompiler64/Compile_ProcOp.cpp

    r19 r27  
    504504            pobj_CompilingClass->NotifyStartConstructorCompile();
    505505
    506             //スーパークラスかどうかの識別
    507             //(継承元がインターフェイスの場合もスーパークラスと見なす)
     506            //基底クラスかどうかの識別
     507            //(継承元がインターフェイスの場合も基底クラスと見なす)
    508508            BOOL bThisIsSuperClass;
    509509            if(pobj_CompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1;
     
    516516            if(!bThisIsSuperClass){
    517517                /* サブクラスコンストラクタをコンパイルしているときは、
    518                     スーパークラスのコンストラクタを呼び出す */
     518                    基底クラスのコンストラクタを呼び出す */
    519519
    520520                i3=cp+1;
     
    529529                if(lstrcmp(temporary,
    530530                    pobj_CompilingClass->pobj_InheritsClass->name)==0){
    531                     //スーパークラスのコンストラクタを呼び出す
     531                    //基底クラスのコンストラクタを呼び出す
    532532                    cp=i3;
    533533                    for(i4=0;;cp++,i4++){
     
    552552                }
    553553                else{
    554                     //スーパークラスのコンストラクタを暗黙的に呼び出す
     554                    //基底クラスのコンストラクタを暗黙的に呼び出す
    555555                    i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex;
    556556                    Opcode_CallProc("",
     
    656656            if(pobj_CompilingClass->pobj_InheritsClass){
    657657                /* サブクラスのデストラクタをコンパイルしているときは、
    658                     スーパークラスのデストラクタを呼び出す */
     658                    基底クラスのデストラクタを呼び出す */
    659659
    660660                i3=pobj_CompilingClass->pobj_InheritsClass->DestructorMemberSubIndex;
  • BasicCompiler64/Compile_Set_Var.cpp

    r3 r27  
    7777
    7878
    79 
     79//TODO: 継承・派生関係にある場合は許容する
    8080    if(CalcType==DEF_OBJECT&&lpVarIndex==lpCalcIndex){
    8181        //双方のオブジェクト型が完全に一致したとき
  • BasicCompiler64/Compile_Var.cpp

    r20 r27  
    520520    }
    521521
    522     /////////////////////
    523     // グローバル変数
    524     /////////////////////
    525 
    526     for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
    527         if(GlobalVar[i].bLiving){
    528             if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    529         }
    530     }
    531     if(i>=0){
    532         goto GlobalOk;
    533     }
    534 
    535522
    536523    //////////////////////////
     
    540527    if(member[0]){
    541528        lstrcpy(temporary,member);
    542         GetVarFormatString(temporary,array,lpPtrOffset,member,&i);
     529
     530        char tempMember[VN_SIZE];
     531        char tempArray[VN_SIZE];
     532        GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i);
    543533
    544534        char temp2[VN_SIZE];
     
    549539
    550540        if(i!=MaxGlobalVarNum){
     541            lstrcpy(member,tempMember);
     542            lstrcpy(array,tempArray);
    551543            goto GlobalOk;
    552544        }
     
    564556            goto GlobalOk;
    565557        }
     558    }
     559
     560
     561    /////////////////////
     562    // グローバル変数
     563    /////////////////////
     564
     565    for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
     566        if(GlobalVar[i].bLiving){
     567            if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
     568        }
     569    }
     570    if(i>=0){
     571        goto GlobalOk;
    566572    }
    567573
  • BasicCompiler_Common/Class.cpp

    r18 r27  
    308308    return ppobj_StaticMethod[i];
    309309}
     310bool CClass::IsExistMethod( char *name ){
     311    for( int i=0; i<iMethodNum; i++ ){
     312        if( lstrcmp( ppobj_Method[i]->psi->name, name ) == 0 ) return true;
     313    }
     314    return false;
     315}
     316bool CClass::IsExistStaticMethod( char *name ){
     317    for( int i=0; i<iStaticMethodNum; i++ ){
     318        if( lstrcmp( ppobj_StaticMethod[i]->psi->name, name ) == 0 ) return true;
     319    }
     320    return false;
     321}
     322
    310323
    311324LONG_PTR CClass::AddVtblDataTable(SUBINFO **ppsi,int length){
     
    677690    //メンバ関数
    678691    for(i=0;i<pobj_c->iMethodNum;i++){
    679         //スーパークラスと重複する場合はオーバーライドを行う
     692        //基底クラスと重複する場合はオーバーライドを行う
    680693        if(pobj_c->ppobj_Method[i]->pobj_InheritsClass) continue;
    681694
  • BasicCompiler_Common/Class.h

    r18 r27  
    105105    CMethod *GetMethodInfo( SUBINFO *psi );
    106106    CMethod *GetStaticMethodInfo( SUBINFO *psi );
     107    bool IsExistMethod( char *name );
     108    bool IsExistStaticMethod( char *name );
    107109
    108110
  • BasicCompiler_Common/Intermediate_Step2.cpp

    r18 r27  
    453453        lstrcmpi(com,"PRINT")==0||
    454454        lstrcmpi(com,"RANDOMIZE")==0||
    455         lstrcmpi(com,"WRITE")==0||
     455        //lstrcmpi(com,"WRITE")==0|| TODO: Trace.Writeとの重複が未完成
    456456        lstrcmpi(com,"MSGBOX")==0||
    457457        lstrcmpi(com,"WINDOW")==0||
  • BasicCompiler_Common/Variable.cpp

    r20 r27  
    724724
    725725
    726     ////////////////////
    727     // グローバル変数
    728     ////////////////////
    729 
    730     for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
    731         if(GlobalVar[i].bLiving){
    732             if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    733         }
    734     }
    735 
    736     if(i>=0){
    737         goto GlobalOk;
    738     }
    739 
    740 
    741726    //////////////////////////
    742727    // クラスの静的メンバ
     
    745730    if(member[0]){
    746731        lstrcpy(temporary,member);
    747         GetVarFormatString(temporary,array,lpPtrOffset,member,&i);
     732        char tempMember[VN_SIZE];
     733        char tempArray[VN_SIZE];
     734        GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i);
    748735
    749736        char temp2[VN_SIZE];
     
    754741
    755742        if(i!=MaxGlobalVarNum){
     743            lstrcpy(member,tempMember);
     744            lstrcpy(array,tempArray);
    756745            goto GlobalOk;
    757746        }
     
    769758            goto GlobalOk;
    770759        }
     760    }
     761
     762
     763    ////////////////////
     764    // グローバル変数
     765    ////////////////////
     766
     767    for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
     768        if(GlobalVar[i].bLiving){
     769            if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
     770        }
     771    }
     772
     773    if(i>=0){
     774        goto GlobalOk;
    771775    }
    772776
     
    10191023    }
    10201024
    1021     //関数
     1025    //関数(またはメソッド)
    10221026    lstrcat(FullName,pCompilingSubInfo->name);
    10231027    lstrcat(FullName,"%");
     
    10291033    lstrcat(FullName,"%");
    10301034
     1035    //変数名
    10311036    lstrcat(FullName,VarName);
    10321037
  • BasicCompiler_Common/error.cpp

    r20 r27  
    162162    if(num==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません");
    163163    if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません");
    164     if(num==118) lstrcpy(msg,"参照するスーパークラスが存在しません");
    165     if(num==119) sprintf(msg,"\"%s\" メンバはスーパークラスで定義されていません",KeyWord);
     164    if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません");
     165    if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません",KeyWord);
    166166    if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です");
    167167    if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません");
  • BasicCompiler_Common/hash.cpp

    r5 r27  
    121121        //オブジェクトのメンバ関数の場合
    122122
     123        bool isStatic = false;
     124        CClass *pobj_c;
    123125        if(lstrcmpi(ObjName,"Super")==0){
    124             //スーパークラス参照の場合
    125 
    126             if(pobj_CompilingClass==0){
    127                 SetError(118,NULL,cp);
    128                 goto finish;
    129             }
    130 
    131             //クラス内のメンバ関数をコンパイルしているとき
    132             //※オーバーライドされた関数をサーチする
    133             for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
    134                 if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass==0) continue;
    135 
    136                 if(lstrcmp(NestMember,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
    137                     ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
    138                     num++;
    139                 }
    140             }
    141 
    142             if(num==0) SetError(119,NestMember,cp);
    143 
    144             goto finish;
    145         }
    146 
    147 
    148 
    149         //////////////////////////////////////////////
    150         // 静的メソッド(クラス名が指定される場合)
    151         //////////////////////////////////////////////
    152 
    153         CClass *pobj_c;
    154         pobj_c=pobj_DBClass->check(ObjName);
    155         if(pobj_c){
    156             for(i=0;i<pobj_c->iStaticMethodNum;i++){
    157                 if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
    158                     ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
    159                     num++;
    160                 }
    161             }
    162 
    163             goto finish;
    164         }
    165 
    166 
    167         i=GetVarType(ObjName,(LONG_PTR *)&pobj_c,1);
    168         if(i==-1) goto finish;  //エラーの場合
    169         if(!(NATURAL_TYPE(i)==DEF_OBJECT)) goto finish;
     126            //クラスメンバ関数内から基底クラスの呼び出し
     127            pobj_c=pobj_CompilingClass;
     128        }
     129        else{
     130            pobj_c=pobj_DBClass->check(ObjName);
     131            if( ! pobj_c ){
     132                //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
     133                int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
     134                if(!(NATURAL_TYPE(type)==DEF_OBJECT)) goto finish;
     135            }
     136        }
     137
     138        // 静的メソッドから取得
     139        for(i=0;i<pobj_c->iStaticMethodNum;i++){
     140            if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
     141                ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
     142                num++;
     143            }
     144        }
     145
     146        //動的メソッドから取得
    170147
    171148        //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
     
    176153            }
    177154        }
    178         goto finish;
    179155    }
    180156
     
    221197            }
    222198        }
    223 
    224         if(num) goto finish;
    225     }
     199    }
     200
     201    if(num) goto finish;
     202
    226203
    227204    //ハッシュ値を取得
Note: See TracChangeset for help on using the changeset viewer.