Hi,
This patch merges the D standard library with upstream phobos 35977c802.
Synchronizes recent bug fixes targeted for v2.111.1.
Bootstrapped and regression tested on x86_64-linux-gnu/-m32, and
committed to mainline.
Regards,
Iain.
---
libphobos/ChangeLog:
* src/MERGE: Merge upstream phobos 35977c802.
* src/Makefile.am (PHOBOS_DSOURCES): Add
std/internal/windows/bcrypt.d.
* src/Makefile.in: Regenerate.
---
libphobos/src/MERGE | 2 +-
libphobos/src/Makefile.am | 17 +++---
libphobos/src/Makefile.in | 19 +++---
libphobos/src/std/file.d | 4 +-
libphobos/src/std/internal/windows/bcrypt.d | 65 +++++++++++++++++++++
libphobos/src/std/random.d | 18 +-----
6 files changed, 89 insertions(+), 36 deletions(-)
create mode 100644 libphobos/src/std/internal/windows/bcrypt.d
diff --git a/libphobos/src/MERGE b/libphobos/src/MERGE
index 3dfe0087791..d870a91ba96 100644
--- a/libphobos/src/MERGE
+++ b/libphobos/src/MERGE
@@ -1,4 +1,4 @@
-60034b56e2a036a66fa78cbc0ec0290956423684
+35977c8029e7bb4dbe1b887688dabebe04ebea02
The first line of this file holds the git revision number of the last
merge done from the dlang/phobos repository.
diff --git a/libphobos/src/Makefile.am b/libphobos/src/Makefile.am
index 94e28f3d175..5d690dddf2b 100644
--- a/libphobos/src/Makefile.am
+++ b/libphobos/src/Makefile.am
@@ -144,14 +144,15 @@ PHOBOS_DSOURCES = etc/c/curl.d etc/c/odbc/odbc32.d
etc/c/odbc/odbc64.d \
std/internal/unicode_comp.d std/internal/unicode_decomp.d \
std/internal/unicode_grapheme.d std/internal/unicode_norm.d \
std/internal/unicode_tables.d std/internal/windows/advapi32.d \
- std/json.d std/logger/core.d std/logger/filelogger.d \
- std/logger/multilogger.d std/logger/nulllogger.d std/logger/package.d \
- std/math/algebraic.d std/math/constants.d std/math/exponential.d \
- std/math/hardware.d std/math/operations.d std/math/package.d \
- std/math/remainder.d std/math/rounding.d std/math/traits.d \
- std/math/trigonometry.d std/mathspecial.d std/meta.d std/mmfile.d \
- std/net/curl.d std/net/isemail.d std/numeric.d std/outbuffer.d \
- std/package.d std/parallelism.d std/path.d std/process.d std/random.d \
+ std/internal/windows/bcrypt.d std/json.d std/logger/core.d \
+ std/logger/filelogger.d std/logger/multilogger.d \
+ std/logger/nulllogger.d std/logger/package.d std/math/algebraic.d \
+ std/math/constants.d std/math/exponential.d std/math/hardware.d \
+ std/math/operations.d std/math/package.d std/math/remainder.d \
+ std/math/rounding.d std/math/traits.d std/math/trigonometry.d \
+ std/mathspecial.d std/meta.d std/mmfile.d std/net/curl.d \
+ std/net/isemail.d std/numeric.d std/outbuffer.d std/package.d \
+ std/parallelism.d std/path.d std/process.d std/random.d \
std/range/interfaces.d std/range/package.d std/range/primitives.d \
std/regex/internal/backtracking.d std/regex/internal/generator.d \
std/regex/internal/ir.d std/regex/internal/kickstart.d \
diff --git a/libphobos/src/Makefile.in b/libphobos/src/Makefile.in
index d052aa805c2..2bf7e3f2874 100644
--- a/libphobos/src/Makefile.in
+++ b/libphobos/src/Makefile.in
@@ -252,6 +252,7 @@ am__dirstamp = $(am__leading_dot)dirstamp
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_norm.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_tables.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/windows/advapi32.lo \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/windows/bcrypt.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/json.lo std/logger/core.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/filelogger.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/multilogger.lo \
@@ -612,14 +613,15 @@ libgphobos_la_LINK = $(LIBTOOL) --tag=D
$(libgphobos_la_LIBTOOLFLAGS) \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_comp.d
std/internal/unicode_decomp.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_grapheme.d
std/internal/unicode_norm.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_tables.d
std/internal/windows/advapi32.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/json.d std/logger/core.d
std/logger/filelogger.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/multilogger.d
std/logger/nulllogger.d std/logger/package.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/algebraic.d
std/math/constants.d std/math/exponential.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/hardware.d
std/math/operations.d std/math/package.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/remainder.d
std/math/rounding.d std/math/traits.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/trigonometry.d
std/mathspecial.d std/meta.d std/mmfile.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/net/curl.d std/net/isemail.d
std/numeric.d std/outbuffer.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/package.d std/parallelism.d
std/path.d std/process.d std/random.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/windows/bcrypt.d
std/json.d std/logger/core.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/filelogger.d
std/logger/multilogger.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/nulllogger.d
std/logger/package.d std/math/algebraic.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/constants.d
std/math/exponential.d std/math/hardware.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/operations.d
std/math/package.d std/math/remainder.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/rounding.d std/math/traits.d
std/math/trigonometry.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/mathspecial.d std/meta.d
std/mmfile.d std/net/curl.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/net/isemail.d std/numeric.d
std/outbuffer.d std/package.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/parallelism.d std/path.d
std/process.d std/random.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/range/interfaces.d
std/range/package.d std/range/primitives.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/regex/internal/backtracking.d
std/regex/internal/generator.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/regex/internal/ir.d
std/regex/internal/kickstart.d \
@@ -901,6 +903,7 @@ std/internal/windows/$(am__dirstamp):
@: > std/internal/windows/$(am__dirstamp)
std/internal/windows/advapi32.lo: \
std/internal/windows/$(am__dirstamp)
+std/internal/windows/bcrypt.lo: std/internal/windows/$(am__dirstamp)
std/json.lo: std/$(am__dirstamp)
std/logger/$(am__dirstamp):
@$(MKDIR_P) std/logger
diff --git a/libphobos/src/std/file.d b/libphobos/src/std/file.d
index c3466acc055..0b8da501d3f 100644
--- a/libphobos/src/std/file.d
+++ b/libphobos/src/std/file.d
@@ -983,10 +983,10 @@ private void renameImpl(scope const(char)[] f, scope
const(char)[] t,
import std.conv : to, text;
if (!f)
- f = to!(typeof(f))(fromz[0 .. wcslen(fromz)]);
+ f = fromz ? to!(typeof(f))(fromz[0 .. wcslen(fromz)]) :
"(null)";
if (!t)
- t = to!(typeof(t))(toz[0 .. wcslen(toz)]);
+ t = toz ? to!(typeof(t))(toz[0 .. wcslen(toz)]) : "(null)";
enforce(false,
new FileException(
diff --git a/libphobos/src/std/internal/windows/bcrypt.d
b/libphobos/src/std/internal/windows/bcrypt.d
new file mode 100644
index 00000000000..239dcd52e66
--- /dev/null
+++ b/libphobos/src/std/internal/windows/bcrypt.d
@@ -0,0 +1,65 @@
+module std.internal.windows.bcrypt;
+
+version (Windows):
+
+import core.sys.windows.bcrypt : BCryptGenRandom,
BCRYPT_USE_SYSTEM_PREFERRED_RNG;
+import core.sys.windows.windef : HMODULE, PUCHAR, ULONG;
+import core.sys.windows.ntdef : NT_SUCCESS;
+
+pragma(lib, "Bcrypt.lib");
+
+package(std) bool bcryptGenRandom(T)(out T result) @trusted
+{
+ loadBcrypt();
+
+ const gotRandom = ptrBCryptGenRandom(
+ null,
+ cast(PUCHAR) &result,
+ ULONG(T.sizeof),
+ BCRYPT_USE_SYSTEM_PREFERRED_RNG,
+ );
+
+ return NT_SUCCESS(gotRandom);
+}
+
+private
+{
+ HMODULE hBcrypt = null;
+ typeof(BCryptGenRandom)* ptrBCryptGenRandom;
+}
+
+private void loadBcrypt() @nogc nothrow
+{
+ import core.sys.windows.winbase : GetProcAddress, LoadLibraryA;
+
+ if (!hBcrypt)
+ {
+ hBcrypt = LoadLibraryA("Bcrypt.dll");
+ if (!hBcrypt)
+ assert(false, `LoadLibraryA("Bcrypt.dll") failed.`); // `@nogc`
+
+ ptrBCryptGenRandom = cast(typeof(ptrBCryptGenRandom))
GetProcAddress(hBcrypt , "BCryptGenRandom");
+ if (!ptrBCryptGenRandom)
+ assert(false, `GetProcAddress(hBcrypt , "BCryptGenRandom")
failed.`); // `@nogc`
+ }
+}
+
+// Will free `Bcrypt.dll`.
+private void freeBcrypt() @nogc nothrow
+{
+ import core.sys.windows.winbase : FreeLibrary;
+
+ if (hBcrypt)
+ {
+ if (!FreeLibrary(hBcrypt))
+ assert(false, `FreeLibrary("Bcrypt.dll") failed.`); // `@nogc`
+
+ hBcrypt = null;
+ ptrBCryptGenRandom = null;
+ }
+}
+
+static ~this()
+{
+ freeBcrypt();
+}
diff --git a/libphobos/src/std/random.d b/libphobos/src/std/random.d
index fb4e5469088..dc1763cf71c 100644
--- a/libphobos/src/std/random.d
+++ b/libphobos/src/std/random.d
@@ -1792,23 +1792,7 @@ version (linux)
version (Windows)
{
- pragma(lib, "Bcrypt.lib");
-
- private bool bcryptGenRandom(T)(out T result) @trusted
- {
- import core.sys.windows.windef : PUCHAR, ULONG;
- import core.sys.windows.ntdef : NT_SUCCESS;
- import core.sys.windows.bcrypt : BCryptGenRandom,
BCRYPT_USE_SYSTEM_PREFERRED_RNG;
-
- const gotRandom = BCryptGenRandom(
- null,
- cast(PUCHAR) &result,
- ULONG(T.sizeof),
- BCRYPT_USE_SYSTEM_PREFERRED_RNG,
- );
-
- return NT_SUCCESS(gotRandom);
- }
+ import std.internal.windows.bcrypt : bcryptGenRandom;
}
/**
--
2.43.0