Changeset 27 in dev for BasicCompiler_Common


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

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

Location:
BasicCompiler_Common
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • 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.