source: dev/BasicCompiler_Common/hash.cpp@ 73

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

Parameterクラスを適用。32bit側は動くようになったので、64bitのほうを調整する。

File size: 3.6 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
55void GetOverloadSubHash( const char *lpszName, std::vector<SubInfo *> &subs ){
56 char name[VN_SIZE];
57
58 if(lpszName[0]=='.'){
59 GetWithName(name);
60 lstrcat(name,lpszName);
61 }
62 else lstrcpy(name,lpszName);
63
64
65 char ObjName[VN_SIZE]; //オブジェクト変数
66 char NestMember[VN_SIZE]; //入れ子メンバ
67 bool isObjectMember = SplitMemberName( name, ObjName, NestMember );
68 if( !isObjectMember ) lstrcpy(ObjName,name);
69
70 if(isObjectMember){
71 //オブジェクトのメンバ関数の場合
72
73 bool isStatic = false;
74 CClass *pobj_c;
75 if(lstrcmpi(ObjName,"Super")==0){
76 //クラスメンバ関数内から基底クラスの呼び出し
77 pobj_c=pobj_CompilingClass;
78 }
79 else{
80 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
81 int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
82 if(!(NATURAL_TYPE(type)==DEF_OBJECT)){
83 pobj_c=pobj_DBClass->check(ObjName);
84 if( pobj_c ){
85 isStatic = true;
86 }
87 else{
88 return;
89 }
90 }
91 }
92
93 if( isStatic ){
94 // 静的メソッドから列挙
95 pobj_c->EnumStaticMethod( NestMember, subs );
96 }
97 else{
98 //動的メソッドから列挙
99 pobj_c->EnumMethod( NestMember, subs );
100 }
101 }
102 else{
103 //オブジェクトが明示的に指定されていないとき
104
105 if(pobj_CompilingClass){
106 //自身のオブジェクトのメンバ関数を検索
107
108 // 静的メソッド
109 pobj_CompilingClass->EnumStaticMethod( name, subs );
110
111 // 動的メソッド
112 pobj_CompilingClass->EnumMethod( name, subs );
113 }
114
115
116 ///////////////////////////
117 // グローバル関数を検索
118 ///////////////////////////
119
120 //ハッシュ値を取得
121 int key;
122 key=hash_default(name);
123
124 //格納位置を取得
125 extern SubInfo **ppSubHash;
126 SubInfo *psi;
127 psi=ppSubHash[key];
128 while(psi){
129 if(!psi->pobj_ParentClass){
130 if(lstrcmp(psi->name,name)==0){
131 subs.push_back( psi );
132 }
133 }
134
135 psi=psi->pNextData;
136 }
137
138 }
139}
140
141//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
142SubInfo *GetSubHash(const char *lpszName,BOOL bError){
143 std::vector<SubInfo *> subs;
144 GetOverloadSubHash(lpszName,subs);
145
146 //関数が存在しないとき
147 if(subs.size() == 0){
148 return 0;
149 }
150
151 //一つ以上の関数が存在するときは内部エラー(デバッグ用)
152 if(subs.size() > 1){
153 if(bError) SetError(300,NULL,cp);
154 }
155
156 SubInfo *psi;
157 psi = subs[0];
158
159 return psi;
160}
161SubInfo *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError){
162 char temporary[VN_SIZE];
163 sprintf(temporary,"%s.%s",ObjectName,MethodName);
164
165 std::vector<SubInfo *> subs;
166 SubInfo *psi;
167 GetOverloadSubHash(temporary,subs);
168
169 //関数が存在しないとき
170 if(subs.size() == 0){
171 return 0;
172 }
173
174 //オーバーロードを解決
175 psi=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName,NULL);
176
177 return psi;
178}
Note: See TracBrowser for help on using the repository browser.