Skip to content

Instantly share code, notes, and snippets.

@MartinNowak
Created December 5, 2011 03:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MartinNowak/1432117 to your computer and use it in GitHub Desktop.
Save MartinNowak/1432117 to your computer and use it in GitHub Desktop.
/**
*
*/
extern (C) void rt_finalize(void* p, bool det = true)
{
debug(PRINTF) printf("rt_finalize(p = %p)\n", p);
static void zeromem(void *dst, size_t size)
{
immutable n = size / size_t.sizeof;
size_t i;
for (; i < n; ++i)
(cast(size_t*)dst)[i] = 0;
for (i = size & ~(size_t.sizeof - 1); i < size; ++i)
(cast(ubyte*)dst)[i] = 0;
}
if (p) // not necessary if called from gc
{
ClassInfo* pc = *cast(ClassInfo**)p;
if (pc !is null)
{
try
{
if (det || collectHandler is null || collectHandler(cast(Object)p))
{
ClassInfo c = *pc;
do
{
if (c.destructor)
{
fp_t fp = cast(fp_t)c.destructor;
(*fp)(cast(Object)p); // call destructor
}
c = c.base;
} while (c);
}
if ((cast(void**)p)[1]) // if monitor is not null
_d_monitordelete(cast(Object)p, det);
zeromem(p, (*pc).init.length);
}
catch (Throwable e)
{
onFinalizeError(*pc, e);
}
// zero vptr
*cast(ClassInfo**)p = null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment