Mercurial > projects > ldc
comparison tango/lib/compiler/llvmdc/lifetime.d @ 209:c4c9b4ac021b trunk
[svn r225] Fixed: delete expressions no longer use llvm's free instruction, which crashes on a GC provided pointer.
author | lindquist |
---|---|
date | Wed, 14 May 2008 01:22:40 +0200 |
parents | e881c9b1c738 |
children | f66219e0d530 |
comparison
equal
deleted
inserted
replaced
208:086e1aa99557 | 209:c4c9b4ac021b |
---|---|
129 | 129 |
130 debug(PRINTF) printf("initialization done\n"); | 130 debug(PRINTF) printf("initialization done\n"); |
131 return cast(Object) p; | 131 return cast(Object) p; |
132 } | 132 } |
133 | 133 |
134 /+ | 134 /** |
135 | 135 * |
136 /** | 136 */ |
137 * | 137 extern (C) void _d_delinterface(void* p) |
138 */ | 138 { |
139 extern (C) void _d_delinterface(void** p) | 139 if (p) |
140 { | 140 { |
141 if (*p) | 141 Interface* pi = **cast(Interface ***)p; |
142 { | 142 Object o = cast(Object)(p - pi.offset); |
143 Interface* pi = **cast(Interface ***)*p; | 143 |
144 Object o = cast(Object)(*p - pi.offset); | 144 _d_delclass(o); |
145 | 145 //*p = null; |
146 _d_delclass(&o); | 146 } |
147 *p = null; | 147 } |
148 } | |
149 } | |
150 | |
151 +/ | |
152 | 148 |
153 // used for deletion | 149 // used for deletion |
154 private extern (D) alias void function(Object) fp_t; | 150 private extern (D) alias void function(Object) fp_t; |
155 | 151 |
152 | |
153 /** | |
154 * | |
155 */ | |
156 extern (C) void _d_delclass(Object p) | |
157 { | |
158 if (p) | |
159 { | |
160 debug(PRINTF) printf("_d_delclass(%p)\n", p); | |
161 | |
162 ClassInfo **pc = cast(ClassInfo **)p; | |
163 if (*pc) | |
164 { | |
165 ClassInfo c = **pc; | |
166 | |
167 rt_finalize(cast(void*) p); | |
168 | |
169 if (c.deallocator) | |
170 { | |
171 fp_t fp = cast(fp_t)c.deallocator; | |
172 (*fp)(p); // call deallocator | |
173 //*p = null; | |
174 return; | |
175 } | |
176 } | |
177 else | |
178 { | |
179 rt_finalize(cast(void*) p); | |
180 } | |
181 gc_free(cast(void*) p); | |
182 //*p = null; | |
183 } | |
184 } | |
185 | |
156 /+ | 186 /+ |
157 | |
158 | |
159 /** | |
160 * | |
161 */ | |
162 extern (C) void _d_delclass(Object* p) | |
163 { | |
164 if (*p) | |
165 { | |
166 debug(PRINTF) printf("_d_delclass(%p)\n", *p); | |
167 | |
168 ClassInfo **pc = cast(ClassInfo **)*p; | |
169 if (*pc) | |
170 { | |
171 ClassInfo c = **pc; | |
172 | |
173 rt_finalize(cast(void*) *p); | |
174 | |
175 if (c.deallocator) | |
176 { | |
177 fp_t fp = cast(fp_t)c.deallocator; | |
178 (*fp)(*p); // call deallocator | |
179 *p = null; | |
180 return; | |
181 } | |
182 } | |
183 else | |
184 { | |
185 rt_finalize(cast(void*) *p); | |
186 } | |
187 gc_free(cast(void*) *p); | |
188 *p = null; | |
189 } | |
190 } | |
191 | 187 |
192 /** | 188 /** |
193 * | 189 * |
194 */ | 190 */ |
195 struct Array | 191 struct Array |
418 extern (C) void* _d_allocmemoryT(TypeInfo ti) | 414 extern (C) void* _d_allocmemoryT(TypeInfo ti) |
419 { | 415 { |
420 return gc_malloc(ti.tsize(), (ti.flags() & 1) ? BlkAttr.NO_SCAN : 0); | 416 return gc_malloc(ti.tsize(), (ti.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
421 } | 417 } |
422 | 418 |
423 /+ | 419 /** |
424 | 420 * |
425 /** | 421 */ |
426 * | 422 extern (C) void _d_delarray(size_t plength, void* pdata) |
427 */ | 423 { |
428 extern (C) void _d_delarray(Array *p) | 424 // if (p) |
425 // { | |
426 assert(!plength || pdata); | |
427 | |
428 if (pdata) | |
429 gc_free(pdata); | |
430 // p.data = null; | |
431 // p.length = 0; | |
432 // } | |
433 } | |
434 | |
435 /** | |
436 * | |
437 */ | |
438 extern (C) void _d_delmemory(void* p) | |
429 { | 439 { |
430 if (p) | 440 if (p) |
431 { | 441 { |
432 assert(!p.length || p.data); | 442 gc_free(p); |
433 | 443 //*p = null; |
434 if (p.data) | |
435 gc_free(p.data); | |
436 p.data = null; | |
437 p.length = 0; | |
438 } | |
439 } | |
440 | |
441 +/ | |
442 | |
443 /** | |
444 * | |
445 */ | |
446 extern (C) void _d_delmemory(void* *p) | |
447 { | |
448 if (*p) | |
449 { | |
450 gc_free(*p); | |
451 *p = null; | |
452 } | 444 } |
453 } | 445 } |
454 | 446 |
455 | 447 |
456 /** | 448 /** |