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