source: dev/BasicCompiler_Common/hash.cpp@ 101

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

名前空間機能をグローバル関数に適用(作業完了)。

File size: 4.2 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
[75]9int hash_default(const char *name){
[4]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
[97]19CONSTINFO *GetConstHash(const char *name){
[4]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
[75]37DllProc *GetDeclareHash(char *name){
[4]38 //ハッシュ値を取得
39 int key;
40 key=hash_default(name);
41
42 //格納位置を取得
[75]43 extern DllProc **ppDeclareHash;
44 DllProc *pDllProc;
45 pDllProc=ppDeclareHash[key];
46 while(pDllProc){
47 if( pDllProc->GetName() == name ){
48 break;
49 }
[4]50
[75]51 pDllProc=pDllProc->pNextData;
[4]52 }
53
[75]54 return pDllProc;
[4]55}
56
[75]57void GetOverloadSubHash( const char *lpszName, std::vector<UserProc *> &subs ){
[4]58 char name[VN_SIZE];
59
60 if(lpszName[0]=='.'){
61 GetWithName(name);
62 lstrcat(name,lpszName);
63 }
64 else lstrcpy(name,lpszName);
65
[101]66 if( (string)lpszName == "Test2.Proc3" ){
67 int test=0;
68 }
[4]69
70 char ObjName[VN_SIZE]; //オブジェクト変数
71 char NestMember[VN_SIZE]; //入れ子メンバ
[28]72 bool isObjectMember = SplitMemberName( name, ObjName, NestMember );
[4]73
[28]74 if(isObjectMember){
[4]75 //オブジェクトのメンバ関数の場合
76
[27]77 bool isStatic = false;
[75]78 const CClass *pobj_c = NULL;
[4]79 if(lstrcmpi(ObjName,"Super")==0){
[27]80 //クラスメンバ関数内から基底クラスの呼び出し
81 pobj_c=pobj_CompilingClass;
82 }
83 else{
[47]84 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
[75]85 Type type;
[100]86 if( GetVarType(ObjName,type,0) ){
87 pobj_c = &type.GetClass();
88 }
89 else{
[47]90 pobj_c=pobj_DBClass->check(ObjName);
91 if( pobj_c ){
92 isStatic = true;
93 }
[28]94 }
[4]95 }
96
[101]97 if( pobj_c && pobj_c != (CClass *)-1 ){
[100]98 if( isStatic ){
99 // 静的メソッドから列挙
100 pobj_c->EnumStaticMethod( NestMember, subs );
101 }
102 else{
103 //動的メソッドから列挙
104 pobj_c->EnumMethod( NestMember, subs );
105 }
106 return;
[4]107 }
108 }
109
110
[100]111 if(pobj_CompilingClass){
112 //自身のオブジェクトのメンバ関数を検索
[4]113
[100]114 // 静的メソッド
115 pobj_CompilingClass->EnumStaticMethod( name, subs );
[4]116
[100]117 // 動的メソッド
118 pobj_CompilingClass->EnumMethod( name, subs );
119 }
[27]120
121
[100]122 ///////////////////////////
123 // グローバル関数を検索
124 ///////////////////////////
[4]125
[100]126 //ハッシュ値を取得
127 int key;
128 key=hash_default(NestMember);
129
130 //格納位置を取得
131 extern GlobalProc **ppSubHash;
132 GlobalProc *pUserProc;
133 pUserProc=ppSubHash[key];
134 while(pUserProc){
135 if(!pUserProc->GetParentClassPtr()){
[101]136 if( pUserProc->IsEqualSymbol( name ) ){
[100]137 subs.push_back( pUserProc );
[4]138 }
139 }
140
[100]141 pUserProc=pUserProc->pNextData;
[4]142 }
143}
144
145//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
[75]146UserProc *GetSubHash(const char *lpszName,BOOL bError){
147 std::vector<UserProc *> subs;
[50]148 GetOverloadSubHash(lpszName,subs);
[4]149
150 //関数が存在しないとき
[50]151 if(subs.size() == 0){
[75]152 if(bError){
153 SetError(3,lpszName,cp);
154 }
[4]155 return 0;
156 }
157
158 //一つ以上の関数が存在するときは内部エラー(デバッグ用)
[50]159 if(subs.size() > 1){
[5]160 if(bError) SetError(300,NULL,cp);
[4]161 }
162
[75]163 UserProc *pUserProc;
164 pUserProc = subs[0];
[4]165
[75]166 return pUserProc;
[5]167}
[75]168UserProc *GetMethodHash(const char *ObjectName,const char *MethodName,const char *Parameter,BOOL bError){
[5]169 char temporary[VN_SIZE];
170 sprintf(temporary,"%s.%s",ObjectName,MethodName);
171
[75]172 std::vector<UserProc *> subs;
173 UserProc *pUserProc;
[50]174 GetOverloadSubHash(temporary,subs);
[5]175
176 //関数が存在しないとき
[50]177 if(subs.size() == 0){
[5]178 return 0;
179 }
180
181 //オーバーロードを解決
[75]182 pUserProc=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName);
[5]183
[75]184 return pUserProc;
[5]185}
[95]186
187UserProc *GetClassMethod( const char *className, const char *methodName ){
188 CClass *pClass = pobj_DBClass->check( className );
189 if( pClass ){
190 vector<UserProc *> userProcs;
191 pClass->EnumMethod( methodName, userProcs );
192 if( userProcs.size() == 1 ){
193 return userProcs[0];
194 }
195 }
196
197 char temporary[VN_SIZE];
198 sprintf( temporary, "%s.%s", className, methodName );
199 SetError(3, temporary, -1 );
200
201 return NULL;
202}
Note: See TracBrowser for help on using the repository browser.