On Mon, Oct 28, 2013 at 12:08 AM, Iain Buclaw <ibuc...@ubuntu.com> wrote:
> On 27 October 2013 23:43, Timothee Cour <thelastmamm...@gmail.com> wrote: > > ideal syntax would be something along those lines: > > > > try{...} > > catch(SomeThrowableType e, &callback_before_unwinding){...} > > with callback_before_unwinding of type 'void function(Throwable t)' > > > > The semantics of which is: > > if 'e' is about to be caught in this particular catch block, call > > callback_before_unwinding(e) _before_ unwinding stack and entering catch > > block. > > > > Advantages are: > > * it allows one to, for example, attach a debugger before stack unwinds > and > > entering this catch block > > * the debugger is only attached at that point, hence not making the > regular > > program slower > > * it doesn't affect other catch blocks nor does it affect how > > exceptions/errors are thrown > > * it could even allow one to make speed up exception handling, by > computing > > backtrace _only_ inside this callback_before_unwinding, so that usual > > exceptions (std.conv conversions etc) can be caught without any backtrace > > inside the main program while unusual unintended exceptions would be > caught > > at the root and show proper stack trace. > > > > This saves a lot of time when debugging issues, at _zero_ cost in > > performance. > > > > Does libunwind allow that? Otherwise could it be adapted to do that? > > > > GDB has 'catch throw' and 'catch catch' as convenient C++ breakpoint > placeholders in the debugger. Can certainly implement them for D too. > > http://www.delorie.com/gnu/docs/gdb/gdb_31.html > > I'm worried about that from performance standpoint: * that implies running the normal program execution while attached to a debugger, which would be slower * catch throw will stop at every thrown exception as opposed to the ones that are caught at a certain 'root' point. In what I suggested (and implemented for dmd), it has 0 performance penalty and only triggers when a thrown exception is caught in a particular location; debugger isn't attached during normal program execution. > -- > Iain Buclaw > > *(p < e ? p++ : p) = (c & 0x0f) + '0'; >