mirror of
https://github.com/autc04/Retro68.git
synced 2025-01-02 17:31:35 +00:00
65 lines
2.5 KiB
D
65 lines
2.5 KiB
D
/**
|
|
* Entry point for exception handling support routines.
|
|
*
|
|
* There are three style of exception handling being supported by DMD:
|
|
* DWARF, Win32, and Win64. The Win64 code also supports POSIX.
|
|
* Support for those scheme is in `rt.dwarfeh`, `rt.deh_win32`, and
|
|
* `rt.deh_win64_posix`, respectively, and publicly imported here.
|
|
*
|
|
* When an exception is thrown by the user, the compiler translates
|
|
* code like `throw e;` into either `_d_throwdwarf` (for DWARF exceptions)
|
|
* or `_d_throwc` (Win32 / Win64), with the `Exception` object as argument.
|
|
*
|
|
* During those functions' handling, they eventually call `_d_createTrace`,
|
|
* which will store inside the `Exception` object the return of
|
|
* `_d_traceContext`, which is an object implementing `Throwable.TraceInfo`.
|
|
* `_d_traceContext` is a configurable hook, and by default will call
|
|
* `core.runtime : defaultTraceHandler`, which itself will call `backtrace`
|
|
* or something similar to store an array of stack frames (`void*` pointers)
|
|
* in the object it returns.
|
|
* Note that `defaultTraceHandler` returns a GC-allocated instance,
|
|
* hence a GC allocation can happen in the middle of throwing an `Exception`.
|
|
*
|
|
* The `Throwable.TraceInfo`-implementing should not resolves function names,
|
|
* file and line number until its `opApply` function is called, avoiding the
|
|
* overhead of reading the debug infos until the user call `toString`.
|
|
* If the user only calls `Throwable.message` (or use `Throwable.msg` directly),
|
|
* only the overhead of `backtrace` will be paid, which is minimal enouh.
|
|
*
|
|
* Copyright: Copyright Digital Mars 1999 - 2020.
|
|
* License: Distributed under the
|
|
* $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
|
|
* (See accompanying file LICENSE)
|
|
* Authors: Walter Bright
|
|
* Source: $(DRUNTIMESRC rt/deh.d)
|
|
*/
|
|
|
|
/* NOTE: This file has been patched from the original DMD distribution to
|
|
* work with the GDC compiler.
|
|
*/
|
|
module rt.deh;
|
|
|
|
extern (C)
|
|
{
|
|
Throwable.TraceInfo _d_traceContext(void* ptr = null);
|
|
void _d_createTrace(Throwable t, void* context)
|
|
{
|
|
if (t !is null && t.info is null &&
|
|
cast(byte*) t !is typeid(t).initializer.ptr)
|
|
{
|
|
t.info = _d_traceContext(context);
|
|
}
|
|
}
|
|
}
|
|
|
|
version (GNU)
|
|
public import gcc.deh;
|
|
else version (Win32)
|
|
public import rt.deh_win32;
|
|
else version (Win64)
|
|
public import rt.deh_win64_posix;
|
|
else version (Posix)
|
|
public import rt.deh_win64_posix;
|
|
else
|
|
static assert (0, "Unsupported architecture");
|