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)23 ZoneMemory::ZoneMemory(size_t chunkSize)
24 {
25   _chunks = NULL;
26   _total = 0;
27   _chunkSize = chunkSize;
28 }
29 
~ZoneMemory()30 ZoneMemory::~ZoneMemory()
31 {
32   reset();
33 }
34 
alloc(size_t size)35 void* 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)68 char* 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()88 void 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()108 void 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