source: dev/trunk/abdev/BasicCompiler_Common/hash.cpp@ 193

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