58 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include "CSBindsManager.h"
							 | 
						||
| 
								 | 
							
								#include "UnrealSharpBinds.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								FCSBindsManager* FCSBindsManager::BindsManagerInstance = nullptr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								FCSBindsManager* FCSBindsManager::Get()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (!BindsManagerInstance)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										BindsManagerInstance = new FCSBindsManager();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return BindsManagerInstance;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void FCSBindsManager::RegisterExportedFunction(const FName& ClassName, const FCSExportedFunction& ExportedFunction)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									FCSBindsManager* Instance = Get();
							 | 
						||
| 
								 | 
							
									TArray<FCSExportedFunction>& ExportedFunctions = Instance->ExportedFunctionsMap.FindOrAdd(ClassName);
							 | 
						||
| 
								 | 
							
									ExportedFunctions.Add(ExportedFunction);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void* FCSBindsManager::GetBoundFunction(const TCHAR* InOuterName, const TCHAR* InFunctionName, int32 ManagedFunctionSize)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									TRACE_CPUPROFILER_EVENT_SCOPE(UCSBindsManager::GetBoundFunction);
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									FCSBindsManager* Instance = Get();
							 | 
						||
| 
								 | 
							
									FName ManagedOuterName = FName(InOuterName);
							 | 
						||
| 
								 | 
							
									FName ManagedFunctionName = FName(InFunctionName);
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									TArray<FCSExportedFunction>* ExportedFunctions = Instance->ExportedFunctionsMap.Find(ManagedOuterName);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (!ExportedFunctions)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										UE_LOG(LogUnrealSharpBinds, Error, TEXT("Failed to get BoundNativeFunction: No exported functions found for %s"), InOuterName);
							 | 
						||
| 
								 | 
							
										return nullptr;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for (FCSExportedFunction& NativeFunction : *ExportedFunctions)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if (NativeFunction.Name != ManagedFunctionName)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											continue;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
										if (NativeFunction.Size != ManagedFunctionSize)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											UE_LOG(LogUnrealSharpBinds, Error, TEXT("Failed to get BoundNativeFunction: Function size mismatch for %s::%s."), InOuterName, InFunctionName);
							 | 
						||
| 
								 | 
							
											return nullptr;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
										return NativeFunction.FunctionPointer;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									UE_LOG(LogUnrealSharpBinds, Error, TEXT("Failed to get BoundNativeFunction: No function found for %s.%s"), *ManagedOuterName.ToString(), *ManagedFunctionName.ToString());
							 | 
						||
| 
								 | 
							
									return nullptr;
							 | 
						||
| 
								 | 
							
								}
							 |