source: dev/BasicCompiler_Common/hash.cpp@ 37

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

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

File size: 5.9 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
6#include "../BasicCompiler32/opcode.h"
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
55SUBINFO **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
79SUBINFO **GetOverloadSubHash(char *lpszName,int *pNum){
80 extern SUBINFO *pSubInfo;
81 extern int SubInfoNum;
82 extern int cp;
83 int i;
84
85 char name[VN_SIZE];
86
87 if(lpszName[0]=='.'){
88 GetWithName(name);
89 lstrcat(name,lpszName);
90 }
91 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);
99
100
101 char ObjName[VN_SIZE]; //オブジェクト変数
102 char NestMember[VN_SIZE]; //入れ子メンバ
103 bool isObjectMember = SplitMemberName( name, ObjName, NestMember );
104 if( !isObjectMember ) lstrcpy(ObjName,name);
105
106 if(isObjectMember){
107 //オブジェクトのメンバ関数の場合
108
109 bool isStatic = false;
110 CClass *pobj_c;
111 if(lstrcmpi(ObjName,"Super")==0){
112 //クラスメンバ関数内から基底クラスの呼び出し
113 pobj_c=pobj_CompilingClass;
114 }
115 else{
116 pobj_c=pobj_DBClass->check(ObjName);
117 if( pobj_c ){
118 isStatic = true;
119 }
120 else{
121 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
122 int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
123 if(!(NATURAL_TYPE(type)==DEF_OBJECT)) goto finish;
124 }
125 }
126
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 }
145 }
146 }
147 }
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++){
177 if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
178 ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
179 num++;
180 }
181 }
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 }
220finish:
221
222 *pNum=num;
223 return ppArray_si;
224}
225
226//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
227SUBINFO *GetSubHash(char *lpszName,BOOL bError){
228 int num;
229 SUBINFO **ppsi,*psi;
230 ppsi = GetOverloadSubHash(lpszName,&num);
231
232 //関数が存在しないとき
233 if(num == 0){
234 HeapDefaultFree(ppsi);
235 return 0;
236 }
237
238 //一つ以上の関数が存在するときは内部エラー(デバッグ用)
239 if(num > 1){
240 if(bError) SetError(300,NULL,cp);
241 }
242
243 psi = ppsi[0];
244
245 HeapDefaultFree(ppsi);
246
247 return psi;
248}
249SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError){
250 char temporary[VN_SIZE];
251 sprintf(temporary,"%s.%s",ObjectName,MethodName);
252
253 int num;
254 SUBINFO **ppsi,*psi;
255 ppsi = GetOverloadSubHash(temporary,&num);
256
257 //関数が存在しないとき
258 if(num == 0){
259 HeapDefaultFree(ppsi);
260 return 0;
261 }
262
263 //オーバーロードを解決
264 psi=OverloadSolutionWithStrParam(temporary,ppsi,num,Parameter,ObjectName,NULL);
265 HeapDefaultFree(ppsi);
266
267 return psi;
268}
Note: See TracBrowser for help on using the repository browser.