#include "il2cpp-config.h" #include "MetadataLoader.h" #include "os/File.h" #include "os/Mutex.h" #include "utils/MemoryMappedFile.h" #include "utils/PathUtils.h" #include "utils/Runtime.h" #include "utils/Logging.h" #if IL2CPP_TARGET_ANDROID && IL2CPP_TINY_DEBUGGER && !IL2CPP_TINY_FROM_IL2CPP_BUILDER #include extern "C" { void* loadAsset(const char* path, int *size, void* (*alloc)(size_t)); } #elif IL2CPP_TARGET_JAVASCRIPT && IL2CPP_TINY_DEBUGGER && !IL2CPP_TINY_FROM_IL2CPP_BUILDER extern void* g_MetadataForWebTinyDebugger; #endif void* il2cpp::vm::MetadataLoader::LoadMetadataFile(const char* fileName) { #if IL2CPP_TARGET_ANDROID && IL2CPP_TINY_DEBUGGER && !IL2CPP_TINY_FROM_IL2CPP_BUILDER std::string resourcesDirectory = utils::PathUtils::Combine(utils::StringView("Data"), utils::StringView("Metadata")); std::string resourceFilePath = utils::PathUtils::Combine(resourcesDirectory, utils::StringView(fileName, strlen(fileName))); int size = 0; return loadAsset(resourceFilePath.c_str(), &size, malloc); #elif IL2CPP_TARGET_JAVASCRIPT && IL2CPP_TINY_DEBUGGER && !IL2CPP_TINY_FROM_IL2CPP_BUILDER return g_MetadataForWebTinyDebugger; #else std::string resourcesDirectory = utils::PathUtils::Combine(utils::Runtime::GetDataDir(), utils::StringView("Metadata")); std::string resourceFilePath = utils::PathUtils::Combine(resourcesDirectory, utils::StringView(fileName, strlen(fileName))); int error = 0; os::FileHandle* handle = os::File::Open(resourceFilePath, kFileModeOpen, kFileAccessRead, kFileShareRead, kFileOptionsNone, &error); if (error != 0) { utils::Logging::Write("ERROR: Could not open %s", resourceFilePath.c_str()); return NULL; } void* fileBuffer = utils::MemoryMappedFile::Map(handle); os::File::Close(handle, &error); if (error != 0) { utils::MemoryMappedFile::Unmap(fileBuffer); fileBuffer = NULL; return NULL; } return fileBuffer; #endif } void il2cpp::vm::MetadataLoader::UnloadMetadataFile(void* fileBuffer) { #if IL2CPP_TARGET_ANDROID && IL2CPP_TINY_DEBUGGER && !IL2CPP_DEBUGGER_TESTS free(fileBuffer); #else bool success = il2cpp::utils::MemoryMappedFile::Unmap(fileBuffer); NO_UNUSED_WARNING(success); IL2CPP_ASSERT(success); #endif }