Mercurial > projects > ldc
annotate dmd/mem.c @ 1571:8d086d552909
IntegerType is now contextifed.
Requires llvm >= 78969. resistor says this will be the last context API change :)
author | Benjamin Kramer <benny.kra@gmail.com> |
---|---|
date | Fri, 14 Aug 2009 00:39:18 +0200 |
parents | b30fe7e1dbb9 |
children |
rev | line source |
---|---|
1 | 1 |
2 /* Copyright (c) 2000 Digital Mars */ | |
3 /* All Rights Reserved */ | |
4 | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
5 #include <cstdio> |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
6 #include <cstdlib> |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
7 #include <cstring> |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
8 #include <cassert> |
1 | 9 |
1103
b30fe7e1dbb9
- Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
269
diff
changeset
|
10 #include "rmem.h" |
1 | 11 |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
12 #if USE_BOEHM_GC |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
13 // I needed to perfix the dir after upgrading to gc 7.0 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
14 #include "gc/gc.h" |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
15 #endif |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
16 |
1 | 17 /* This implementation of the storage allocator uses the standard C allocation package. |
18 */ | |
19 | |
20 Mem mem; | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
21 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
22 #if USE_BOEHM_GC |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
23 |
6 | 24 static bool gc_was_init = false; |
1 | 25 |
26 void Mem::init() | |
27 { | |
28 GC_init(); | |
6 | 29 gc_was_init = true; |
1 | 30 } |
31 | |
32 char *Mem::strdup(const char *s) | |
33 { | |
34 char *p; | |
35 | |
36 if (s) | |
37 { | |
38 p = GC_strdup(s); | |
39 if (p) | |
40 return p; | |
41 error(); | |
42 } | |
43 return NULL; | |
44 } | |
45 | |
46 void *Mem::malloc(size_t size) | |
47 { void *p; | |
48 | |
49 if (!size) | |
50 p = NULL; | |
51 else | |
52 { | |
53 p = GC_malloc(size); | |
54 if (!p) | |
55 error(); | |
56 } | |
57 return p; | |
58 } | |
59 | |
60 void *Mem::calloc(size_t size, size_t n) | |
61 { void *p; | |
62 | |
63 if (!size || !n) | |
64 p = NULL; | |
65 else | |
66 { | |
67 p = GC_malloc(size * n); | |
68 if (!p) | |
69 error(); | |
70 memset(p, 0, size * n); | |
71 } | |
72 return p; | |
73 } | |
74 | |
75 void *Mem::realloc(void *p, size_t size) | |
76 { | |
77 if (!size) | |
78 { if (p) | |
79 { GC_free(p); | |
80 p = NULL; | |
81 } | |
82 } | |
83 else if (!p) | |
84 { | |
85 p = GC_malloc(size); | |
86 if (!p) | |
87 error(); | |
88 } | |
89 else | |
90 { | |
91 p = GC_realloc(p, size); | |
92 if (!p) | |
93 error(); | |
94 } | |
95 return p; | |
96 } | |
97 | |
98 void Mem::free(void *p) | |
99 { | |
100 if (p) | |
101 GC_free(p); | |
102 } | |
103 | |
104 void *Mem::mallocdup(void *o, size_t size) | |
105 { void *p; | |
106 | |
107 if (!size) | |
108 p = NULL; | |
109 else | |
110 { | |
111 p = GC_malloc(size); | |
112 if (!p) | |
113 error(); | |
114 else | |
115 memcpy(p,o,size); | |
116 } | |
117 return p; | |
118 } | |
119 | |
120 void Mem::error() | |
121 { | |
122 printf("Error: out of memory\n"); | |
123 exit(EXIT_FAILURE); | |
124 } | |
125 | |
126 void Mem::fullcollect() | |
127 { | |
128 GC_gcollect(); | |
129 } | |
130 | |
131 void Mem::mark(void *pointer) | |
132 { | |
133 (void) pointer; // necessary for VC /W4 | |
134 } | |
135 | |
136 /* =================================================== */ | |
137 | |
138 void * operator new(size_t m_size) | |
6 | 139 { |
140 // without this we segfault with gc 7.0 | |
141 if (!gc_was_init) { | |
142 mem.init(); | |
143 } | |
1 | 144 void *p = GC_malloc(m_size); |
145 if (p) | |
146 return p; | |
147 printf("Error: out of memory\n"); | |
148 exit(EXIT_FAILURE); | |
149 return p; | |
150 } | |
151 | |
152 void operator delete(void *p) | |
153 { | |
154 GC_free(p); | |
155 } | |
156 | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
157 #elif !USE_BOEHM_GC |
1 | 158 |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
159 void Mem::init() |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
160 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
161 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
162 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
163 char *Mem::strdup(const char *s) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
164 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
165 char *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
166 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
167 if (s) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
168 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
169 p = ::strdup(s); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
170 if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
171 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
172 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
173 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
174 return NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
175 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
176 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
177 void *Mem::malloc(size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
178 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
179 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
180 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
181 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
182 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
183 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
184 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
185 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
186 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
187 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
188 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
189 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
190 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
191 void *Mem::calloc(size_t size, size_t n) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
192 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
193 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
194 if (!size || !n) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
195 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
196 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
197 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
198 p = ::malloc(size * n); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
199 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
200 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
201 memset(p, 0, size * n); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
202 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
203 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
204 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
205 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
206 void *Mem::realloc(void *p, size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
207 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
208 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
209 { if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
210 { ::free(p); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
211 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
212 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
213 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
214 else if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
215 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
216 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
217 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
218 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
219 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
220 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
221 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
222 p = ::realloc(p, size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
223 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
224 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
225 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
226 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
227 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
228 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
229 void Mem::free(void *p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
230 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
231 if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
232 ::free(p); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
233 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
234 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
235 void *Mem::mallocdup(void *o, size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
236 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
237 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
238 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
239 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
240 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
241 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
242 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
243 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
244 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
245 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
246 memcpy(p,o,size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
247 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
248 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
249 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
250 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
251 void Mem::error() |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
252 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
253 printf("Error: out of memory\n"); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
254 exit(EXIT_FAILURE); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
255 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
256 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
257 void Mem::fullcollect() |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
258 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
259 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
260 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
261 void Mem::mark(void *pointer) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
262 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
263 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
264 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
265 #endif // USE_BOEHM_GC |