Allow calling of original druntime functions within 'hooked' functions

Marenz via Digitalmars-d digitalmars-d at puremagic.com
Fri Sep 25 03:44:19 PDT 2015


According to http://wiki.dlang.org/Runtime_Hooks you can hook a 
bunch of functions of the druntime to provide different behavior.

I am using that to have (from my perspective) sane behavior on 
asserts, e.g.:


extern(C) void abort();

extern(C) void _d_assert_msg(string msg, string file, uint line)
{
     abort();
}

extern(C) void _d_assert(string file, uint line)
{
     abort();
}

extern(C)void _d_assertm(ModuleInfo* m, uint line)
{
     abort();
}



Now, with the concept of Errors which are more or less on the 
same level as asserts regarding severity, I'd like to have the 
same behavior.

In my specific case, a RangeError is thrown.
There is a function listed on the earlier link that sounds like 
it does what i want:

extern (C) void onRangeError(string file, size_t line)
{
     abort();
}

However, this has no effect.

One solution I saw was to override _d_throwc, check whether the 
object being thrown is a child of Error and if so, abort(); else 
call the original _d_throwc.

But the problem is, there is no way I can call the original 
_d_throwc now that I overrode it.

The overrideable assert functions are implemented like

     void _d_assert(string file, uint line)
     {
         onAssertError(file, line);
     }

so the actual implementation is one function call further.
Doing the same for _d_throwc would allow me to implement the 
desired behavior for me. E.g. have


extern (C) void onThrow(Object *h)
{
     // Original implementation
}

extern (C) void _d_throwc(Object *h)
{
     onThrow(h);
}

In the druntime.

Opinions?


More information about the Digitalmars-d mailing list