Fix array resize crash on 0 initialisation
This commit is contained in:
parent
8209593f57
commit
5876c16abe
58
dqn.h
58
dqn.h
@ -274,9 +274,9 @@ public:
|
|||||||
|
|
||||||
typedef u8 *Allocator(DqnMemAPI::Request request);
|
typedef u8 *Allocator(DqnMemAPI::Request request);
|
||||||
|
|
||||||
static Request RequestRealloc(const DqnMemAPI memAPI, void *const oldMemPtr, const size_t oldSize, const size_t newSize);
|
static Request RequestRealloc(const DqnMemAPI memAPI, void *const oldMemPtr, size_t const oldSize, size_t const newSize);
|
||||||
static Request RequestAlloc (const DqnMemAPI memAPI, const size_t size, const bool clearToZero);
|
static Request RequestAlloc (const DqnMemAPI memAPI, size_t const size, const bool clearToZero = true);
|
||||||
static Request RequestFree (const DqnMemAPI memAPI, void *const ptrToFree, const size_t sizeToFree);
|
static Request RequestFree (const DqnMemAPI memAPI, void *const ptrToFree, size_t const sizeToFree);
|
||||||
|
|
||||||
bool IsValid() const { return (callback != nullptr); }
|
bool IsValid() const { return (callback != nullptr); }
|
||||||
|
|
||||||
@ -349,17 +349,17 @@ struct DqnMemStack
|
|||||||
// mem: Memory to use for the memory stack
|
// mem: Memory to use for the memory stack
|
||||||
// byteAlign: Set the alignment of memory addresses for all allocated items from the memory stack.
|
// byteAlign: Set the alignment of memory addresses for all allocated items from the memory stack.
|
||||||
// return: FALSE if args are invalid, or insufficient memSize.
|
// return: FALSE if args are invalid, or insufficient memSize.
|
||||||
bool InitWithFixedMem(u8 *const mem, const size_t memSize, const u32 byteAlign_ = 4);
|
bool InitWithFixedMem(u8 *const mem, size_t const memSize, u32 const byteAlign_ = 4);
|
||||||
|
|
||||||
// The memory stack uses 1 initial allocation from the DqnMem_Alloc(). No further allocations are
|
// The memory stack uses 1 initial allocation from the DqnMem_Alloc(). No further allocations are
|
||||||
// made. All allocations are suballocated from the first allocation.
|
// made. All allocations are suballocated from the first allocation.
|
||||||
// size: The amount of memory to allocate. Size gets aligned to the next "byteAlign"ed value.
|
// size: The amount of memory to allocate. Size gets aligned to the next "byteAlign"ed value.
|
||||||
bool InitWithFixedSize(const size_t size, const bool zeroClear, const u32 byteAlign_ = 4, const DqnMemAPI memAPI_ = DqnMemAPI_HeapAllocator());
|
bool InitWithFixedSize(size_t const size, bool const zeroClear, u32 const byteAlign_ = 4, DqnMemAPI const memAPI_ = DqnMemAPI_HeapAllocator());
|
||||||
|
|
||||||
// Dynamically expandable stack. Akin to DqnMemStack_InitWithFixedSize() except if the MemStack does
|
// Dynamically expandable stack. Akin to DqnMemStack_InitWithFixedSize() except if the MemStack does
|
||||||
// not have enough space for allocation it will automatically attach another MemBlock using
|
// not have enough space for allocation it will automatically attach another MemBlock using
|
||||||
// DqnMem_Calloc().
|
// DqnMem_Calloc().
|
||||||
bool Init(const size_t size, const bool zeroClear, const u32 byteAlign_ = 4, const DqnMemAPI memAPI_ = DqnMemAPI_HeapAllocator());
|
bool Init(size_t const size, bool const zeroClear, u32 const byteAlign_ = 4, DqnMemAPI const memAPI_ = DqnMemAPI_HeapAllocator());
|
||||||
|
|
||||||
// -- Memory API
|
// -- Memory API
|
||||||
// Allocate memory from the MemStack.
|
// Allocate memory from the MemStack.
|
||||||
@ -382,7 +382,7 @@ struct DqnMemStack
|
|||||||
bool FreeLastBlock();
|
bool FreeLastBlock();
|
||||||
|
|
||||||
// Reset the current memory block usage to 0.
|
// Reset the current memory block usage to 0.
|
||||||
void ClearCurrBlock(const bool zeroClear);
|
void ClearCurrBlock(bool const zeroClear);
|
||||||
|
|
||||||
// -- Temporary Regions API
|
// -- Temporary Regions API
|
||||||
// region: Takes pointer to a zero-cleared DqnMemStackTempRegion struct.
|
// region: Takes pointer to a zero-cleared DqnMemStackTempRegion struct.
|
||||||
@ -396,7 +396,7 @@ struct DqnMemStack
|
|||||||
// -- Advanced API
|
// -- Advanced API
|
||||||
// These are useful for forcing a new block to be used. AllocateCompatibleBlock() will fail if the
|
// These are useful for forcing a new block to be used. AllocateCompatibleBlock() will fail if the
|
||||||
// supplied stack has flags set such that the stack is not allowed to have new blocks.
|
// supplied stack has flags set such that the stack is not allowed to have new blocks.
|
||||||
Block *AllocateCompatibleBlock(size_t size, const bool zeroClear);
|
Block *AllocateCompatibleBlock(size_t size, bool const zeroClear);
|
||||||
bool AttachBlock (Block *const newBlock);
|
bool AttachBlock (Block *const newBlock);
|
||||||
bool DetachBlock (Block *const detachBlock);
|
bool DetachBlock (Block *const detachBlock);
|
||||||
|
|
||||||
@ -639,8 +639,16 @@ bool DqnArray<T>::Resize(i64 newMax)
|
|||||||
i64 oldSize = this->max * sizeof(T);
|
i64 oldSize = this->max * sizeof(T);
|
||||||
i64 newSize = newMax * sizeof(T);
|
i64 newSize = newMax * sizeof(T);
|
||||||
|
|
||||||
DqnMemAPI::Request info =
|
DqnMemAPI::Request info;
|
||||||
DqnMemAPI::RequestRealloc(this->memAPI, this->data, oldSize, newSize);
|
if (oldSize == 0)
|
||||||
|
{
|
||||||
|
info = DqnMemAPI::RequestAlloc(this->memAPI, newSize, /*zeroClear*/ false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
info = DqnMemAPI::RequestRealloc(this->memAPI, this->data, oldSize, newSize);
|
||||||
|
}
|
||||||
|
|
||||||
u8 *result = this->memAPI.callback(info);
|
u8 *result = this->memAPI.callback(info);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
@ -3049,8 +3057,8 @@ FILE_SCOPE u8 *DqnMemAPIInternal_StackAllocatorCallback(DqnMemAPI::Request info)
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// #DqnMemAPI Implementation
|
// #DqnMemAPI Implementation
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
DqnMemAPI::Request DqnMemAPI::RequestRealloc(const DqnMemAPI memAPI, void *const oldMemPtr,
|
DqnMemAPI::Request DqnMemAPI::RequestRealloc(DqnMemAPI const memAPI, void *const oldMemPtr,
|
||||||
const size_t oldSize, const size_t newSize)
|
size_t const oldSize, size_t const newSize)
|
||||||
{
|
{
|
||||||
DqnMemAPI::Request info = {};
|
DqnMemAPI::Request info = {};
|
||||||
info.type = Type::Realloc;
|
info.type = Type::Realloc;
|
||||||
@ -3062,8 +3070,8 @@ DqnMemAPI::Request DqnMemAPI::RequestRealloc(const DqnMemAPI memAPI, void *const
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
DqnMemAPI::Request DqnMemAPI::RequestAlloc(const DqnMemAPI memAPI, const size_t size,
|
DqnMemAPI::Request DqnMemAPI::RequestAlloc(DqnMemAPI const memAPI, size_t const size,
|
||||||
const bool clearToZero = true)
|
bool const clearToZero)
|
||||||
{
|
{
|
||||||
DqnMemAPI::Request result = {};
|
DqnMemAPI::Request result = {};
|
||||||
result.type = DqnMemAPI::Type::Alloc;
|
result.type = DqnMemAPI::Type::Alloc;
|
||||||
@ -3073,8 +3081,8 @@ DqnMemAPI::Request DqnMemAPI::RequestAlloc(const DqnMemAPI memAPI, const size_t
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DqnMemAPI::Request DqnMemAPI::RequestFree(const DqnMemAPI memAPI, void *const ptrToFree,
|
DqnMemAPI::Request DqnMemAPI::RequestFree(DqnMemAPI const memAPI, void *const ptrToFree,
|
||||||
const size_t sizeToFree)
|
size_t const sizeToFree)
|
||||||
{
|
{
|
||||||
DqnMemAPI::Request result = {};
|
DqnMemAPI::Request result = {};
|
||||||
result.type = DqnMemAPI::Type::Free;
|
result.type = DqnMemAPI::Type::Free;
|
||||||
@ -3105,8 +3113,8 @@ DQN_FILE_SCOPE DqnMemAPI DqnMemAPI_StackAllocator(DqnMemStack *const stack)
|
|||||||
// #DqnMemStackInternal Implementation
|
// #DqnMemStackInternal Implementation
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
DQN_FILE_SCOPE DqnMemStack::Block *DqnMemStackInternal_AllocateBlock(u32 byteAlign, size_t size,
|
DQN_FILE_SCOPE DqnMemStack::Block *DqnMemStackInternal_AllocateBlock(u32 byteAlign, size_t size,
|
||||||
const bool zeroClear,
|
bool const zeroClear,
|
||||||
const DqnMemAPI &memAPI)
|
DqnMemAPI const &memAPI)
|
||||||
{
|
{
|
||||||
if (!memAPI.callback) return nullptr;
|
if (!memAPI.callback) return nullptr;
|
||||||
|
|
||||||
@ -3129,8 +3137,8 @@ DQN_FILE_SCOPE DqnMemStack::Block *DqnMemStackInternal_AllocateBlock(u32 byteAli
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// #DqnMemStack Initialisation Implementation
|
// #DqnMemStack Initialisation Implementation
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
DQN_FILE_SCOPE bool DqnMemStack::InitWithFixedMem(u8 *const mem, const size_t memSize,
|
DQN_FILE_SCOPE bool DqnMemStack::InitWithFixedMem(u8 *const mem, size_t const memSize,
|
||||||
const u32 byteAlign_)
|
u32 const byteAlign_)
|
||||||
{
|
{
|
||||||
// TODO(doyle): Logging
|
// TODO(doyle): Logging
|
||||||
if (!mem) return false;
|
if (!mem) return false;
|
||||||
@ -3159,8 +3167,8 @@ DQN_FILE_SCOPE bool DqnMemStack::InitWithFixedMem(u8 *const mem, const size_t me
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_FILE_SCOPE bool DqnMemStack::InitWithFixedSize(size_t size, const bool zeroClear,
|
DQN_FILE_SCOPE bool DqnMemStack::InitWithFixedSize(size_t size, bool const zeroClear,
|
||||||
const u32 byteAlign_, const DqnMemAPI memAPI_)
|
u32 const byteAlign_, DqnMemAPI const memAPI_)
|
||||||
{
|
{
|
||||||
bool result = this->Init(size, zeroClear, byteAlign_, memAPI_);
|
bool result = this->Init(size, zeroClear, byteAlign_, memAPI_);
|
||||||
if (result)
|
if (result)
|
||||||
@ -3173,7 +3181,7 @@ DQN_FILE_SCOPE bool DqnMemStack::InitWithFixedSize(size_t size, const bool zeroC
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_FILE_SCOPE bool DqnMemStack::Init(size_t size, const bool zeroClear, const u32 byteAlign_, const DqnMemAPI memAPI_)
|
DQN_FILE_SCOPE bool DqnMemStack::Init(size_t size, bool const zeroClear, u32 const byteAlign_, DqnMemAPI const memAPI_)
|
||||||
{
|
{
|
||||||
if (!this || size < 0) return false;
|
if (!this || size < 0) return false;
|
||||||
if (!DQN_ASSERT_MSG(!this->block, "MemStack has pre-existing block already attached"))
|
if (!DQN_ASSERT_MSG(!this->block, "MemStack has pre-existing block already attached"))
|
||||||
@ -3331,7 +3339,7 @@ DQN_FILE_SCOPE bool DqnMemStack::FreeLastBlock()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_FILE_SCOPE void DqnMemStack::ClearCurrBlock(const bool zeroClear)
|
DQN_FILE_SCOPE void DqnMemStack::ClearCurrBlock(bool const zeroClear)
|
||||||
{
|
{
|
||||||
if (this->block)
|
if (this->block)
|
||||||
{
|
{
|
||||||
@ -3396,7 +3404,7 @@ DqnMemStackTempRegionGuard::~DqnMemStackTempRegionGuard()
|
|||||||
// #DqnMemStack Advanced API Implementation
|
// #DqnMemStack Advanced API Implementation
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
DQN_FILE_SCOPE DqnMemStack::Block *DqnMemStack::AllocateCompatibleBlock(size_t size,
|
DQN_FILE_SCOPE DqnMemStack::Block *DqnMemStack::AllocateCompatibleBlock(size_t size,
|
||||||
const bool zeroClear)
|
bool const zeroClear)
|
||||||
{
|
{
|
||||||
if (this->flags & DqnMemStack::Flag::IsFixedMemoryFromUser) return nullptr;
|
if (this->flags & DqnMemStack::Flag::IsFixedMemoryFromUser) return nullptr;
|
||||||
if (this->flags & DqnMemStack::Flag::IsNotExpandable) return nullptr;
|
if (this->flags & DqnMemStack::Flag::IsNotExpandable) return nullptr;
|
||||||
|
@ -1422,6 +1422,25 @@ void DqnArray_Test()
|
|||||||
|
|
||||||
if (1)
|
if (1)
|
||||||
{
|
{
|
||||||
|
if (1)
|
||||||
|
{
|
||||||
|
DqnArray<char> array1 = DqnArray_<char>(3);
|
||||||
|
DQN_ASSERT(array1.count == 0);
|
||||||
|
DQN_ASSERT(array1.max == 3);
|
||||||
|
array1.Free();
|
||||||
|
|
||||||
|
array1 = DqnArray_<char>();
|
||||||
|
DQN_ASSERT(array1.count == 0);
|
||||||
|
DQN_ASSERT(array1.max == 0);
|
||||||
|
|
||||||
|
array1.Push('c');
|
||||||
|
DQN_ASSERT(array1.count == 1);
|
||||||
|
DQN_ASSERT(array1.max == 1);
|
||||||
|
array1.Free();
|
||||||
|
|
||||||
|
LogSuccess("DqnArray(): Testing faux-array constructors DqnArray_()");
|
||||||
|
}
|
||||||
|
|
||||||
if (1)
|
if (1)
|
||||||
{
|
{
|
||||||
DqnArray<char> array = {};
|
DqnArray<char> array = {};
|
||||||
|
Loading…
Reference in New Issue
Block a user