Mercurial > projects > ldc
annotate dmd/mem.c @ 268:23d0d9855cad trunk
[svn r289] Fixed: right shift >> was broken for unsigned types.
Fixed: debug info for classes now started.
author | lindquist |
---|---|
date | Sun, 15 Jun 2008 18:52:27 +0200 |
parents | 35d93ce68cf4 |
children | 967178e31a13 |
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 |
10 #include "mem.h" | |
11 | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
12 #define USE_BOEHM_GC 0 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
13 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
14 #if USE_BOEHM_GC |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
15 // 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
|
16 #include "gc/gc.h" |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
17 #endif |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
18 |
1 | 19 /* This implementation of the storage allocator uses the standard C allocation package. |
20 */ | |
21 | |
22 Mem mem; | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
23 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
24 #if USE_BOEHM_GC |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
25 |
6 | 26 static bool gc_was_init = false; |
1 | 27 |
28 void Mem::init() | |
29 { | |
30 GC_init(); | |
6 | 31 gc_was_init = true; |
1 | 32 } |
33 | |
34 char *Mem::strdup(const char *s) | |
35 { | |
36 char *p; | |
37 | |
38 if (s) | |
39 { | |
40 p = GC_strdup(s); | |
41 if (p) | |
42 return p; | |
43 error(); | |
44 } | |
45 return NULL; | |
46 } | |
47 | |
48 void *Mem::malloc(size_t size) | |
49 { void *p; | |
50 | |
51 if (!size) | |
52 p = NULL; | |
53 else | |
54 { | |
55 p = GC_malloc(size); | |
56 if (!p) | |
57 error(); | |
58 } | |
59 return p; | |
60 } | |
61 | |
62 void *Mem::calloc(size_t size, size_t n) | |
63 { void *p; | |
64 | |
65 if (!size || !n) | |
66 p = NULL; | |
67 else | |
68 { | |
69 p = GC_malloc(size * n); | |
70 if (!p) | |
71 error(); | |
72 memset(p, 0, size * n); | |
73 } | |
74 return p; | |
75 } | |
76 | |
77 void *Mem::realloc(void *p, size_t size) | |
78 { | |
79 if (!size) | |
80 { if (p) | |
81 { GC_free(p); | |
82 p = NULL; | |
83 } | |
84 } | |
85 else if (!p) | |
86 { | |
87 p = GC_malloc(size); | |
88 if (!p) | |
89 error(); | |
90 } | |
91 else | |
92 { | |
93 p = GC_realloc(p, size); | |
94 if (!p) | |
95 error(); | |
96 } | |
97 return p; | |
98 } | |
99 | |
100 void Mem::free(void *p) | |
101 { | |
102 if (p) | |
103 GC_free(p); | |
104 } | |
105 | |
106 void *Mem::mallocdup(void *o, size_t size) | |
107 { void *p; | |
108 | |
109 if (!size) | |
110 p = NULL; | |
111 else | |
112 { | |
113 p = GC_malloc(size); | |
114 if (!p) | |
115 error(); | |
116 else | |
117 memcpy(p,o,size); | |
118 } | |
119 return p; | |
120 } | |
121 | |
122 void Mem::error() | |
123 { | |
124 printf("Error: out of memory\n"); | |
125 exit(EXIT_FAILURE); | |
126 } | |
127 | |
128 void Mem::fullcollect() | |
129 { | |
130 GC_gcollect(); | |
131 } | |
132 | |
133 void Mem::mark(void *pointer) | |
134 { | |
135 (void) pointer; // necessary for VC /W4 | |
136 } | |
137 | |
138 /* =================================================== */ | |
139 | |
140 void * operator new(size_t m_size) | |
6 | 141 { |
142 // without this we segfault with gc 7.0 | |
143 if (!gc_was_init) { | |
144 mem.init(); | |
145 } | |
1 | 146 void *p = GC_malloc(m_size); |
147 if (p) | |
148 return p; | |
149 printf("Error: out of memory\n"); | |
150 exit(EXIT_FAILURE); | |
151 return p; | |
152 } | |
153 | |
154 void operator delete(void *p) | |
155 { | |
156 GC_free(p); | |
157 } | |
158 | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
159 #elif !USE_BOEHM_GC |
1 | 160 |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
161 void Mem::init() |
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 } |
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 *Mem::strdup(const char *s) |
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 char *p; |
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 if (s) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
170 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
171 p = ::strdup(s); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
172 if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
173 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
174 error(); |
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 return NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
177 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
178 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
179 void *Mem::malloc(size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
180 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
181 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
182 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
183 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
184 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
185 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
186 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
187 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
188 error(); |
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 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
191 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
192 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
193 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
|
194 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
195 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
196 if (!size || !n) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
197 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
198 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
199 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
200 p = ::malloc(size * n); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
201 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
202 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
203 memset(p, 0, size * n); |
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 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
206 } |
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 void *Mem::realloc(void *p, size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
209 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
210 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
211 { if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
212 { ::free(p); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
213 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
214 } |
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 else if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
217 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
218 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
219 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
220 error(); |
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 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
223 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
224 p = ::realloc(p, size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
225 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
226 error(); |
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 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
229 } |
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 void Mem::free(void *p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
232 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
233 if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
234 ::free(p); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
235 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
236 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
237 void *Mem::mallocdup(void *o, size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
238 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
239 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
240 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
241 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
242 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
243 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
244 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
245 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
246 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
247 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
248 memcpy(p,o,size); |
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 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
251 } |
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 void Mem::error() |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
254 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
255 printf("Error: out of memory\n"); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
256 exit(EXIT_FAILURE); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
257 } |
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 void Mem::fullcollect() |
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 } |
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 void Mem::mark(void *pointer) |
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 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
266 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
267 #endif // USE_BOEHM_GC |