class CClass; struct SUBINFO; //データ型 struct TYPEINFO{ int type; union{ LONG_PTR lpIndex; CClass *pobj_Class; }u; }; #define ACCESS_NON 0 #define ACCESS_PRIVATE 1 #define ACCESS_PUBLIC 2 #define ACCESS_PROTECTED 3 class CMember{ bool isConst; public: char *name; int SubScripts[MAX_ARRAYDIM]; TYPEINFO TypeInfo; DWORD dwAccess; char *InitBuf; char *ConstractParameter; int source_code_address; CMember( CClass *pobj_c, DWORD access, bool idConst, char *buffer, int NowLine=-1 ); CMember( CMember *pobj ); CMember(); ~CMember(); bool IsConst(); static void InitStaticMember(void); }; class CMethod{ public: SUBINFO *psi; DWORD dwAccess; BOOL bAbstract; BOOL bVirtual; bool isConst; CClass *pobj_InheritsClass; CMethod(CMethod *pobj); CMethod(); ~CMethod(); }; class CClass{ public: //クラス名 char *name; //継承クラスへのポインタ CClass *pobj_InheritsClass; //メンバ情報 CMember **ppobj_Member; int iMemberNum; //メソッド情報 CMethod **ppobj_Method; int iMethodNum; int ConstructorMemberSubIndex; int DestructorMemberSubIndex; int CopyConstructorMemberSubIndex; //静的メンバ情報 CMember **ppobj_StaticMember; int iStaticMemberNum; //静的メソッド情報 CMethod **ppobj_StaticMethod; int iStaticMethodNum; //仮想関数の数 int vtbl_num; //アラインメント値 int iAlign; public: CClass(char *name); ~CClass(); void AddMember( DWORD dwAccess, bool idConst, char *buffer ); void AddStaticMember( DWORD dwAccess, bool isConst, char *buffer, int NowLine ); void AddMethod( SUBINFO *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ); void AddStaticMethod(SUBINFO *psi,DWORD dwAccess); BOOL DupliCheckAll(char *name); BOOL DupliCheckMember(char *name); CMethod *GetMethodInfo( SUBINFO *psi ); CMethod *GetStaticMethodInfo( SUBINFO *psi ); //vtbl private: long vtbl_offset; LONG_PTR AddVtblDataTable(SUBINFO **ppsi,int length); public: LONG_PTR GetVtblGlobalOffset(void); void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection); BOOL IsHoldAbstractFunction(void); //オペレータ関数の取得 SUBINFO **GetOperatorSubInfo(BYTE idCalc,int &num); //コンストラクタをコンパイルしているかどうかのチェックフラグ private: bool isCompilingConstructor; public: void NotifyStartConstructorCompile(); void NotifyFinishConstructorCompile(); bool IsCompilingConstructor(); //デストラクタをコンパイルしているかどうかのチェックフラグ private: bool isCompilingDestructor; public: void NotifyStartDestructorCompile(); void NotifyFinishDestructorCompile(); bool IsCompilingDestructor(); //線形リスト用 CClass *pobj_NextClass; }; #define MAX_CLASS_HASH 65535 class CDBClass{ int hash(char *name); void DestroyClass(CClass *pobj_c); public: CClass *pobj_ClassHash[MAX_CLASS_HASH]; CDBClass(); ~CDBClass(); CClass *check(char *name); CClass *AddClass(char *name,int NowLine); void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection); private: void AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, BOOL bAbstract, BOOL bVirtual, BOOL bOverride, char *buffer, int NowLine); BOOL MemberVar_LoopRefCheck(CClass *pobj_c); public: void InitNames(void); void GetClass_recur(char *lpszInheritsClass); void GetObjectClassInfo(void); ///////////////////////////// // 現在コンパイル中の情報 ///////////////////////////// private: CClass *pCompilingClass; CMethod *pCompilingMethod; public: //コンパイル開始の通知を受け取るメソッド void StartCompile( SUBINFO *psi ); //現在コンパイル中のメソッド情報を取得 CClass *GetNowCompilingClass(); CMethod *GetNowCompilingMethodInfo(); ///////////////////// // イテレータ ///////////////////// private: CClass **ppobj_IteClass; int iIteMaxNum; int iIteNextNum; public: void Iterator_Reset(void); BOOL Iterator_HasNext(void); CClass *Iterator_GetNext(void); int Iterator_GetMaxCount(void); }; extern CDBClass *pobj_DBClass; extern CClass *pobj_CompilingClass;