From 840f10020bd2d84ec12e8a0a30c7f0fe24b4a1c5 Mon Sep 17 00:00:00 2001 From: Sean Kelly Date: Fri, 10 Oct 2008 21:49:12 +0000 Subject: [PATCH] Added _d_delarray_t and _d_allocmemory. --- src/compiler/dmd/lifetime.d | 50 +++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/src/compiler/dmd/lifetime.d b/src/compiler/dmd/lifetime.d index 55861b06a2..e5ef60f6b9 100644 --- a/src/compiler/dmd/lifetime.d +++ b/src/compiler/dmd/lifetime.d @@ -81,6 +81,15 @@ private } +/** + * + */ +extern (C) void* _d_allocmemory(size_t sz) +{ + return gc_malloc(sz); +} + + /** * */ @@ -397,16 +406,7 @@ struct Array /** - * - */ -void* _d_allocmemory(size_t nbytes) -{ - return gc_malloc(nbytes); -} - - -/** - * + * This function has been replaced by _d_delarray_t */ extern (C) void _d_delarray(Array *p) { @@ -422,6 +422,36 @@ 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; + } +} + + /** * */