Changeset 50 in dev for BasicCompiler_Common/hash.cpp


Ignore:
Timestamp:
Feb 10, 2007, 5:44:58 PM (18 years ago)
Author:
dai_9181
Message:

オーバーロード解決用の関数保持リストを "SUBINFO " ではなく、"vector<SUBINFO *>" に変更した。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/hash.cpp

    r47 r50  
    5353}
    5454
    55 SUBINFO **GetOverloadObjectSubHash(char *name,CClass *pobj_c, int *pNum){
    56     int i;
    57 
    58 
    59     //格納のための構造体配列を用意
    60     extern HANDLE hHeap;
    61     SUBINFO **ppArray_si;
    62     int num=0;
    63     ppArray_si=(SUBINFO **)HeapAlloc(hHeap,0,sizeof(SUBINFO *)*1024);
    64 
    65 
    66     //オブジェクトのメンバ関数の場合
    67     //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
    68     for(i=pobj_c->iMethodNum-1;i>=0;i--){
    69         if(lstrcmp(name,pobj_c->ppobj_Method[i]->psi->name)==0){
    70             ppArray_si[num]=pobj_c->ppobj_Method[i]->psi;
    71             num++;
    72         }
    73     }
    74 
    75     *pNum=num;
    76     return ppArray_si;
    77 }
    78 
    79 SUBINFO **GetOverloadSubHash( const char *lpszName, int *pNum ){
     55void GetOverloadSubHash( const char *lpszName, std::vector<SUBINFO *> &subs ){
    8056    extern SUBINFO *pSubInfo;
    8157    extern int SubInfoNum;
     
    9066    }
    9167    else lstrcpy(name,lpszName);
    92 
    93 
    94     //格納のための構造体配列を用意
    95     extern HANDLE hHeap;
    96     SUBINFO **ppArray_si;
    97     int num=0;
    98     ppArray_si=(SUBINFO **)HeapAlloc(hHeap,0,sizeof(SUBINFO *)*1024);
    9968
    10069
     
    12291                }
    12392                else{
    124                     goto finish;
     93                    return;
    12594                }
    12695            }
     
    12998        if( isStatic ){
    13099            // 静的メソッドから取得
    131             for(i=0;i<pobj_c->iStaticMethodNum;i++){
    132                 if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
    133                     ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
    134                     num++;
    135                 }
    136             }
     100            pobj_c->EnumStaticMethod( NestMember, subs );
    137101        }
    138102        else{
     
    142106            for(i=pobj_c->iMethodNum-1;i>=0;i--){
    143107                if(lstrcmp(NestMember,pobj_c->ppobj_Method[i]->psi->name)==0){
    144                     ppArray_si[num]=pobj_c->ppobj_Method[i]->psi;
    145                     num++;
     108                    subs.push_back( pobj_c->ppobj_Method[i]->psi );
    146109                }
    147110            }
     
    161124            CClass *pobj_c = pobj_CompilingClass;
    162125
    163             for(i=0;i<pobj_c->iStaticMethodNum;i++){
    164                 if(lstrcmp(name,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
    165                     ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
    166                     num++;
    167                 }
    168             }
     126            pobj_c->EnumStaticMethod( NestMember, subs );
    169127
    170128
     
    178136            for(;i<pobj_CompilingClass->iMethodNum;i++){
    179137                if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
    180                     ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
    181                     num++;
     138                    subs.push_back( pobj_CompilingClass->ppobj_Method[i]->psi );
    182139                }
    183140            }
     
    188145                if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass){
    189146                    if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
    190                         ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
    191                         num++;
     147                        subs.push_back( pobj_CompilingClass->ppobj_Method[i]->psi );
    192148                    }
    193149                }
     
    211167            if(!psi->pobj_ParentClass){
    212168                if(lstrcmp(psi->name,name)==0){
    213                     ppArray_si[num]=psi;
    214                     num++;
     169                    subs.push_back( psi );
    215170                }
    216171            }
     
    220175
    221176    }
    222 finish:
    223 
    224     *pNum=num;
    225     return ppArray_si;
    226177}
    227178
    228179//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
    229180SUBINFO *GetSubHash(const char *lpszName,BOOL bError){
    230     int num;
    231     SUBINFO **ppsi,*psi;
    232     ppsi = GetOverloadSubHash(lpszName,&num);
     181    std::vector<SUBINFO *> subs;
     182    GetOverloadSubHash(lpszName,subs);
    233183
    234184    //関数が存在しないとき
    235     if(num == 0){
    236         HeapDefaultFree(ppsi);
     185    if(subs.size() == 0){
    237186        return 0;
    238187    }
    239188
    240189    //一つ以上の関数が存在するときは内部エラー(デバッグ用)
    241     if(num > 1){
     190    if(subs.size() > 1){
    242191        if(bError) SetError(300,NULL,cp);
    243192    }
    244193
    245     psi = ppsi[0];
    246 
    247     HeapDefaultFree(ppsi);
     194    SUBINFO *psi;
     195    psi = subs[0];
    248196
    249197    return psi;
     
    253201    sprintf(temporary,"%s.%s",ObjectName,MethodName);
    254202
    255     int num;
    256     SUBINFO **ppsi,*psi;
    257     ppsi = GetOverloadSubHash(temporary,&num);
     203    std::vector<SUBINFO *> subs;
     204    SUBINFO *psi;
     205    GetOverloadSubHash(temporary,subs);
    258206
    259207    //関数が存在しないとき
    260     if(num == 0){
    261         HeapDefaultFree(ppsi);
     208    if(subs.size() == 0){
    262209        return 0;
    263210    }
    264211
    265212    //オーバーロードを解決
    266     psi=OverloadSolutionWithStrParam(temporary,ppsi,num,Parameter,ObjectName,NULL);
    267     HeapDefaultFree(ppsi);
     213    psi=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName,NULL);
    268214
    269215    return psi;
Note: See TracChangeset for help on using the changeset viewer.