source: dev/BasicCompiler_Common/hash.cpp@ 50

Last change on this file since 50 was 50, checked in by dai_9181, 18 years ago

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

File size: 4.8 KB
RevLine 
[4]1#include "../BasicCompiler_Common/common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
[5]6#include "../BasicCompiler32/opcode.h"
[4]7#endif
8
9int hash_default(char *name){
10 int key;
11
12 for(key=0;*name!='\0';name++){
13 key=((key<<8)+ *name )%MAX_HASH;
14 }
15
16 return key;
17}
18
19CONSTINFO *GetConstHash(char *name){
20 //ハッシュ値を取得
21 int key;
22 key=hash_default(name);
23
24 //格納位置を取得
25 extern CONSTINFO **ppConstHash;
26 CONSTINFO *pci;
27 pci=ppConstHash[key];
28 while(pci){
29 if(lstrcmp(pci->name,name)==0) break;
30
31 pci=pci->pNextData;
32 }
33
34 return pci;
35}
36
37DECLAREINFO *GetDeclareHash(char *name){
38 //ハッシュ値を取得
39 int key;
40 key=hash_default(name);
41
42 //格納位置を取得
43 extern DECLAREINFO **ppDeclareHash;
44 DECLAREINFO *pdi;
45 pdi=ppDeclareHash[key];
46 while(pdi){
47 if(lstrcmp(pdi->name,name)==0) break;
48
49 pdi=pdi->pNextData;
50 }
51
52 return pdi;
53}
54
[50]55void GetOverloadSubHash( const char *lpszName, std::vector<SUBINFO *> &subs ){
[4]56 extern SUBINFO *pSubInfo;
57 extern int SubInfoNum;
58 extern int cp;
59 int i;
60
61 char name[VN_SIZE];
62
63 if(lpszName[0]=='.'){
64 GetWithName(name);
65 lstrcat(name,lpszName);
66 }
67 else lstrcpy(name,lpszName);
68
69
70 char ObjName[VN_SIZE]; //オブジェクト変数
71 char NestMember[VN_SIZE]; //入れ子メンバ
[28]72 bool isObjectMember = SplitMemberName( name, ObjName, NestMember );
73 if( !isObjectMember ) lstrcpy(ObjName,name);
[4]74
[28]75 if(isObjectMember){
[4]76 //オブジェクトのメンバ関数の場合
77
[27]78 bool isStatic = false;
79 CClass *pobj_c;
[4]80 if(lstrcmpi(ObjName,"Super")==0){
[27]81 //クラスメンバ関数内から基底クラスの呼び出し
82 pobj_c=pobj_CompilingClass;
83 }
84 else{
[47]85 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
86 int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
87 if(!(NATURAL_TYPE(type)==DEF_OBJECT)){
88 pobj_c=pobj_DBClass->check(ObjName);
89 if( pobj_c ){
90 isStatic = true;
91 }
92 else{
[50]93 return;
[47]94 }
[28]95 }
[4]96 }
97
[28]98 if( isStatic ){
99 // 静的メソッドから取得
[50]100 pobj_c->EnumStaticMethod( NestMember, subs );
[4]101 }
[28]102 else{
103 //動的メソッドから取得
[4]104
[28]105 //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
106 for(i=pobj_c->iMethodNum-1;i>=0;i--){
107 if(lstrcmp(NestMember,pobj_c->ppobj_Method[i]->psi->name)==0){
[50]108 subs.push_back( pobj_c->ppobj_Method[i]->psi );
[28]109 }
[4]110 }
111 }
112 }
[31]113 else{
114 //オブジェクトが明示的に指定されていないとき
[4]115
[31]116 if(pobj_CompilingClass){
117 //自身のオブジェクトのメンバ関数を検索
[4]118
119
[31]120 //////////////////////////////////////////////
121 // 静的メソッド
122 //////////////////////////////////////////////
[4]123
[31]124 CClass *pobj_c = pobj_CompilingClass;
[4]125
[50]126 pobj_c->EnumStaticMethod( NestMember, subs );
[4]127
128
[31]129 ///////////////////////
130 // 動的メソッド(一般)
131 ///////////////////////
132 for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
133 //オーバーライドされた関数を飛び越す
134 if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass==0) break;
[4]135 }
[31]136 for(;i<pobj_CompilingClass->iMethodNum;i++){
[4]137 if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
[50]138 subs.push_back( pobj_CompilingClass->ppobj_Method[i]->psi );
[4]139 }
140 }
[31]141
142 //オーバーライドされたメンバ関数
143 for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
144 //オーバーライドされた関数を飛び越す
145 if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass){
146 if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
[50]147 subs.push_back( pobj_CompilingClass->ppobj_Method[i]->psi );
[31]148 }
149 }
150 }
[4]151 }
152
[27]153
[31]154 ///////////////////////////
155 // グローバル関数を検索
156 ///////////////////////////
[27]157
[31]158 //ハッシュ値を取得
159 int key;
160 key=hash_default(name);
[4]161
[31]162 //格納位置を取得
163 extern SUBINFO **ppSubHash;
164 SUBINFO *psi;
165 psi=ppSubHash[key];
166 while(psi){
167 if(!psi->pobj_ParentClass){
168 if(lstrcmp(psi->name,name)==0){
[50]169 subs.push_back( psi );
[31]170 }
[4]171 }
[31]172
173 psi=psi->pNextData;
[4]174 }
175
176 }
177}
178
179//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
[46]180SUBINFO *GetSubHash(const char *lpszName,BOOL bError){
[50]181 std::vector<SUBINFO *> subs;
182 GetOverloadSubHash(lpszName,subs);
[4]183
184 //関数が存在しないとき
[50]185 if(subs.size() == 0){
[4]186 return 0;
187 }
188
189 //一つ以上の関数が存在するときは内部エラー(デバッグ用)
[50]190 if(subs.size() > 1){
[5]191 if(bError) SetError(300,NULL,cp);
[4]192 }
193
[50]194 SUBINFO *psi;
195 psi = subs[0];
[4]196
197 return psi;
[5]198}
199SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError){
200 char temporary[VN_SIZE];
201 sprintf(temporary,"%s.%s",ObjectName,MethodName);
202
[50]203 std::vector<SUBINFO *> subs;
204 SUBINFO *psi;
205 GetOverloadSubHash(temporary,subs);
[5]206
207 //関数が存在しないとき
[50]208 if(subs.size() == 0){
[5]209 return 0;
210 }
211
212 //オーバーロードを解決
[50]213 psi=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName,NULL);
[5]214
215 return psi;
216}
Note: See TracBrowser for help on using the repository browser.