diff 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
line wrap: on
line diff
--- a/tango/lib/compiler/llvmdc/lifetime.d	Tue May 13 21:41:25 2008 +0200
+++ b/tango/lib/compiler/llvmdc/lifetime.d	Wed May 14 01:22:40 2008 +0200
@@ -131,64 +131,60 @@
     return cast(Object) p;
 }
 
-/+
-
 /**
  *
  */
-extern (C) void _d_delinterface(void** p)
+extern (C) void _d_delinterface(void* p)
 {
-    if (*p)
+    if (p)
     {
-        Interface* pi = **cast(Interface ***)*p;
-        Object     o  = cast(Object)(*p - pi.offset);
+        Interface* pi = **cast(Interface ***)p;
+        Object     o  = cast(Object)(p - pi.offset);
 
-        _d_delclass(&o);
-        *p = null;
+        _d_delclass(o);
+        //*p = null;
     }
 }
 
-+/
-
 // used for deletion
 private extern (D) alias void function(Object) fp_t;
 
-/+
-
 
 /**
  *
  */
-extern (C) void _d_delclass(Object* p)
+extern (C) void _d_delclass(Object p)
 {
-    if (*p)
+    if (p)
     {
-        debug(PRINTF) printf("_d_delclass(%p)\n", *p);
+        debug(PRINTF) printf("_d_delclass(%p)\n", p);
 
-        ClassInfo **pc = cast(ClassInfo **)*p;
+        ClassInfo **pc = cast(ClassInfo **)p;
         if (*pc)
         {
             ClassInfo c = **pc;
 
-            rt_finalize(cast(void*) *p);
+            rt_finalize(cast(void*) p);
 
             if (c.deallocator)
             {
                 fp_t fp = cast(fp_t)c.deallocator;
-                (*fp)(*p); // call deallocator
-                *p = null;
+                (*fp)(p); // call deallocator
+                //*p = null;
                 return;
             }
         }
         else
         {
-            rt_finalize(cast(void*) *p);
+            rt_finalize(cast(void*) p);
         }
-        gc_free(cast(void*) *p);
-        *p = null;
+        gc_free(cast(void*) p);
+        //*p = null;
     }
 }
 
+/+
+
 /**
  *
  */
@@ -420,35 +416,31 @@
     return gc_malloc(ti.tsize(), (ti.flags() & 1) ? BlkAttr.NO_SCAN : 0);
 }
 
-/+
+/**
+ *
+ */
+extern (C) void _d_delarray(size_t plength, void* pdata)
+{
+//     if (p)
+//     {
+        assert(!plength || pdata);
+
+        if (pdata)
+            gc_free(pdata);
+//         p.data = null;
+//         p.length = 0;
+//     }
+}
 
 /**
  *
  */
-extern (C) void _d_delarray(Array *p)
+extern (C) void _d_delmemory(void* p)
 {
     if (p)
     {
-        assert(!p.length || p.data);
-
-        if (p.data)
-            gc_free(p.data);
-        p.data = null;
-        p.length = 0;
-    }
-}
-
-+/
-
-/**
- *
- */
-extern (C) void _d_delmemory(void* *p)
-{
-    if (*p)
-    {
-        gc_free(*p);
-        *p = null;
+        gc_free(p);
+        //*p = null;
     }
 }