//#define _CRT_SECURE_NO_DEPRECATE #pragma warning(disable : 4996) #include #include #include #include #include #include #include #include #include //boost libraries #include #define foreach BOOST_FOREACH #ifdef _AMD64_ #include "../BasicCompiler64/resource.h" #include "../BasicCompiler64/CommandValue.h" #include "../BasicCompiler64/FunctionValue.h" #define OPCODE_H_PATH "../BasicCompiler64/opcode.h" #else #include "../BasicCompiler32/resource.h" #include "../BasicCompiler32/CommandValue.h" #include "../BasicCompiler32/FunctionValue.h" #define OPCODE_H_PATH "../BasicCompiler32/opcode.h" #endif #include "../BasicCompiler_Common/BasicFixed.h" #include "../BasicCompiler_Common/NonVolatile.h" #include "../BasicCompiler_Common/TypeDef.h" #include "../BasicCompiler_Common/psapi.h" #include "../BasicCompiler_Common/BreakPoint.h" //バージョン #define MAJOR_VER 5 #define MINOR_VER 00 #define REVISION_VER 00 #ifdef _AMD64_ #define VER_INFO "β13 (x64)" #else #define VER_INFO "β13" #endif #if defined(JPN) //日本語 #include "common_msg_jpn.h" #else //英語 #include "common_msg_eng.h" #endif #pragma comment(lib, "psapi.lib") #define PTR_SIZE sizeof(LONG_PTR) #define MAX_LEN 65535 #define VN_SIZE 512 #define DIGIT_SIZE 128 #define MAX_PARMS 64 #define MAX_ARRAYDIM 16 #define MAX_HASH 32761 #ifdef _AMD64_ #define PLATFORM 64 #else #define PLATFORM 32 typedef long LONG_PTR; typedef DWORD ULONG_PTR; #endif //未定義の定数情報 #define IMAGE_FILE_MACHINE_AMD64 0x8664 extern HWND hOwnerEditor; extern HANDLE hHeap; extern char BasicSystemDir[MAX_PATH]; extern int cp; extern bool isUnicode; ////////////////////////////////////////// // BasicCompiler、ProjectEditor共通の定数 ////////////////////////////////////////// //サイズ変更枠の太さ #define LEVER_THICK 5 #define WM_SHOWERROR WM_USER+70 //エラー表示メッセージ #define WM_SETCOMPILEVIEW WM_USER+71 //コンパイラウィンドウが表示されたとき #define WM_DESTROYCOMPILEVIEW WM_USER+72 //コンパイラウィンドウが破棄されたとき #define WM_SETDEBUGGERBASE WM_USER+73 //デバッガベースウィンドウが表示されたとき #define WM_DESTROYDEBUGGERBASE WM_USER+74 //デバッガベースウィンドウが破棄されたとき #define WM_SETDEBUGGERVIEW WM_USER+75 //デバッガウィンドウが表示されたとき #define WM_DESTROYDEBUGGERVIEW WM_USER+76 //デバッガウィンドウが表示されたとき /////////////////////////////////////////// #define WM_SHOWVARLIST WM_USER+80 #define WM_VARLIST_CLOSE WM_USER+81 //変数リストの終了メッセージ(破棄のみ、解放なし) /////////////////////////////////////////// // デバッグ コマンド #define WM_DEBUG_CONTINUE WM_USER+200 #define WM_STEP_IN WM_USER+201 #define WM_STEP_OVER WM_USER+202 #define WM_STEP_CURSOR WM_USER+203 #define WM_DEBUG_STOP WM_USER+204 #define WM_DEBUG_PAUSE WM_USER+205 #define WM_CLOSE_DEBUGGER WM_USER+206 /////////////////////////////////////////// #define FILE_ALIGNMENT 0x1000 #define MEM_ALIGNMENT 0x1000 #define EXE_HEADER_SIZE 0x1000 //クラス管理用のクラス #include "Class.h" //列挙体管理用のクラス #include "Enum.h" //定数管理用のクラス #include "Const.h" struct ERRORINFO{ char *FileName; int line; }; struct INCLUDEFILEINFO{ char **ppFileNames; int FilesNum; int LineOfFile[MAX_LEN]; }; //変数 #define REF_PARAMETER 1 #define OBJECT_PARAMETER 2 #define REF_VARIABLE 4 struct VARIABLE{ char name[255]; int type; union{ LONG_PTR index; CClass *pobj_c; }u; DWORD fRef; //定数変数かどうか bool bConst; BOOL bArray; int SubScripts[MAX_ARRAYDIM]; //コンストラクタ用パラメータ char *ConstractParameter; /* --- オフセット --- ※グローバル変数で初期バッファがない場合は最上位ビットに1がセットされ、 初期バッファの有無が識別される。 (その後、スケジュール実行により、実際の配置に並び替えられる)*/ int offset; //レキシカルスコープ用 int ScopeStartAddress; int ScopeEndAddress; int ScopeLevel; BOOL bLiving; int source_code_address; }; //変数の相対情報 struct RELATIVE_VAR{ DWORD dwKind; LONG_PTR offset; BOOL bOffsetOffset; }; //パラメータ struct PARAMETER_INFO{ char *name; int type; union{ LONG_PTR index; CClass *pobj_c; }u; BOOL bByVal; BOOL bArray; int SubScripts[MAX_ARRAYDIM]; }; #define SUBTYPE_SUB 1 #define SUBTYPE_FUNCTION 2 #define SUBTYPE_MACRO 3 struct SUBINFO{ DWORD dwType; //クラス情報 CClass *pobj_ParentClass; long id; char *name; long address; //パラメータ PARAMETER_INFO *pParmInfo; int ParmNum; int SecondParmNum; PARAMETER_INFO *pRealParmInfo; int RealParmNum; int RealSecondParmNum; //戻り値 int ReturnType; union{ LONG_PTR ReturnIndex; CClass *Return_pobj_c; }u; bool isReturnRef; DWORD CompileAddress; DWORD EndOpAddr; VARIABLE *pVar; int VarNum; BOOL bExport; BOOL bCdecl; BOOL bVirtual; BOOL bUse; BOOL bCompile; BOOL bSystem; SUBINFO *pNextData; }; #define DECLARE_DYNAMIC 1 #define DECLARE_STATIC 2 struct DECLAREINFO{ DWORD dwType; char *file; char *name; char *alias; BOOL bCdecl; //パラメータ PARAMETER_INFO *pParmInfo; int ParmNum; //戻り値 int ReturnType; union{ LONG_PTR ReturnIndex; CClass *Return_pobj_c; }u; union{ int LookupAddress; int StaticProc_CodeAddress; }; BOOL bUse; int pos; DECLAREINFO *pNextData; }; struct PROCPTRINFO{ PARAMETER_INFO *pParmInfo; int ParmNum; int ReturnType; union{ LONG_PTR ReturnIndex; CClass *Return_pobj_c; }u; }; struct CONSTINFO{ char *name; char *StrValue; double DblValue; _int64 i64Value; int type; LONG_PTR lpIndex; int ParmNum; char **ppParm; CONSTINFO *pNextData; }; #define CODETYPE_SYSTEMPROC 0x0001 #define CODETYPE_DEBUGPROC 0x0002 struct LINEINFO{ int TopCp; int TopObp; DWORD dwCodeType; }; struct RESOURCEDATAINFO{ DWORD dwId; char FileName[MAX_PATH]; }; ////////////////////////////////////////// // リソース ヘッダ(アイコン、カーソル用) typedef struct{ WORD idReserved; WORD idType; WORD idCount; }ICONDIR,CURSORDIR; ///////////////////////////// // .curファイルのヘッダ情報 struct CURSORDIRENTRY{ BYTE bWidth; BYTE bHeight; BYTE bColorCount; BYTE bReserved; WORD wXHotspot; WORD wYHotspot; DWORD dwBytesInRes; DWORD dwImageOffset; }; struct CURSORDIRENTRY_RES{ WORD wWidth; WORD wHeight; WORD wXHotspot; WORD wYHotspot; DWORD dwBytesInRes; WORD wCursorNum; }; //////////////////////////// //.icoファイルのヘッダ情報 struct ICONDIRENTRY{ BYTE bWidth; BYTE bHeight; BYTE bColorCount; BYTE bReserved; WORD wPlanes; WORD wBitCount; DWORD dwBytesInRes; DWORD dwImageOffset; }; struct ICONDIRENTRY_RES{ BYTE bWidth; BYTE bHeight; BYTE bColorCount; BYTE bReserved; WORD wPlanes; WORD wBitCount; DWORD dwBytesInRes; WORD wIconNum; }; #include "../BasicCompiler_Common/PESchedule.h" #include "../BasicCompiler_Common/DebugSection.h" #include "../BasicCompiler_Common/LexicalScoping.h" #include "../BasicCompiler_Common/Variable.h" #include "../BasicCompiler_Common/Exception.h" int StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,LONG_PTR *plpIndex,BOOL bDebuggingWatchList=0); //BasicCompiler.cpp void HeapDefaultFree(LPVOID lpMem); void ts(int i); void ts(int i,int i2); void ts(char *msg); void ts(char *msg,char *title); void epi_check(); void GetRelationalPath(char *path,char *dir); void GetFullPath(char *path,char *dir); void ShowErrorLine(int LineNum,char *FileName); BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,BOOL bOpen); void MakeMessageText(char *buffer,char *msg,int flag); //hash.cpp int hash_default(char *name); CONSTINFO *GetConstHash(char *name); DECLAREINFO *GetDeclareHash(char *name); SUBINFO *GetSubHash(const char *name,BOOL bError=0); SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError=0); void GetOverloadSubHash( const char *lpszName, std::vector &subs ); //Object.cpp void AddClassName(char *Parameter,int NowLine); void CallConstructor(char *VarName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter); //Overload.sbp SUBINFO *OverloadSolutionWithStrParam( const char *name, std::vector &subs, const char *Parameter, const char *ObjectName, TYPEINFO *pReturnTypeInfo); SUBINFO *OverloadSolution( const char *name, std::vector &subs, const PARAMETER_INFO *ppi, const int ParmNum, TYPEINFO *pReturnTypeInfo); //Debug.cpp void Debugger_StepIn(void); void Debugger_StepOver(void); void Debugger_StepCursor(void); void Debugger_Stop(void); void Debugger_Pause(void); ULONG_PTR rva_to_real(DWORD p); SUBINFO *GetSubFromObp(ULONG_PTR pos); void ReadOpBuffer(); void DebugProgram(void); //VarList.cpp void InitVarList(DWORD dwThreadId); BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); //WatchList.cpp ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar); ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip); int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss); //MakeExe.cpp void StepCompileProgress(void); void DeleteConstInfo(CONSTINFO **ppConstHash); void DeleteDeclareInfo(void); void AddSourceCode(char *buffer); void OutputExe(void); int MainThread(DWORD dummy); //Intermediate_Step1.cpp void ChangeReturnCode(char *buffer); void DeleteComment(char *buffer); void KillReturnCode(char *buffer); void CheckParenthesis(char *buffer); BOOL CheckParenthesis2(char *buffer); void DirectiveCheck(void); void NextCommandFormat(char *buffer); void SetEscapeSequenceFormat(char *buffer); void DefCommandFormat(char *buffer); void IfCommandFormat(char *buffer); void CheckPareCommand(void); //Intermediate_Step2.cpp bool GetConstInfo(void); void ChangeCommandToCode(char *buffer); //preprocessor.cpp char *OpenBasicFile(char *FileName); //Resource.cpp void GetResourceData(char *FileName); //CommandFormat.cpp void ComOpen(char *Parameter,char *buffer,int NowLine); void ComClose(char *Parameter,char *buffer); void ComField(char *Parameter,char *buffer); void ComLine(char *Parameter,char *buffer,int NowLine); void ComCircle(char *Parameter,char *buffer,int NowLine); void ComPSet(char *Parameter,char *buffer,int NowLine); void ComPaint(char *Parameter,char *buffer,int NowLine); // StrOperation.cpp void KillSpaces(char *str1,char *str2); void KillStringSpaces(char *str); BOOL RemoveStringQuotes(char *str); void RemoveStringPare(char *str); void RemoveStringBracket(char *str); void SetStringQuotes(char *str); int FormatString_EscapeSequence(char *buffer); void SlideString(char *str,int slide); void SlideBuffer(char *buffer,int length,int slide); _int8 IsCommandDelimitation(char c); BOOL IsBlank(char c); int GetOneParameter(char *Parameter,int pos,char *retAns); int JumpOneParameter(char *Parameter,int i); int GetStringInQuotation(char *buffer,char *ReadBuffer); int GetStringInPare(char *buffer,const char *ReadBuffer); int GetStringInPare_RemovePare(char *buffer,char *ReadBuffer); int GetStringInBracket(char *buffer,const char *ReadBuffer); int JumpStringInPare(const char *buffer,int pos); int JumpStringInBracket(const char *buffer,int pos); int GetCpFromLine(int LineNum); BOOL GetLineNum(int pos,int *pLine,char *FileName); char GetEndXXXCommand(char es); void GetDefaultNameFromES(char es,char *name); void GetCalcName(int idCalc,char *name); BOOL IsFile(char *path); BOOL ShortPathToLongPath(char ShortPath[MAX_PATH],char *LongPath); BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle); void ShortPathToLongPath(const char *ShortPath,char *LongPath); //calculation.cpp bool IsNumberTopChar(const char *buffer); bool IsNumberChar(const char c); BOOL IsNumCalcMark(const char *Command,int p); BOOL IsNumCalcMark_Back(const char *Command,int p); BOOL IsStrCalcMark(const char c); BOOL IsExponent(const char *Command,int p); int GetLiteralIndex(_int64 i64data); int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2); DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType); BOOL GetConstCalcBuffer(char *name,char *Parameter,char *pCalcBuffer); DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex); bool IsStringObjectType(const TYPEINFO &TypeInfo); BOOL IsStringSubsituation(CClass *pobj_c); int IsStrCalculation(char *Command); BYTE GetCalcId(const char *Command,int *pi); BOOL GetNumOpeElements(const char *Command,int *pnum, char *values[255],long calc[255],long stack[255]); //NumOpe_GetType.cpp int AutoBigCast(int BaseType,int CalcType); BOOL CheckCalcType(int idCalc,int *type,int sp); int NumOpe_GetType(char *Command,TYPEINFO *pBaseType,LONG_PTR *plpIndex); //Subroutine.cpp int GetCallProcName(char *buffer,char *name); int GetProc(char *name,void **ppInfo); void SplitObjectName(const char *name,char *ObjectName,int *pRefType); bool SplitMemberName( const char *desc, char *object, char *member ); int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex); BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo); int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex); BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo); bool GetReturnTypeOfIndexerGetterProc(CClass *pobj_Class,TYPEINFO &RetTypeInfo); BOOL CompareParameter(PARAMETER_INFO *ppi1,int pi_num1,PARAMETER_INFO *ppi2,int pi_num2); SUBINFO *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic=0); void GetSubInfo(void); void DeleteSubInfo(SUBINFO **ppSubHash,char **ppMacroNames,int MacroNum); void DeleteDeclareInfo(void); int AddProcPtrInfo(char *buffer,DWORD dwProcType); void DeleteProcPtrInfo(void); //LoopRefCheck.cpp class CLoopRefCheck{ char **names; int num; void init(); public: CLoopRefCheck(); ~CLoopRefCheck(); void add(char *lpszInheritsClass); void del(char *lpszInheritsClass); BOOL check(char *lpszInheritsClass); }; extern CLoopRefCheck *pobj_LoopRefCheck; //DataTable.cpp class DataTable{ void *pdata; int size; public: DataTable(); ~DataTable(); void Init(); int AddBinary( const void *pdata, int size ); int Add( _int64 i64data ); int Add( int i32data ); int Add( double dbl ); int Add( float flt ); int AddString( const char *str, int length ); int AddString( const char *str ); const void *GetPtr() const; int GetSize() const; }; extern DataTable dataTable; //error.cpp void SetError(int ErrorNum,const char *KeyWord,int pos); void SetError(); void CompileMessage(char *buffer); bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,const int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum); //Compile.cpp void GetIdentifierToken( char *token, const char *source, int &pos ); int JumpStatement(const char *source, int &pos); void DebugVariable(void); void Compile(void); //gc.cpp void InitGCVariables(void); void PerformedGcVarSchedule(void); #ifdef _DEBUG /*Debug*/ /* #define HeapAlloc CheckHeapAlloc #define HeapReAlloc CheckHeapReAlloc LPVOID CheckHeapAlloc(HANDLE hHeap,DWORD dwFlags,DWORD dwBytes); LPVOID CheckHeapReAlloc(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes); */ #endif