Changeset 28 in dev for BasicCompiler_Common/hash.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/hash.cpp

    r27 r28  
    8383    int i;
    8484
    85 
    8685    char name[VN_SIZE];
    8786
     
    102101    char ObjName[VN_SIZE];      //オブジェクト変数
    103102    char NestMember[VN_SIZE];   //入れ子メンバ
    104     BOOL bObjectMember;
    105     lstrcpy(ObjName,name);
    106     for(i=lstrlen(ObjName)-1;i>=0;i--){
    107         if(ObjName[i]=='.'||(ObjName[i]==1&&ObjName[i+1]==ESC_PSMEM))
    108             break;
    109     }
    110     if(i==-1) bObjectMember=0;
    111     else{
    112         if(ObjName[i]=='.')
    113             lstrcpy(NestMember,ObjName+i+1);
    114         else
    115             lstrcpy(NestMember,ObjName+i+2);
    116         ObjName[i]=0;
    117         bObjectMember=1;
    118     }
    119 
    120     if(bObjectMember){
     103    bool isObjectMember = SplitMemberName( name, ObjName, NestMember );
     104    if( !isObjectMember ) lstrcpy(ObjName,name);
     105
     106    if(isObjectMember){
    121107        //オブジェクトのメンバ関数の場合
    122108
     
    129115        else{
    130116            pobj_c=pobj_DBClass->check(ObjName);
    131             if( ! pobj_c ){
     117            if( pobj_c ){
     118                isStatic = true;
     119            }
     120            else{
    132121                //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
    133122                int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
     
    136125        }
    137126
    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         //動的メソッドから取得
    147 
    148         //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
    149         for(i=pobj_c->iMethodNum-1;i>=0;i--){
    150             if(lstrcmp(NestMember,pobj_c->ppobj_Method[i]->psi->name)==0){
    151                 ppArray_si[num]=pobj_c->ppobj_Method[i]->psi;
    152                 num++;
     127        if( isStatic ){
     128            // 静的メソッドから取得
     129            for(i=0;i<pobj_c->iStaticMethodNum;i++){
     130                if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
     131                    ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
     132                    num++;
     133                }
     134            }
     135        }
     136        else{
     137            //動的メソッドから取得
     138
     139            //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
     140            for(i=pobj_c->iMethodNum-1;i>=0;i--){
     141                if(lstrcmp(NestMember,pobj_c->ppobj_Method[i]->psi->name)==0){
     142                    ppArray_si[num]=pobj_c->ppobj_Method[i]->psi;
     143                    num++;
     144                }
    153145            }
    154146        }
Note: See TracChangeset for help on using the changeset viewer.