source: dev/branches/egtra/ab5.0/abdev/BasicCompiler_Common/hash.cpp@ 803

Last change on this file since 803 was 803, checked in by イグトランス (egtra), 13 years ago

Hashmapの実装にunorderedを用いるよう変更

File size: 4.3 KB
Line 
1#include "stdafx.h"
2
3#include <Compiler.h>
4
5#include "../BasicCompiler_Common/common.h"
6
7#ifdef _AMD64_
8#include "../compiler_x64/opcode.h"
9#else
10#include "../compiler_x86/opcode.h"
11#endif
12
13using namespace ActiveBasic::Compiler;
14
15int hash_default(const char *name){
16 int key;
17
18 for(key=0;*name!='\0';name++){
19 key=((key<<8)+ *name )%MAX_HASH;
20 }
21
22 return key;
23}
24
25DllProc *GetDeclareHash(const char *fullName){
26 char namespaceStr[VN_SIZE]; //オブジェクト変数
27 char simpleName[VN_SIZE]; //入れ子メンバ
28 bool isObjectMember = SplitMemberName( fullName, namespaceStr, simpleName );
29
30 ///////////////////////////
31 // グローバル関数を検索
32 ///////////////////////////
33
34 // ハッシュ値を取得
35 foreach (auto pDllProc, compiler.GetObjectModule().meta.GetDllProcs().GetHashArrayElement(simpleName))
36 {
37 if( pDllProc->IsEqualSymbol( LexicalAnalyzer::FullNameToSymbol( fullName ) ) ){
38 return pDllProc;
39 }
40 }
41
42 return NULL;
43}
44
45void GetOverloadSubHash( const char *lpszName, std::vector<const UserProc *> &subs ){
46 char name[VN_SIZE];
47
48 if(lpszName[0]=='.'){
49 GetWithName(name);
50 lstrcat(name,lpszName);
51 }
52 else lstrcpy(name,lpszName);
53
54 char ObjName[VN_SIZE]; //オブジェクト変数
55 char NestMember[VN_SIZE]; //入れ子メンバ
56 bool isObjectMember = SplitMemberName( name, ObjName, NestMember );
57
58 if(isObjectMember){
59 //オブジェクトのメンバ関数の場合
60
61 bool isStatic = false;
62 const CClass *pobj_c = NULL;
63 if(lstrcmpi(ObjName,"Super")==0)
64 {
65 //クラスメンバ関数内から基底クラスの呼び出し
66 pobj_c=&compiler.GetCompilingClass().GetSuperClass();
67 }
68 else
69 {
70 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
71 Type type;
72 if( GetTermType(ObjName,type) )
73 {
74 if( type.IsObject() )
75 {
76 pobj_c = &type.GetClass();
77 }
78 }
79
80 if( !pobj_c )
81 {
82 pobj_c = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
83 LexicalAnalyzer::FullNameToSymbol( ObjName )
84 );
85 if( pobj_c ){
86 isStatic = true;
87 }
88 }
89 }
90
91 if( pobj_c && pobj_c != (CClass *)-1 ){
92 if( isStatic ){
93 // 静的メソッドから列挙
94 pobj_c->GetStaticMethods().Enum( NestMember, subs );
95 }
96 else{
97 //動的メソッドから列挙
98 pobj_c->EnumDynamicMethodsOrInterfaceMethods( NestMember, subs );
99 }
100
101 return;
102 }
103 }
104
105
106 if( compiler.IsCompilingClass() ){
107 //自身のオブジェクトのメンバ関数を検索
108
109 // 静的メソッド
110 compiler.GetCompilingClass().GetStaticMethods().Enum( name, subs );
111
112 // 動的メソッド
113 compiler.GetCompilingClass().EnumDynamicMethodsOrInterfaceMethods( name, subs );
114 }
115
116
117 // グローバル関数を検索
118 compiler.GetObjectModule().meta.GetUserProcs().EnumGlobalProcs( NestMember, LexicalAnalyzer::FullNameToSymbol( name ), subs );
119}
120
121//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
122const UserProc *GetSubHash(const char *lpszName,BOOL bError){
123 std::vector<const UserProc *> subs;
124 GetOverloadSubHash(lpszName,subs);
125
126 //関数が存在しないとき
127 if(subs.size() == 0){
128 if(bError){
129 compiler.errorMessenger.Output(3,lpszName,cp);
130 }
131 return 0;
132 }
133
134 //一つ以上の関数が存在するときは内部エラー(デバッグ用)
135 if(subs.size() > 1){
136 if(bError) compiler.errorMessenger.Output(300,NULL,cp);
137 }
138
139 const UserProc *pUserProc = subs[0];
140
141 return pUserProc;
142}
143const UserProc *GetMethodHash(const char *ObjectName,const char *MethodName,const char *Parameter,BOOL bError){
144 char temporary[VN_SIZE];
145 sprintf(temporary,"%s.%s",ObjectName,MethodName);
146
147 std::vector<const UserProc *> subs;
148 GetOverloadSubHash(temporary,subs);
149
150 //関数が存在しないとき
151 if(subs.size() == 0){
152 return 0;
153 }
154
155 //オーバーロードを解決
156 const UserProc *pUserProc = OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName);
157
158 return pUserProc;
159}
160
161const UserProc *GetClassMethod( const char *className, const char *methodName ){
162 const CClass *pClass = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
163 LexicalAnalyzer::FullNameToSymbol( className )
164 );
165 if( pClass ){
166 std::vector<const UserProc *> userProcs;
167 pClass->EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
168 if( userProcs.size() == 1 ){
169 return userProcs[0];
170 }
171 }
172
173 char temporary[VN_SIZE];
174 sprintf( temporary, "%s.%s", className, methodName );
175 compiler.errorMessenger.Output(3, temporary, -1 );
176
177 return NULL;
178}
Note: See TracBrowser for help on using the repository browser.