thunderbrew/src/ui/LuaMemory.cpp
2025-08-03 02:02:19 +04:00

150 lines
3.2 KiB
C++

#include "ui/LuaMemory.hpp"
#include "ui/FrameScript.hpp"
#include <cstring>
#include <common/MemPool.hpp>
#include <bc/Memory.hpp>
void* luaM_initPool() {
void* m = SMemAlloc(sizeof(MemPool*) * 9, __FILE__, __LINE__, 0x0);
MemPool** pools = (MemPool**)m;
uint32_t v2 = 0;
size_t v5;
size_t v6;
do {
auto poolMem = SMemAlloc(sizeof(MemPool), __FILE__, __LINE__, 0x0);
auto v4 = new (poolMem) MemPool();
pools[v2] = v4;
v5 = FrameScript::s_blocksizes[v2];
v6 = FrameScript::s_blocksizes[v2] << 10;
v4->Init(v5, v6);
++v2;
} while (v2 < 9);
return pools;
}
void luaM_freePool(void* ptr) {
if (!ptr) {
return;
}
MemPool** pools = reinterpret_cast<MemPool**>(ptr);
for (uint32_t i = 0; i < 9; ++i) {
MemPool* pool = pools[i];
if (pool) {
// Is the sub_8556E0(pool) a desturctor?
pool->~MemPool();
SMemFree(pool, __FILE__, __LINE__, 0);
}
}
SMemFree(pools, __FILE__, __LINE__, 0);
}
void* luaM_reallocPool(void* ud, void* ptr, size_t osize, size_t nsize) {
void* result; // eax
signed int v5; // esi
signed int v6; // edx
signed int v7; // ecx
signed int v8; // ecx
void *v9; // eax
void *v10; // edi
size_t v11; // eax
signed int v12; // [esp+Ch] [ebp-4h]
MemPool** mempool = (MemPool**)ud;
result = ptr;
v5 = -1;
v6 = -1;
v12 = -1;
if (ptr) {
v7 = 0;
while (osize > FrameScript::s_blocksizes[v7]) {
if (++v7 >= 9) {
goto LABEL_7;
}
}
v12 = v7;
v5 = v7;
}
LABEL_7:
if (nsize) {
v8 = 0;
while (nsize > FrameScript::s_blocksizes[v8]) {
if (++v8 >= 9) {
goto LABEL_18;
}
}
v6 = v8;
LABEL_18:
if (v5 == v6) {
if (v5 < 0) {
result = SMemReAlloc(ptr, nsize, ".\\src\\lmemPool.cpp", 311, 0);
}
} else {
if (v6 < 0) {
v9 = SMemAlloc(nsize, ".\\src\\lmemPool.cpp", 326, 0);
} else {
// Pretty sure: MemPool::MemAlloc
// v9 = sub_855820(*((_DWORD *)a1 + v6));
v9 = mempool[v6]->MemAlloc();
}
v10 = v9;
if (ptr) {
v11 = osize;
if (osize >= nsize) {
v11 = nsize;
}
memcpy(v10, ptr, v11);
if (v12 >= 0) {
// Pretty sure: MemPool::MemFree
// sub_855670(*((_DWORD *)a1 + v12), ptr);
mempool[v12]->MemFree(ptr);
return v10;
}
SMemFree(ptr, ".\\src\\lmemPool.cpp", 338, 0);
}
result = v10;
}
} else {
if (ptr) {
if (v5 >= 0) {
// Pretty sure: MemPool::MemFree
// sub_855670(*((_DWORD *)a1 + v5), ptr);
mempool[v5]->MemFree(ptr);
return 0;
}
SMemFree(ptr, ".\\src\\lmemPool.cpp", 276, 0);
}
result = 0;
}
return result;
}