using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; namespace IDE.Compiler { public class BfSystem { [StdCall, CLink] static extern void BfSystem_CheckLock(void* bfSystem); [StdCall, CLink] static extern void* BfSystem_Create(); [StdCall, CLink] static extern void BfSystem_Delete(void* bfSystem); [StdCall, CLink] static extern void BfSystem_ReportMemory(void* bfSystem); [StdCall, CLink] static extern void BfSystem_Update(void* bfSystem); [StdCall, CLink] static extern void* BfSystem_CreatePassInstance(void* bfSystem); [StdCall, CLink] static extern char8* BfSystem_GetNamespaceSearch(void* bfSystem, char8* typeName, void* project); [StdCall, CLink] static extern void* BfSystem_CreateProject(void* bfSystem, char8* projectName); [StdCall, CLink] static extern void BfSystem_ClearTypeOptions(void* bfSystem); [StdCall, CLink] static extern void BfSystem_AddTypeOptions(void* bfSystem, char8* filter, int32 simdSetting, int32 optimizationLevel, int32 emitDebugInfo, int32 runtimeChecks, int32 initLocalVariables, int32 emitDynamicCastCheck, int32 emitObjectAccessCheck, int32 allocStackTraceDepth); [StdCall, CLink] static extern void* BfSystem_CreateParser(void* bfSystem, void* bfProject); [StdCall, CLink] static extern void* BfSystem_CreateCompiler(void* bfSystem, bool isResolveOnly = false); [StdCall, CLink] static extern void* BfSystem_RemoveDeletedParsers(void* bfSystem); [StdCall, CLink] static extern void* BfSystem_RemoveOldParsers(void* bfSystem); [StdCall, CLink] static extern void* BfSystem_RemoveOldData(void* bfSystem); [StdCall, CLink] static extern void* BfSystem_NotifyWillRequestLock(void* bfSystem, int32 priority); [StdCall, CLink] static extern void* BfSystem_Lock(void* bfSystem, int32 priority); [StdCall, CLink] extern static void BfSystem_PerfZoneStart(char8* name); [StdCall, CLink] extern static void BfSystem_PerfZoneEnd(); [StdCall, CLink] static extern void* BfSystem_Unlock(void* bfSystem); [StdCall, CLink] extern static void BfSystem_StartTiming(); [StdCall, CLink] extern static void BfSystem_StopTiming(); [StdCall, CLink] extern static void BfSystem_DbgPrintTimings(); public void* mNativeBfSystem; public bool mIsTiming; public Monitor mMonitor = new Monitor() ~ delete _; public Dictionary mParserMap = new Dictionary() ~ delete _; public Dictionary mProjectMap = new Dictionary() ~ delete _; public this() { mNativeBfSystem = BfSystem_Create(); } public ~this() { for (var parser in mParserMap.Values) delete parser; for (var bfProject in mProjectMap.Values) delete bfProject; BfSystem_Delete(mNativeBfSystem); } public void CheckLock() { BfSystem_CheckLock(mNativeBfSystem); } public void Update() { BfSystem_Update(mNativeBfSystem); } public void ReportMemory() { BfSystem_ReportMemory(mNativeBfSystem); } public void AddProject(Project project) { using (mMonitor.Enter()) { var bfProject = CreateProject(project.mProjectName); mProjectMap[project] = bfProject; } } public BfProject GetBfProject(Project project) { using (mMonitor.Enter()) { return mProjectMap[project]; } } public void RemoveBfProject(Project project) { using (mMonitor.Enter()) { mProjectMap.Remove(project); } } public BfPassInstance CreatePassInstance(String dbgStr = null) { void* nativePassInstance = BfSystem_CreatePassInstance(mNativeBfSystem); BfPassInstance passInstance = new BfPassInstance(nativePassInstance); if (dbgStr != null) passInstance.mDbgStr = new String(dbgStr); return passInstance; } public BfParser CreateEmptyParser(BfProject bfProject) { void* nativeBfProject = (bfProject == null) ? null : bfProject.mNativeBfProject; void* nativeBfParser = BfSystem_CreateParser(mNativeBfSystem, nativeBfProject); BfParser parser = new BfParser(nativeBfParser); parser.mSystem = this; return parser; } public void GetNamespaceSearch(String typeName, String outNamespaceSearch, BfProject project) { char8* namespaceSearch = BfSystem_GetNamespaceSearch(mNativeBfSystem, typeName, project.mNativeBfProject); if (namespaceSearch != null) outNamespaceSearch.Append(namespaceSearch); } public BfProject CreateProject(String projectName) { BfProject project = new BfProject(); project.mNativeBfProject = BfSystem_CreateProject(mNativeBfSystem, projectName); return project; } /*public bool HasParser(string fileName) { lock (this) { return mParserMap.ContainsKey(fileName); } }*/ public BfParser CreateParser(ProjectSource projectSource, bool useMap = true) { using (mMonitor.Enter()) { BfParser parser; if (!useMap) { parser = CreateEmptyParser(mProjectMap[projectSource.mProject]); parser.mProjectSource = projectSource; parser.mFileName = new String(); projectSource.GetFullImportPath(parser.mFileName); return parser; } BfParser prevParser; mParserMap.TryGetValue(projectSource, out prevParser); parser = CreateEmptyParser(mProjectMap[projectSource.mProject]); parser.mSystem = this; parser.mProjectSource = projectSource; parser.mFileName = new String(); projectSource.GetFullImportPath(parser.mFileName); mParserMap[projectSource] = parser; if (prevParser != null) { prevParser.SetNextRevision(parser); prevParser.Detach(); delete prevParser; } return parser; } } public BfParser CreateNewParserRevision(BfParser prevParser) { using (mMonitor.Enter()) { BfParser parser = CreateEmptyParser(mProjectMap[prevParser.mProjectSource.mProject]); parser.mFileName = new String(prevParser.mFileName); parser.mProjectSource = prevParser.mProjectSource; mParserMap[parser.mProjectSource] = parser; if (prevParser != null) { prevParser.SetNextRevision(parser); prevParser.Detach(); delete prevParser; } return parser; } } public void FileRenamed(ProjectSource projectSource, String oldFileName, String newFileName) { using (mMonitor.Enter()) { BfParser prevParser; if (mParserMap.TryGetValue(projectSource, out prevParser)) { prevParser.mFileName.Set(newFileName); } } } public BfParser FileRemoved(ProjectSource projectSource) { using (mMonitor.Enter()) { BfParser prevParser = null; if (mParserMap.TryGetValue(projectSource, out prevParser)) { //DeleteParser(prevParser); mParserMap.Remove(projectSource); } return prevParser; } } public BfParser FindParser(ProjectSource projectSource) { using (mMonitor.Enter()) { BfParser prevParser; mParserMap.TryGetValue(projectSource, out prevParser); return prevParser; } } public BfCompiler CreateCompiler(bool isResolveOnly) { void* nativeBfCompiler = BfSystem_CreateCompiler(mNativeBfSystem, isResolveOnly); var bfCompiler = new BfCompiler(nativeBfCompiler); bfCompiler.mIsResolveOnly = isResolveOnly; bfCompiler.mBfSystem = this; return bfCompiler; } public void RemoveDeletedParsers() { BfSystem_RemoveDeletedParsers(mNativeBfSystem); } public void RemoveOldParsers() { BfSystem_RemoveOldParsers(mNativeBfSystem); } public void RemoveOldData() { BfSystem_RemoveOldData(mNativeBfSystem); } public void NotifyWillRequestLock(int32 priority) { BfSystem_NotifyWillRequestLock(mNativeBfSystem, priority); } public void Lock(int32 priority) { BfSystem_Lock(mNativeBfSystem, priority); } public void Unlock() { BfSystem_Unlock(mNativeBfSystem); } public void StartTiming() { mIsTiming = true; BfSystem_StartTiming(); } public void PerfZoneStart(String name) { BfSystem_PerfZoneStart(name); } public void PerfZoneEnd() { BfSystem_PerfZoneEnd(); } public void StopTiming() { mIsTiming = false; BfSystem_StopTiming(); } public void DbgPrintTimings() { BfSystem_DbgPrintTimings(); } public void ClearTypeOptions() { BfSystem_ClearTypeOptions(mNativeBfSystem); } public void AddTypeOptions(String filter, BuildOptions.SIMDSetting? simdSetting, BuildOptions.BfOptimizationLevel? optimizationLevel, BuildOptions.EmitDebugInfo? emitDebugInfo, bool? runtimeChecks, bool? initLocalVariables, bool? emitDynamicCastCheck, bool? emitObjectAccessCheck, int32? allocStackTraceDepth) { int32 simdSettingInt = (simdSetting == null) ? -1 : (int32)simdSetting.Value; int32 optimizationLevelInt = (optimizationLevel == null) ? -1 : (int32)optimizationLevel.Value; int32 emitDebugInfoInt = (emitDebugInfo == null) ? -1 : (int32)emitDebugInfo.Value; int32 runtimeChecksInt = (runtimeChecks == null) ? -1 : runtimeChecks.Value ? 1 : 0; int32 initLocalVariablesInt = (initLocalVariables == null) ? -1 : initLocalVariables.Value ? 1 : 0; int32 emitDynamicCastCheckInt = (emitDynamicCastCheck == null) ? -1 : emitDynamicCastCheck.Value ? 1 : 0; int32 emitObjectAccessCheckInt = (emitObjectAccessCheck == null) ? -1 : emitObjectAccessCheck.Value ? 1 : 0; int32 allocStackTraceDepthInt = (allocStackTraceDepth == null) ? -1 : allocStackTraceDepth.Value; BfSystem_AddTypeOptions(mNativeBfSystem, filter, simdSettingInt, optimizationLevelInt, emitDebugInfoInt, runtimeChecksInt, initLocalVariablesInt, emitDynamicCastCheckInt, emitObjectAccessCheckInt, allocStackTraceDepthInt); } public void AddTypeOptions(DistinctBuildOptions typeOption) { AddTypeOptions(typeOption.mFilter, typeOption.mBfSIMDSetting, typeOption.mBfOptimizationLevel, typeOption.mEmitDebugInfo, typeOption.mRuntimeChecks, typeOption.mInitLocalVariables, typeOption.mEmitDynamicCastCheck, typeOption.mEmitObjectAccessCheck, typeOption.mAllocStackTraceDepth); } } }