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 /**