This repository was archived by the owner on Oct 12, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 409
Expand file tree
/
Copy pathabort.d
More file actions
51 lines (47 loc) · 1.61 KB
/
abort.d
File metadata and controls
51 lines (47 loc) · 1.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
module core.internal.abort;
/*
* Use instead of assert(0, msg), since this does not print a message for -release compiled
* code, and druntime is -release compiled.
*/
void abort(string msg, string filename = __FILE__, size_t line = __LINE__) @nogc nothrow @safe
{
abort(filename, line, msg);
}
void abort(string filename, size_t line, const(char)[][] msgs...) @nogc nothrow @safe
{
import core.stdc.stdlib: c_abort = abort;
// use available OS system calls to print the message to stderr
version(Posix)
{
import core.sys.posix.unistd: write;
static void writeStr(const(char)[][] m...) @nogc nothrow @trusted
{
foreach(s; m)
write(2, s.ptr, s.length);
}
}
else version(Windows)
{
import core.sys.windows.windows: GetStdHandle, STD_ERROR_HANDLE, WriteFile, INVALID_HANDLE_VALUE;
auto h = (() @trusted => GetStdHandle(STD_ERROR_HANDLE))();
if(h == INVALID_HANDLE_VALUE)
// attempt best we can to print the message
assert(0, msgs[0]);
void writeStr(const(char)[][] m...) @nogc nothrow @trusted
{
foreach(s; m)
{
assert(s.length <= uint.max);
WriteFile(h, s.ptr, cast(uint)s.length, null, null);
}
}
}
else
static assert(0, "Unsupported OS");
import core.internal.string;
UnsignedStringBuf strbuff;
// write an appropriate message, then abort the program
writeStr("Aborting from ", filename, "(", line.unsignedToTempString(strbuff, 10), "): ");
writeStr(msgs);
c_abort();
}