Commit c8bf6646 by Iain Buclaw

libphobos: Merge upstream phobos cf95639ff

Backports ports committed to upstream phobos since the last sync.

Reviewed-on: https://github.com/dlang/phobos/pull/6947

From-SVN: r270296
parent 9607e404
ef07932811de50a1d5810ea23462d127a60574a6 cf95639ffd9ed6f3b9d10d98461b2fbd31615757
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/phobos repository. merge done from the dlang/phobos repository.
...@@ -214,6 +214,22 @@ public: ...@@ -214,6 +214,22 @@ public:
hnsecsToUnixEpoch; hnsecsToUnixEpoch;
} }
} }
else version (DragonFlyBSD)
{
import core.sys.dragonflybsd.time : clock_gettime, CLOCK_REALTIME,
CLOCK_REALTIME_FAST, CLOCK_REALTIME_PRECISE, CLOCK_SECOND;
static if (clockType == ClockType.coarse) alias clockArg = CLOCK_REALTIME_FAST;
else static if (clockType == ClockType.normal) alias clockArg = CLOCK_REALTIME;
else static if (clockType == ClockType.precise) alias clockArg = CLOCK_REALTIME_PRECISE;
else static if (clockType == ClockType.second) alias clockArg = CLOCK_SECOND;
else static assert(0, "Previous static if is wrong.");
timespec ts;
if (clock_gettime(clockArg, &ts) != 0)
throw new TimeException("Call to clock_gettime() failed");
return convert!("seconds", "hnsecs")(ts.tv_sec) +
ts.tv_nsec / 100 +
hnsecsToUnixEpoch;
}
else version (Solaris) else version (Solaris)
{ {
static if (clockType == ClockType.second) static if (clockType == ClockType.second)
......
...@@ -292,10 +292,12 @@ public: ...@@ -292,10 +292,12 @@ public:
version (Posix) version (Posix)
{ {
version (FreeBSD) enum utcZone = "Etc/UTC"; version (FreeBSD) enum utcZone = "Etc/UTC";
else version (NetBSD) enum utcZone = "UTC"; else version (NetBSD) enum utcZone = "UTC";
else version (linux) enum utcZone = "UTC"; else version (DragonFlyBSD) enum utcZone = "UTC";
else version (OSX) enum utcZone = "UTC"; else version (linux) enum utcZone = "UTC";
else version (OSX) enum utcZone = "UTC";
else version (Solaris) enum utcZone = "UTC";
else static assert(0, "The location of the UTC timezone file on this Posix platform must be set."); else static assert(0, "The location of the UTC timezone file on this Posix platform must be set.");
auto tzs = [testTZ("America/Los_Angeles", "PST", "PDT", dur!"hours"(-8), dur!"hours"(1)), auto tzs = [testTZ("America/Los_Angeles", "PST", "PDT", dur!"hours"(-8), dur!"hours"(1)),
...@@ -1891,6 +1893,14 @@ public: ...@@ -1891,6 +1893,14 @@ public:
// Android concatenates all time zone data into a single file and stores it here. // Android concatenates all time zone data into a single file and stores it here.
enum defaultTZDatabaseDir = "/system/usr/share/zoneinfo/"; enum defaultTZDatabaseDir = "/system/usr/share/zoneinfo/";
} }
else version (Solaris)
{
/++
The default directory where the TZ Database files are. It's empty
for Windows, since Windows doesn't have them.
+/
enum defaultTZDatabaseDir = "/usr/share/lib/zoneinfo/";
}
else version (Posix) else version (Posix)
{ {
/++ /++
......
...@@ -392,6 +392,8 @@ struct InSituRegion(size_t size, size_t minAlign = platformAlignment) ...@@ -392,6 +392,8 @@ struct InSituRegion(size_t size, size_t minAlign = platformAlignment)
else version (PPC64) enum growDownwards = Yes.growDownwards; else version (PPC64) enum growDownwards = Yes.growDownwards;
else version (MIPS32) enum growDownwards = Yes.growDownwards; else version (MIPS32) enum growDownwards = Yes.growDownwards;
else version (MIPS64) enum growDownwards = Yes.growDownwards; else version (MIPS64) enum growDownwards = Yes.growDownwards;
else version (RISCV32) enum growDownwards = Yes.growDownwards;
else version (RISCV64) enum growDownwards = Yes.growDownwards;
else version (SPARC) enum growDownwards = Yes.growDownwards; else version (SPARC) enum growDownwards = Yes.growDownwards;
else version (SystemZ) enum growDownwards = Yes.growDownwards; else version (SystemZ) enum growDownwards = Yes.growDownwards;
else static assert(0, "Dunno how the stack grows on this architecture."); else static assert(0, "Dunno how the stack grows on this architecture.");
......
...@@ -1488,6 +1488,7 @@ if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R)) ...@@ -1488,6 +1488,7 @@ if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R))
// - OS X, where the native filesystem (HFS+) stores filesystem // - OS X, where the native filesystem (HFS+) stores filesystem
// timestamps with 1-second precision. // timestamps with 1-second precision.
version (FreeBSD) {} else version (FreeBSD) {} else
version (DragonFlyBSD) {} else
version (OSX) {} else version (OSX) {} else
@system unittest @system unittest
{ {
...@@ -2779,6 +2780,10 @@ else version (NetBSD) ...@@ -2779,6 +2780,10 @@ else version (NetBSD)
{ {
return readLink("/proc/self/exe"); return readLink("/proc/self/exe");
} }
else version (DragonFlyBSD)
{
return readLink("/proc/curproc/file");
}
else version (Solaris) else version (Solaris)
{ {
import core.sys.posix.unistd : getpid; import core.sys.posix.unistd : getpid;
...@@ -3092,8 +3097,12 @@ else version (Posix) ...@@ -3092,8 +3097,12 @@ else version (Posix)
{ {
import std.path : buildPath; import std.path : buildPath;
immutable len = core.stdc.string.strlen(fd.d_name.ptr); static if (is(typeof(fd.d_namlen)))
_name = buildPath(path, fd.d_name[0 .. len]); immutable len = fd.d_namlen;
else
immutable len = (() @trusted => core.stdc.string.strlen(fd.d_name.ptr))();
_name = buildPath(path, (() @trusted => fd.d_name.ptr[0 .. len])());
_didLStat = false; _didLStat = false;
_didStat = false; _didStat = false;
......
...@@ -131,17 +131,20 @@ if (isSomeChar!To && (isInputRange!From || isSomeString!From) && ...@@ -131,17 +131,20 @@ if (isSomeChar!To && (isInputRange!From || isSomeString!From) &&
private: private:
To* _ptr; To* _ptr;
size_t _length; // length of the string size_t _length; // length of the string
// the 'small string optimization'
version (unittest) version (unittest)
{ {
enum buffLength = 16 / To.sizeof; // smaller size to trigger reallocations // smaller size to trigger reallocations. Padding is to account for
// unittest/non-unittest cross-compilation (to avoid corruption)
To[16 / To.sizeof] _buff;
To[(256 - 16) / To.sizeof] _unittest_pad;
} }
else else
{ {
enum buffLength = 256 / To.sizeof; // production size To[256 / To.sizeof] _buff; // production size
} }
To[buffLength] _buff; // the 'small string optimization'
static Res trustedVoidInit() { Res res = void; return res; } static Res trustedVoidInit() { Res res = void; return res; }
} }
......
...@@ -162,6 +162,8 @@ version (AArch64) version = ARM_Any; ...@@ -162,6 +162,8 @@ version (AArch64) version = ARM_Any;
version (ARM) version = ARM_Any; version (ARM) version = ARM_Any;
version (SPARC) version = SPARC_Any; version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any; version (SPARC64) version = SPARC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (D_InlineAsm_X86) version (D_InlineAsm_X86)
{ {
...@@ -4683,6 +4685,7 @@ private: ...@@ -4683,6 +4685,7 @@ private:
// The Pentium SSE2 status register is 32 bits. // The Pentium SSE2 status register is 32 bits.
// The ARM and PowerPC FPSCR is a 32-bit register. // The ARM and PowerPC FPSCR is a 32-bit register.
// The SPARC FSR is a 32bit register (64 bits for SPARC 7 & 8, but high bits are uninteresting). // The SPARC FSR is a 32bit register (64 bits for SPARC 7 & 8, but high bits are uninteresting).
// The RISC-V (32 & 64 bit) fcsr is 32-bit register.
uint flags; uint flags;
version (CRuntime_Microsoft) version (CRuntime_Microsoft)
...@@ -4987,6 +4990,10 @@ else version (PPC_Any) ...@@ -4987,6 +4990,10 @@ else version (PPC_Any)
{ {
version = IeeeFlagsSupport; version = IeeeFlagsSupport;
} }
else version (RISCV_Any)
{
version = IeeeFlagsSupport;
}
else version (MIPS_Any) else version (MIPS_Any)
{ {
version = IeeeFlagsSupport; version = IeeeFlagsSupport;
...@@ -5226,6 +5233,21 @@ struct FloatingPointControl ...@@ -5226,6 +5233,21 @@ struct FloatingPointControl
| inexactException, | inexactException,
} }
} }
else version (RISCV_Any)
{
enum : ExceptionMask
{
inexactException = 0x01,
divByZeroException = 0x02,
underflowException = 0x04,
overflowException = 0x08,
invalidException = 0x10,
severeExceptions = overflowException | divByZeroException
| invalidException,
allExceptions = severeExceptions | underflowException
| inexactException,
}
}
else version (X86_Any) else version (X86_Any)
{ {
enum : ExceptionMask enum : ExceptionMask
...@@ -5338,6 +5360,10 @@ private: ...@@ -5338,6 +5360,10 @@ private:
{ {
alias ControlState = uint; alias ControlState = uint;
} }
else version (RISCV_Any)
{
alias ControlState = uint;
}
else version (X86_Any) else version (X86_Any)
{ {
alias ControlState = ushort; alias ControlState = ushort;
...@@ -7595,6 +7621,34 @@ private real polyImpl(real x, in real[] A) @trusted pure nothrow @nogc ...@@ -7595,6 +7621,34 @@ private real polyImpl(real x, in real[] A) @trusted pure nothrow @nogc
; ;
} }
} }
else version (DragonFlyBSD)
{
asm pure nothrow @nogc // assembler by W. Bright
{
// EDX = (A.length - 1) * real.sizeof
mov ECX,A[EBP] ; // ECX = A.length
dec ECX ;
lea EDX,[ECX*8] ;
lea EDX,[EDX][ECX*4] ;
add EDX,A+4[EBP] ;
fld real ptr [EDX] ; // ST0 = coeff[ECX]
jecxz return_ST ;
fld x[EBP] ; // ST0 = x
fxch ST(1) ; // ST1 = x, ST0 = r
align 4 ;
L2: fmul ST,ST(1) ; // r *= x
fld real ptr -12[EDX] ;
sub EDX,12 ; // deg--
faddp ST(1),ST ;
dec ECX ;
jne L2 ;
fxch ST(1) ; // ST1 = r, ST0 = x
fstp ST(0) ; // dump x
align 4 ;
return_ST: ;
;
}
}
else else
{ {
static assert(0); static assert(0);
......
...@@ -94,6 +94,10 @@ else version (FreeBSD) ...@@ -94,6 +94,10 @@ else version (FreeBSD)
{ {
version = useSysctlbyname; version = useSysctlbyname;
} }
else version (DragonFlyBSD)
{
version = useSysctlbyname;
}
else version (NetBSD) else version (NetBSD)
{ {
version = useSysctlbyname; version = useSysctlbyname;
...@@ -146,6 +150,10 @@ else version (useSysctlbyname) ...@@ -146,6 +150,10 @@ else version (useSysctlbyname)
{ {
auto nameStr = "hw.ncpu\0".ptr; auto nameStr = "hw.ncpu\0".ptr;
} }
else version (DragonFlyBSD)
{
auto nameStr = "hw.ncpu\0".ptr;
}
else version (NetBSD) else version (NetBSD)
{ {
auto nameStr = "hw.ncpu\0".ptr; auto nameStr = "hw.ncpu\0".ptr;
......
...@@ -3970,7 +3970,7 @@ string expandTilde(string inputPath) nothrow ...@@ -3970,7 +3970,7 @@ string expandTilde(string inputPath) nothrow
} }
if (errno != ERANGE && if (errno != ERANGE &&
// On FreeBSD and OSX, errno can be left at 0 instead of set to ERANGE // On BSD and OSX, errno can be left at 0 instead of set to ERANGE
errno != 0) errno != 0)
onOutOfMemoryError(); onOutOfMemoryError();
......
...@@ -187,6 +187,14 @@ string formatSocketError(int err) @trusted ...@@ -187,6 +187,14 @@ string formatSocketError(int err) @trusted
else else
return "Socket error " ~ to!string(err); return "Socket error " ~ to!string(err);
} }
else version (DragonFlyBSD)
{
auto errs = strerror_r(err, buf.ptr, buf.length);
if (errs == 0)
cs = buf.ptr;
else
return "Socket error " ~ to!string(err);
}
else version (Solaris) else version (Solaris)
{ {
auto errs = strerror_r(err, buf.ptr, buf.length); auto errs = strerror_r(err, buf.ptr, buf.length);
......
...@@ -63,6 +63,12 @@ version (NetBSD) ...@@ -63,6 +63,12 @@ version (NetBSD)
version = HAS_GETDELIM; version = HAS_GETDELIM;
} }
version (DragonFlyBSD)
{
version = GENERIC_IO;
version = HAS_GETDELIM;
}
version (Solaris) version (Solaris)
{ {
version = GENERIC_IO; version = GENERIC_IO;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment