1 // [AsmJit] 2 // Complete JIT Assembler for C++ Language. 3 // 4 // [License] 5 // Zlib - See COPYING file in this package. 6 7 #define ASMJIT_EXPORTS 8 9 // [Dependencies - AsmJit] 10 #include "../core/defs.h" 11 #include "../core/intutil.h" 12 #include "../core/zonememory.h" 13 14 // [Api-Begin] 15 #include "../core/apibegin.h" 16 17 namespace AsmJit { 18 19 // ============================================================================ 20 // [AsmJit::ZoneMemory] 21 // ============================================================================ 22 ZoneMemory(size_t chunkSize)23ZoneMemory::ZoneMemory(size_t chunkSize) 24 { 25 _chunks = NULL; 26 _total = 0; 27 _chunkSize = chunkSize; 28 } 29 ~ZoneMemory()30ZoneMemory::~ZoneMemory() 31 { 32 reset(); 33 } 34 alloc(size_t size)35void* ZoneMemory::alloc(size_t size) 36 { 37 ZoneChunk* cur = _chunks; 38 39 // Align to 4 or 8 bytes. 40 size = IntUtil::align<size_t>(size, sizeof(size_t)); 41 42 if (cur == NULL || cur->getRemainingBytes() < size) 43 { 44 size_t chSize = _chunkSize; 45 46 if (chSize < size) 47 chSize = size; 48 49 cur = (ZoneChunk*)ASMJIT_MALLOC(sizeof(ZoneChunk) - sizeof(void*) + chSize); 50 if (cur == NULL) 51 return NULL; 52 53 cur->prev = _chunks; 54 cur->pos = 0; 55 cur->size = chSize; 56 57 _chunks = cur; 58 } 59 60 uint8_t* p = cur->data + cur->pos; 61 cur->pos += size; 62 _total += size; 63 64 ASMJIT_ASSERT(cur->pos <= cur->size); 65 return (void*)p; 66 } 67 sdup(const char * str)68char* ZoneMemory::sdup(const char* str) 69 { 70 if (str == NULL) return NULL; 71 72 size_t len = strlen(str); 73 if (len == 0) return NULL; 74 75 // Include NULL terminator and limit string length. 76 if (++len > 256) 77 len = 256; 78 79 char* m = reinterpret_cast<char*>(alloc(IntUtil::align<size_t>(len, 16))); 80 if (m == NULL) 81 return NULL; 82 83 memcpy(m, str, len); 84 m[len - 1] = '\0'; 85 return m; 86 } 87 clear()88void ZoneMemory::clear() 89 { 90 ZoneChunk* cur = _chunks; 91 92 if (cur == NULL) 93 return; 94 95 cur = cur->prev; 96 while (cur != NULL) 97 { 98 ZoneChunk* prev = cur->prev; 99 ASMJIT_FREE(cur); 100 cur = prev; 101 } 102 103 _chunks->pos = 0; 104 _chunks->prev = NULL; 105 _total = 0; 106 } 107 reset()108void ZoneMemory::reset() 109 { 110 ZoneChunk* cur = _chunks; 111 112 _chunks = NULL; 113 _total = 0; 114 115 while (cur != NULL) 116 { 117 ZoneChunk* prev = cur->prev; 118 ASMJIT_FREE(cur); 119 cur = prev; 120 } 121 } 122 123 } // AsmJit namespace 124 125 // [Api-End] 126 #include "../core/apiend.h" 127