source: dev/BasicCompiler_Common/hash.cpp@ 51

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

ppobj_Member及びppobj_StaticMemberを廃止し、vectorに統一した(methods及びstaticMethods)。

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