source: dev/BasicCompiler_Common/hash.cpp@ 47

Last change on this file since 47 was 47, checked in by dai_9181, 17 years ago

列挙子の比較演算が正常に行えないバグを修正。
クラス名と同名のグローバル関数を定義できないバグを修正

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( const 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 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
117 int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
118 if(!(NATURAL_TYPE(type)==DEF_OBJECT)){
119 pobj_c=pobj_DBClass->check(ObjName);
120 if( pobj_c ){
121 isStatic = true;
122 }
123 else{
124 goto finish;
125 }
126 }
127 }
128
129 if( isStatic ){
130 // 静的メソッドから取得
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 }
137 }
138 else{
139 //動的メソッドから取得
140
141 //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
142 for(i=pobj_c->iMethodNum-1;i>=0;i--){
143 if(lstrcmp(NestMember,pobj_c->ppobj_Method[i]->psi->name)==0){
144 ppArray_si[num]=pobj_c->ppobj_Method[i]->psi;
145 num++;
146 }
147 }
148 }
149 }
150 else{
151 //オブジェクトが明示的に指定されていないとき
152
153 if(pobj_CompilingClass){
154 //自身のオブジェクトのメンバ関数を検索
155
156
157 //////////////////////////////////////////////
158 // 静的メソッド
159 //////////////////////////////////////////////
160
161 CClass *pobj_c = pobj_CompilingClass;
162
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 }
169
170
171 ///////////////////////
172 // 動的メソッド(一般)
173 ///////////////////////
174 for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
175 //オーバーライドされた関数を飛び越す
176 if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass==0) break;
177 }
178 for(;i<pobj_CompilingClass->iMethodNum;i++){
179 if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
180 ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
181 num++;
182 }
183 }
184
185 //オーバーライドされたメンバ関数
186 for(i=0;i<pobj_CompilingClass->iMethodNum;i++){
187 //オーバーライドされた関数を飛び越す
188 if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass){
189 if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
190 ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
191 num++;
192 }
193 }
194 }
195 }
196
197
198 ///////////////////////////
199 // グローバル関数を検索
200 ///////////////////////////
201
202 //ハッシュ値を取得
203 int key;
204 key=hash_default(name);
205
206 //格納位置を取得
207 extern SUBINFO **ppSubHash;
208 SUBINFO *psi;
209 psi=ppSubHash[key];
210 while(psi){
211 if(!psi->pobj_ParentClass){
212 if(lstrcmp(psi->name,name)==0){
213 ppArray_si[num]=psi;
214 num++;
215 }
216 }
217
218 psi=psi->pNextData;
219 }
220
221 }
222finish:
223
224 *pNum=num;
225 return ppArray_si;
226}
227
228//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
229SUBINFO *GetSubHash(const char *lpszName,BOOL bError){
230 int num;
231 SUBINFO **ppsi,*psi;
232 ppsi = GetOverloadSubHash(lpszName,&num);
233
234 //関数が存在しないとき
235 if(num == 0){
236 HeapDefaultFree(ppsi);
237 return 0;
238 }
239
240 //一つ以上の関数が存在するときは内部エラー(デバッグ用)
241 if(num > 1){
242 if(bError) SetError(300,NULL,cp);
243 }
244
245 psi = ppsi[0];
246
247 HeapDefaultFree(ppsi);
248
249 return psi;
250}
251SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError){
252 char temporary[VN_SIZE];
253 sprintf(temporary,"%s.%s",ObjectName,MethodName);
254
255 int num;
256 SUBINFO **ppsi,*psi;
257 ppsi = GetOverloadSubHash(temporary,&num);
258
259 //関数が存在しないとき
260 if(num == 0){
261 HeapDefaultFree(ppsi);
262 return 0;
263 }
264
265 //オーバーロードを解決
266 psi=OverloadSolutionWithStrParam(temporary,ppsi,num,Parameter,ObjectName,NULL);
267 HeapDefaultFree(ppsi);
268
269 return psi;
270}
Note: See TracBrowser for help on using the repository browser.