This repository has been archived by the owner on Oct 12, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 422
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix issue 14870 - Add new "abort" internal module and function, which…
… will always print a message to stderr, even in release mode. This can be used to replace assert(0, msg) which does not print the message.
- Loading branch information
Showing
9 changed files
with
254 additions
and
121 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| 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 | ||
| { | ||
| 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, msg); | ||
| 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), ") ", msg); | ||
| c_abort(); | ||
| } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.