Changeset 31 in dev for BasicCompiler_Common/hash.cpp


Ignore:
Timestamp:
Jan 13, 2007, 4:26:50 AM (17 years ago)
Author:
dai_9181
Message:

_System_LocalThis(見えないThisポインタパラメータ)を通常のパラメータ保有領域ではなく、リアルパラメータ保有領域に移動した。
メソッドとグローバル関数のオーバーロードに対応(DLL関数オーバーロードには未対応)。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/hash.cpp

    r28 r31  
    146146        }
    147147    }
    148 
    149     if(pobj_CompilingClass){
    150         //自身のオブジェクトのメンバ関数を検索
    151 
    152 
    153         //////////////////////////////////////////////
    154         // 静的メソッド
    155         //////////////////////////////////////////////
    156 
    157         CClass *pobj_c = pobj_CompilingClass;
    158 
    159         for(i=0;i<pobj_c->iStaticMethodNum;i++){
    160             if(lstrcmp(name,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
    161                 ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
    162                 num++;
    163             }
    164         }
    165 
    166 
    167         ///////////////////////
    168         // 動的メソッド(一般)
    169         ///////////////////////
    170         for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
    171             //オーバーライドされた関数を飛び越す
    172             if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass==0) break;
    173         }
    174         for(;i<pobj_CompilingClass->iMethodNum;i++){
    175             if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
    176                 ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
    177                 num++;
    178             }
    179         }
    180 
    181         //オーバーライドされたメンバ関数
    182         for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
    183             //オーバーライドされた関数を飛び越す
    184             if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass){
     148    else{
     149        //オブジェクトが明示的に指定されていないとき
     150
     151        if(pobj_CompilingClass){
     152            //自身のオブジェクトのメンバ関数を検索
     153
     154
     155            //////////////////////////////////////////////
     156            // 静的メソッド
     157            //////////////////////////////////////////////
     158
     159            CClass *pobj_c = pobj_CompilingClass;
     160
     161            for(i=0;i<pobj_c->iStaticMethodNum;i++){
     162                if(lstrcmp(name,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
     163                    ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
     164                    num++;
     165                }
     166            }
     167
     168
     169            ///////////////////////
     170            // 動的メソッド(一般)
     171            ///////////////////////
     172            for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
     173                //オーバーライドされた関数を飛び越す
     174                if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass==0) break;
     175            }
     176            for(;i<pobj_CompilingClass->iMethodNum;i++){
    185177                if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
    186178                    ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
     
    188180                }
    189181            }
    190         }
    191     }
    192 
    193     if(num) goto finish;
    194 
    195 
    196     //ハッシュ値を取得
    197     int key;
    198     key=hash_default(name);
    199 
    200     //格納位置を取得
    201     extern SUBINFO **ppSubHash;
    202     SUBINFO *psi;
    203     psi=ppSubHash[key];
    204     while(psi){
    205         if(!psi->pobj_ParentClass){
    206             if(lstrcmp(psi->name,name)==0){
    207                 ppArray_si[num]=psi;
    208                 num++;
    209             }
    210         }
    211 
    212         psi=psi->pNextData;
    213     }
    214 
     182
     183            //オーバーライドされたメンバ関数
     184            for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
     185                //オーバーライドされた関数を飛び越す
     186                if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass){
     187                    if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
     188                        ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
     189                        num++;
     190                    }
     191                }
     192            }
     193        }
     194
     195
     196        ///////////////////////////
     197        // グローバル関数を検索
     198        ///////////////////////////
     199
     200        //ハッシュ値を取得
     201        int key;
     202        key=hash_default(name);
     203
     204        //格納位置を取得
     205        extern SUBINFO **ppSubHash;
     206        SUBINFO *psi;
     207        psi=ppSubHash[key];
     208        while(psi){
     209            if(!psi->pobj_ParentClass){
     210                if(lstrcmp(psi->name,name)==0){
     211                    ppArray_si[num]=psi;
     212                    num++;
     213                }
     214            }
     215
     216            psi=psi->pNextData;
     217        }
     218
     219    }
    215220finish:
    216221
Note: See TracChangeset for help on using the changeset viewer.