#include "../BasicCompiler_Common/common.h" #ifdef _AMD64_ #include "../BasicCompiler64/opcode.h" #else #include "../BasicCompiler32/opcode.h" #endif int hash_default(char *name){ int key; for(key=0;*name!='\0';name++){ key=((key<<8)+ *name )%MAX_HASH; } return key; } CONSTINFO *GetConstHash(char *name){ //ハッシュ値を取得 int key; key=hash_default(name); //格納位置を取得 extern CONSTINFO **ppConstHash; CONSTINFO *pci; pci=ppConstHash[key]; while(pci){ if(lstrcmp(pci->name,name)==0) break; pci=pci->pNextData; } return pci; } DECLAREINFO *GetDeclareHash(char *name){ //ハッシュ値を取得 int key; key=hash_default(name); //格納位置を取得 extern DECLAREINFO **ppDeclareHash; DECLAREINFO *pdi; pdi=ppDeclareHash[key]; while(pdi){ if(lstrcmp(pdi->name,name)==0) break; pdi=pdi->pNextData; } return pdi; } void GetOverloadSubHash( const char *lpszName, std::vector &subs ){ char name[VN_SIZE]; if(lpszName[0]=='.'){ GetWithName(name); lstrcat(name,lpszName); } else lstrcpy(name,lpszName); char ObjName[VN_SIZE]; //オブジェクト変数 char NestMember[VN_SIZE]; //入れ子メンバ bool isObjectMember = SplitMemberName( name, ObjName, NestMember ); if( !isObjectMember ) lstrcpy(ObjName,name); if(isObjectMember){ //オブジェクトのメンバ関数の場合 bool isStatic = false; CClass *pobj_c; if(lstrcmpi(ObjName,"Super")==0){ //クラスメンバ関数内から基底クラスの呼び出し pobj_c=pobj_CompilingClass; } else{ //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0); if(!(NATURAL_TYPE(type)==DEF_OBJECT)){ pobj_c=pobj_DBClass->check(ObjName); if( pobj_c ){ isStatic = true; } else{ return; } } } if( isStatic ){ // 静的メソッドから列挙 pobj_c->EnumStaticMethod( NestMember, subs ); } else{ //動的メソッドから列挙 pobj_c->EnumMethod( NestMember, subs ); } } else{ //オブジェクトが明示的に指定されていないとき if(pobj_CompilingClass){ //自身のオブジェクトのメンバ関数を検索 // 静的メソッド pobj_CompilingClass->EnumStaticMethod( name, subs ); // 動的メソッド pobj_CompilingClass->EnumMethod( name, subs ); } /////////////////////////// // グローバル関数を検索 /////////////////////////// //ハッシュ値を取得 int key; key=hash_default(name); //格納位置を取得 extern SubInfo **ppSubHash; SubInfo *psi; psi=ppSubHash[key]; while(psi){ if(!psi->pobj_ParentClass){ if(lstrcmp(psi->name,name)==0){ subs.push_back( psi ); } } psi=psi->pNextData; } } } //オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持) SubInfo *GetSubHash(const char *lpszName,BOOL bError){ std::vector subs; GetOverloadSubHash(lpszName,subs); //関数が存在しないとき if(subs.size() == 0){ return 0; } //一つ以上の関数が存在するときは内部エラー(デバッグ用) if(subs.size() > 1){ if(bError) SetError(300,NULL,cp); } SubInfo *psi; psi = subs[0]; return psi; } SubInfo *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError){ char temporary[VN_SIZE]; sprintf(temporary,"%s.%s",ObjectName,MethodName); std::vector subs; SubInfo *psi; GetOverloadSubHash(temporary,subs); //関数が存在しないとき if(subs.size() == 0){ return 0; } //オーバーロードを解決 psi=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName,NULL); return psi; }