mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 04:24:37 +03:00
Added back interface to override default functions for memory allocation (ASMJIT_ALLOC, ASMJIT_REALLOC, ASMJIT_FREE).
This commit is contained in:
@@ -35,7 +35,7 @@ BaseAssembler::BaseAssembler(Runtime* runtime) :
|
|||||||
|
|
||||||
BaseAssembler::~BaseAssembler() {
|
BaseAssembler::~BaseAssembler() {
|
||||||
if (_buffer != NULL)
|
if (_buffer != NULL)
|
||||||
::free(_buffer);
|
ASMJIT_FREE(_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -51,7 +51,7 @@ void BaseAssembler::reset() {
|
|||||||
_baseZone.reset();
|
_baseZone.reset();
|
||||||
|
|
||||||
if (_buffer != NULL) {
|
if (_buffer != NULL) {
|
||||||
::free(_buffer);
|
ASMJIT_FREE(_buffer);
|
||||||
|
|
||||||
_buffer = NULL;
|
_buffer = NULL;
|
||||||
_end = NULL;
|
_end = NULL;
|
||||||
@@ -124,9 +124,9 @@ Error BaseAssembler::_reserve(size_t n) {
|
|||||||
|
|
||||||
uint8_t* newBuffer;
|
uint8_t* newBuffer;
|
||||||
if (_buffer == NULL)
|
if (_buffer == NULL)
|
||||||
newBuffer = static_cast<uint8_t*>(::malloc(n));
|
newBuffer = static_cast<uint8_t*>(ASMJIT_ALLOC(n));
|
||||||
else
|
else
|
||||||
newBuffer = static_cast<uint8_t*>(::realloc(_buffer, n));
|
newBuffer = static_cast<uint8_t*>(ASMJIT_REALLOC(_buffer, n));
|
||||||
|
|
||||||
if (newBuffer == NULL)
|
if (newBuffer == NULL)
|
||||||
return setError(kErrorNoHeapMemory);
|
return setError(kErrorNoHeapMemory);
|
||||||
|
|||||||
@@ -73,13 +73,13 @@ Error PodVectorBase::_reserve(size_t n, size_t sizeOfT) {
|
|||||||
return kErrorNoHeapMemory;
|
return kErrorNoHeapMemory;
|
||||||
|
|
||||||
if (d == &_nullData) {
|
if (d == &_nullData) {
|
||||||
d = static_cast<PodVectorData*>(::malloc(nBytes));
|
d = static_cast<PodVectorData*>(ASMJIT_ALLOC(nBytes));
|
||||||
if (d == NULL)
|
if (d == NULL)
|
||||||
return kErrorNoHeapMemory;
|
return kErrorNoHeapMemory;
|
||||||
d->length = 0;
|
d->length = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
d = static_cast<PodVectorData*>(::realloc(d, nBytes));
|
d = static_cast<PodVectorData*>(ASMJIT_REALLOC(d, nBytes));
|
||||||
if (d == NULL)
|
if (d == NULL)
|
||||||
return kErrorNoHeapMemory;
|
return kErrorNoHeapMemory;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ struct PodVectorBase {
|
|||||||
//! Destroy the `PodVectorBase` and data.
|
//! Destroy the `PodVectorBase` and data.
|
||||||
ASMJIT_INLINE ~PodVectorBase() {
|
ASMJIT_INLINE ~PodVectorBase() {
|
||||||
if (_d != &_nullData)
|
if (_d != &_nullData)
|
||||||
::free(_d);
|
ASMJIT_FREE(_d);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
@@ -140,7 +140,7 @@ struct PodVector : PodVectorBase {
|
|||||||
//! Clear vector data and free internal buffer.
|
//! Clear vector data and free internal buffer.
|
||||||
ASMJIT_INLINE void reset() {
|
ASMJIT_INLINE void reset() {
|
||||||
if (_d != &_nullData) {
|
if (_d != &_nullData) {
|
||||||
::free(_d);
|
ASMJIT_FREE(_d);
|
||||||
_d = const_cast<PodVectorData*>(&_nullData);
|
_d = const_cast<PodVectorData*>(&_nullData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ StringBuilder::StringBuilder() :
|
|||||||
|
|
||||||
StringBuilder::~StringBuilder() {
|
StringBuilder::~StringBuilder() {
|
||||||
if (_canFree)
|
if (_canFree)
|
||||||
::free(_data);
|
ASMJIT_FREE(_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -62,14 +62,14 @@ char* StringBuilder::prepare(uint32_t op, size_t len) {
|
|||||||
if (to < 256 - sizeof(intptr_t))
|
if (to < 256 - sizeof(intptr_t))
|
||||||
to = 256 - sizeof(intptr_t);
|
to = 256 - sizeof(intptr_t);
|
||||||
|
|
||||||
char* newData = static_cast<char*>(::malloc(to + sizeof(intptr_t)));
|
char* newData = static_cast<char*>(ASMJIT_ALLOC(to + sizeof(intptr_t)));
|
||||||
if (newData == NULL) {
|
if (newData == NULL) {
|
||||||
clear();
|
clear();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_canFree)
|
if (_canFree)
|
||||||
::free(_data);
|
ASMJIT_FREE(_data);
|
||||||
|
|
||||||
_data = newData;
|
_data = newData;
|
||||||
_capacity = to + sizeof(intptr_t) - 1;
|
_capacity = to + sizeof(intptr_t) - 1;
|
||||||
@@ -114,14 +114,14 @@ char* StringBuilder::prepare(uint32_t op, size_t len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
to = IntUtil::alignTo<size_t>(to, sizeof(intptr_t));
|
to = IntUtil::alignTo<size_t>(to, sizeof(intptr_t));
|
||||||
char* newData = static_cast<char*>(::malloc(to + sizeof(intptr_t)));
|
char* newData = static_cast<char*>(ASMJIT_ALLOC(to + sizeof(intptr_t)));
|
||||||
|
|
||||||
if (newData == NULL)
|
if (newData == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
::memcpy(newData, _data, _length);
|
::memcpy(newData, _data, _length);
|
||||||
if (_canFree)
|
if (_canFree)
|
||||||
::free(_data);
|
ASMJIT_FREE(_data);
|
||||||
|
|
||||||
_data = newData;
|
_data = newData;
|
||||||
_capacity = to + sizeof(intptr_t) - 1;
|
_capacity = to + sizeof(intptr_t) - 1;
|
||||||
@@ -146,13 +146,13 @@ bool StringBuilder::reserve(size_t to) {
|
|||||||
|
|
||||||
to = IntUtil::alignTo<size_t>(to, sizeof(intptr_t));
|
to = IntUtil::alignTo<size_t>(to, sizeof(intptr_t));
|
||||||
|
|
||||||
char* newData = static_cast<char*>(::malloc(to + sizeof(intptr_t)));
|
char* newData = static_cast<char*>(ASMJIT_ALLOC(to + sizeof(intptr_t)));
|
||||||
if (newData == NULL)
|
if (newData == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
::memcpy(newData, _data, _length + 1);
|
::memcpy(newData, _data, _length + 1);
|
||||||
if (_canFree)
|
if (_canFree)
|
||||||
::free(_data);
|
ASMJIT_FREE(_data);
|
||||||
|
|
||||||
_data = newData;
|
_data = newData;
|
||||||
_capacity = to + sizeof(intptr_t) - 1;
|
_capacity = to + sizeof(intptr_t) - 1;
|
||||||
|
|||||||
@@ -458,7 +458,7 @@ VMemPrivate::~VMemPrivate() {
|
|||||||
PermanentNode* node = _permanent;
|
PermanentNode* node = _permanent;
|
||||||
while (node) {
|
while (node) {
|
||||||
PermanentNode* prev = node->prev;
|
PermanentNode* prev = node->prev;
|
||||||
::free(node);
|
ASMJIT_FREE(node);
|
||||||
node = prev;
|
node = prev;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -480,14 +480,14 @@ MemNode* VMemPrivate::createNode(size_t size, size_t density) {
|
|||||||
size_t blocks = (vsize / density);
|
size_t blocks = (vsize / density);
|
||||||
size_t bsize = (((blocks + 7) >> 3) + sizeof(size_t) - 1) & ~(size_t)(sizeof(size_t) - 1);
|
size_t bsize = (((blocks + 7) >> 3) + sizeof(size_t) - 1) & ~(size_t)(sizeof(size_t) - 1);
|
||||||
|
|
||||||
MemNode* node = static_cast<MemNode*>(::malloc(sizeof(MemNode)));
|
MemNode* node = static_cast<MemNode*>(ASMJIT_ALLOC(sizeof(MemNode)));
|
||||||
uint8_t* data = static_cast<uint8_t*>(::malloc(bsize * 2));
|
uint8_t* data = static_cast<uint8_t*>(ASMJIT_ALLOC(bsize * 2));
|
||||||
|
|
||||||
// Out of memory.
|
// Out of memory.
|
||||||
if (node == NULL || data == NULL) {
|
if (node == NULL || data == NULL) {
|
||||||
freeVirtualMemory(vmem, vsize);
|
freeVirtualMemory(vmem, vsize);
|
||||||
if (node) ::free(node);
|
if (node) ASMJIT_FREE(node);
|
||||||
if (data) ::free(data);
|
if (data) ASMJIT_FREE(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -523,8 +523,8 @@ void VMemPrivate::reset(bool keepVirtualMemory) {
|
|||||||
if (!keepVirtualMemory)
|
if (!keepVirtualMemory)
|
||||||
freeVirtualMemory(node->mem, node->size);
|
freeVirtualMemory(node->mem, node->size);
|
||||||
|
|
||||||
::free(node->baUsed);
|
ASMJIT_FREE(node->baUsed);
|
||||||
::free(node);
|
ASMJIT_FREE(node);
|
||||||
|
|
||||||
node = next;
|
node = next;
|
||||||
}
|
}
|
||||||
@@ -562,7 +562,7 @@ void* VMemPrivate::allocPermanent(size_t vsize) {
|
|||||||
if (vsize > nodeSize)
|
if (vsize > nodeSize)
|
||||||
nodeSize = vsize;
|
nodeSize = vsize;
|
||||||
|
|
||||||
node = static_cast<PermanentNode*>(::malloc(sizeof(PermanentNode)));
|
node = static_cast<PermanentNode*>(ASMJIT_ALLOC(sizeof(PermanentNode)));
|
||||||
|
|
||||||
// Out of memory.
|
// Out of memory.
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
@@ -572,7 +572,7 @@ void* VMemPrivate::allocPermanent(size_t vsize) {
|
|||||||
|
|
||||||
// Out of memory.
|
// Out of memory.
|
||||||
if (node->mem == NULL) {
|
if (node->mem == NULL) {
|
||||||
::free(node);
|
ASMJIT_FREE(node);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -775,7 +775,7 @@ Error VMemPrivate::release(void* address) {
|
|||||||
// Free memory associated with node (this memory is not accessed
|
// Free memory associated with node (this memory is not accessed
|
||||||
// anymore so it's safe).
|
// anymore so it's safe).
|
||||||
freeVirtualMemory(node->mem, node->size);
|
freeVirtualMemory(node->mem, node->size);
|
||||||
::free(node->baUsed);
|
ASMJIT_FREE(node->baUsed);
|
||||||
|
|
||||||
node->baUsed = NULL;
|
node->baUsed = NULL;
|
||||||
node->baCont = NULL;
|
node->baCont = NULL;
|
||||||
@@ -785,7 +785,7 @@ Error VMemPrivate::release(void* address) {
|
|||||||
|
|
||||||
// Remove node. This function can return different node than
|
// Remove node. This function can return different node than
|
||||||
// passed into, but data is copied into previous node if needed.
|
// passed into, but data is copied into previous node if needed.
|
||||||
::free(removeNode(node));
|
ASMJIT_FREE(removeNode(node));
|
||||||
ASMJIT_ASSERT(checkTree());
|
ASMJIT_ASSERT(checkTree());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1274,8 +1274,8 @@ UNIT(base_vmem) {
|
|||||||
|
|
||||||
INFO("Memory alloc/free test - %d allocations.", static_cast<int>(kCount));
|
INFO("Memory alloc/free test - %d allocations.", static_cast<int>(kCount));
|
||||||
|
|
||||||
void** a = (void**)::malloc(sizeof(void*) * kCount);
|
void** a = (void**)ASMJIT_ALLOC(sizeof(void*) * kCount);
|
||||||
void** b = (void**)::malloc(sizeof(void*) * kCount);
|
void** b = (void**)ASMJIT_ALLOC(sizeof(void*) * kCount);
|
||||||
|
|
||||||
EXPECT(a != NULL && b != NULL,
|
EXPECT(a != NULL && b != NULL,
|
||||||
"Couldn't allocate %u bytes on heap.", kCount * 2);
|
"Couldn't allocate %u bytes on heap.", kCount * 2);
|
||||||
@@ -1306,7 +1306,7 @@ UNIT(base_vmem) {
|
|||||||
EXPECT(a[i] != NULL,
|
EXPECT(a[i] != NULL,
|
||||||
"Couldn't allocate %d bytes of virtual memory.", r);
|
"Couldn't allocate %d bytes of virtual memory.", r);
|
||||||
|
|
||||||
b[i] = ::malloc(r);
|
b[i] = ASMJIT_ALLOC(r);
|
||||||
EXPECT(b[i] != NULL,
|
EXPECT(b[i] != NULL,
|
||||||
"Couldn't allocate %d bytes on heap.", r);
|
"Couldn't allocate %d bytes on heap.", r);
|
||||||
|
|
||||||
@@ -1322,7 +1322,7 @@ UNIT(base_vmem) {
|
|||||||
VMemTest_verify(a[i], b[i]);
|
VMemTest_verify(a[i], b[i]);
|
||||||
EXPECT(memmgr.release(a[i]) == kErrorOk,
|
EXPECT(memmgr.release(a[i]) == kErrorOk,
|
||||||
"Failed to free %p.", a[i]);
|
"Failed to free %p.", a[i]);
|
||||||
::free(b[i]);
|
ASMJIT_FREE(b[i]);
|
||||||
}
|
}
|
||||||
VMemTest_stats(memmgr);
|
VMemTest_stats(memmgr);
|
||||||
|
|
||||||
@@ -1334,7 +1334,7 @@ UNIT(base_vmem) {
|
|||||||
EXPECT(a[i] != NULL,
|
EXPECT(a[i] != NULL,
|
||||||
"Couldn't allocate %d bytes of virtual memory.", r);
|
"Couldn't allocate %d bytes of virtual memory.", r);
|
||||||
|
|
||||||
b[i] = ::malloc(r);
|
b[i] = ASMJIT_ALLOC(r);
|
||||||
EXPECT(b[i] != NULL,
|
EXPECT(b[i] != NULL,
|
||||||
"Couldn't allocate %d bytes on heap.");
|
"Couldn't allocate %d bytes on heap.");
|
||||||
|
|
||||||
@@ -1347,12 +1347,12 @@ UNIT(base_vmem) {
|
|||||||
VMemTest_verify(a[i], b[i]);
|
VMemTest_verify(a[i], b[i]);
|
||||||
EXPECT(memmgr.release(a[i]) == kErrorOk,
|
EXPECT(memmgr.release(a[i]) == kErrorOk,
|
||||||
"Failed to free %p.", a[i]);
|
"Failed to free %p.", a[i]);
|
||||||
::free(b[i]);
|
ASMJIT_FREE(b[i]);
|
||||||
}
|
}
|
||||||
VMemTest_stats(memmgr);
|
VMemTest_stats(memmgr);
|
||||||
|
|
||||||
::free(a);
|
ASMJIT_FREE(a);
|
||||||
::free(b);
|
ASMJIT_FREE(b);
|
||||||
}
|
}
|
||||||
#endif // ASMJIT_TEST
|
#endif // ASMJIT_TEST
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ void Zone::reset() {
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
Block* prev = cur->prev;
|
Block* prev = cur->prev;
|
||||||
::free(cur);
|
ASMJIT_FREE(cur);
|
||||||
cur = prev;
|
cur = prev;
|
||||||
} while (cur != NULL);
|
} while (cur != NULL);
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ void* Zone::_alloc(size_t size) {
|
|||||||
if (blockSize > ~static_cast<size_t>(0) - sizeof(Block))
|
if (blockSize > ~static_cast<size_t>(0) - sizeof(Block))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
Block* newBlock = static_cast<Block*>(::malloc(sizeof(Block) - sizeof(void*) + blockSize));
|
Block* newBlock = static_cast<Block*>(ASMJIT_ALLOC(sizeof(Block) - sizeof(void*) + blockSize));
|
||||||
if (newBlock == NULL)
|
if (newBlock == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -185,6 +185,16 @@
|
|||||||
# define ASMJIT_ENUM(_Name_) enum _Name_
|
# define ASMJIT_ENUM(_Name_) enum _Name_
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// [asmjit::build - Memory Management]
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
#if !defined(ASMJIT_ALLOC) && !defined(ASMJIT_REALLOC) && !defined(ASMJIT_FREE)
|
||||||
|
# define ASMJIT_ALLOC(_Size_) ::malloc(_Size_)
|
||||||
|
# define ASMJIT_REALLOC(_Ptr_, _Size_) ::realloc(_Ptr_, _Size_)
|
||||||
|
# define ASMJIT_FREE(_Ptr_) ::free(_Ptr_)
|
||||||
|
#endif // !ASMJIT_ALLOC && !ASMJIT_REALLOC && !ASMJIT_FREE
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// [asmjit::build - _ASMJIT_HOST_INDEX]
|
// [asmjit::build - _ASMJIT_HOST_INDEX]
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user