]> git.llucax.com Git - software/druntime.git/blobdiff - src/compiler/dmd/lifetime.d
cover.d does not produce output
[software/druntime.git] / src / compiler / dmd / lifetime.d
index 55861b06a2c23253e10ff9b59bf5574b1c72983e..2b77809ad527606e48856431f91cc24992699e67 100644 (file)
@@ -29,10 +29,10 @@ module rt.lifetime;
 
 private
 {
-    import stdc.stdlib;
-    import stdc.string;
-    import stdc.stdarg;
-    debug(PRINTF) import stdc.stdio;
+    import core.stdc.stdlib;
+    import core.stdc.string;
+    import core.stdc.stdarg;
+    debug(PRINTF) import core.stdc.stdio;
 }
 
 
@@ -66,7 +66,7 @@ private
     extern (C) size_t  gc_sizeOf( void* p );
     extern (C) BlkInfo gc_query( void* p );
 
-    extern (C) void onFinalizeError( ClassInfo c, Exception e );
+    extern (C) void onFinalizeError( ClassInfo c, Throwable e );
     extern (C) void onOutOfMemoryError();
 
     extern (C) void _d_monitordelete(Object h, bool det = true);
@@ -81,6 +81,15 @@ private
 }
 
 
+/**
+ *
+ */
+extern (C) void* _d_allocmemory(size_t sz)
+{
+    return gc_malloc(sz);
+}
+
+
 /**
  *
  */
@@ -397,25 +406,46 @@ struct Array
 
 
 /**
- *
+ * This function has been replaced by _d_delarray_t
  */
-void* _d_allocmemory(size_t nbytes)
+extern (C) void _d_delarray(Array *p)
 {
-    return gc_malloc(nbytes);
+    if (p)
+    {
+        assert(!p.length || p.data);
+
+        if (p.data)
+            gc_free(p.data);
+        p.data = null;
+        p.length = 0;
+    }
 }
 
 
 /**
  *
  */
-extern (C) void _d_delarray(Array *p)
+extern (C) void _d_delarray_t(Array *p, TypeInfo ti)
 {
     if (p)
     {
         assert(!p.length || p.data);
-
         if (p.data)
+        {
+            if (ti)
+            {
+                // Call destructors on all the sub-objects
+                auto sz = ti.tsize();
+                auto pe = p.data;
+                auto pend = pe + p.length * sz;
+                while (pe != pend)
+                {
+                    pend -= sz;
+                    ti.destroy(pend);
+                }
+            }
             gc_free(p.data);
+        }
         p.data = null;
         p.length = 0;
     }
@@ -499,7 +529,7 @@ extern (C) void rt_finalize(void* p, bool det = true)
                 if ((cast(void**)p)[1]) // if monitor is not null
                     _d_monitordelete(cast(Object)p, det);
             }
-            catch (Exception e)
+            catch (Throwable e)
             {
                 onFinalizeError(**pc, e);
             }