On Monday, 16 February 2015 at 19:12:45 UTC, FG wrote:
Range violation is an Error, but never mind that. The real
question is: given all the work related to @nogc, wouldn't it
be better for such common Errors to be preallocated and only
have file and line updated when they are thrown?
@nogc already, because they simply cast
typeid(OutOfMemoryError).init or
typeid(InvalidMemoryOperationError).init:
extern (C) void onOutOfMemoryError(void* pretend_sideffect =
null) @trusted pure nothrow @nogc
extern (C) void onInvalidMemoryOperationError(void*
pretend_sideffect = null) @trusted pure nothrow @nogc
Could be made @nogc with one object of each kind preallocated:
extern (C) void onAssertError( string file = __FILE__, size_t
line = __LINE__ ) nothrow
extern (C) void onRangeError( string file = __FILE__, size_t
line = __LINE__ ) @safe pure nothrow
extern (C) void onSwitchError( string file = __FILE__, size_t
line = __LINE__ ) @safe pure nothrow
This could be a good idea for some types of exceptions. I
believe OutOfMemory is already pre-allocated (it has to be since
you can't allocate it once you are out of memory). The problem
with your suggestion is that if you allow the exception to be
updated with the line number/filename(it isn't immutable), then
you have to store it in TLS memory. That may be an acceptable
tradeoff, but you have to take that into consideration. Also if
you have a chain of exceptions you wouldn't be able to include
the same exception more then once in the chain.
The problem D has with exceptions and GC memory is complex and
will have different optimal solutions in different cases. In
some cases, it would be better for D to support non-GC heap
allocated exceptions. Maybe these types of exceptions could be
derived from another class so the user code will know that the
memory needs to be freed. There are also other ideas but my
point is we should make a plan about what solutions we think
would be good to implement and determine which ones we want to
tackle first.