libphobos: Merge upstream phobos b538f758a

Fixes endian bugs in std.uni, and corrects unit-tests that failed on
version(BigEndian) targets.

Initial patch by Robin Dapp.

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

From-SVN: r270491
This commit is contained in:
Iain Buclaw 2019-04-22 13:46:25 +00:00
parent eb5f748a81
commit 105d4c85f3
5 changed files with 35 additions and 15 deletions

View File

@ -1,4 +1,4 @@
428460ddd8087fa28815e613ff04facb51108a7b b538f758a4d274b64751f80564b0207845cd018c
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.

View File

@ -207,9 +207,7 @@ version (unittest)
} }
catch (Throwable e) catch (Throwable e)
{ {
import core.stdc.stdlib : exit, EXIT_FAILURE; stderr.writeln(e); // Bugzilla 7018
stderr.writeln(e);
exit(EXIT_FAILURE); // Bugzilla 7018
} }
} }
} }

View File

@ -408,11 +408,17 @@ class OutBuffer
{ {
OutBuffer buf = new OutBuffer(); OutBuffer buf = new OutBuffer();
"hello"w.copy(buf); "hello"w.copy(buf);
assert(buf.toBytes() == "h\x00e\x00l\x00l\x00o\x00"); version (LittleEndian)
assert(buf.toBytes() == "h\x00e\x00l\x00l\x00o\x00");
version (BigEndian)
assert(buf.toBytes() == "\x00h\x00e\x00l\x00l\x00o");
} }
{ {
OutBuffer buf = new OutBuffer(); OutBuffer buf = new OutBuffer();
"hello"d.copy(buf); "hello"d.copy(buf);
assert(buf.toBytes() == "h\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00"); version (LittleEndian)
assert(buf.toBytes() == "h\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00");
version (BigEndian)
assert(buf.toBytes() == "\x00\x00\x00h\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o");
} }
} }

View File

@ -770,6 +770,8 @@ version (X86)
enum hasUnalignedReads = true; enum hasUnalignedReads = true;
else version (X86_64) else version (X86_64)
enum hasUnalignedReads = true; enum hasUnalignedReads = true;
else version (SystemZ)
enum hasUnalignedReads = true;
else else
enum hasUnalignedReads = false; // better be safe then sorry enum hasUnalignedReads = false; // better be safe then sorry
@ -1245,8 +1247,13 @@ pure nothrow:
T opIndex(size_t idx) inout T opIndex(size_t idx) inout
{ {
return __ctfe ? simpleIndex(idx) : T ret;
cast(inout(T))(cast(U*) origin)[idx]; version (LittleEndian)
ret = __ctfe ? simpleIndex(idx) :
cast(inout(T))(cast(U*) origin)[idx];
else
ret = simpleIndex(idx);
return ret;
} }
static if (isBitPacked!T) // lack of user-defined implicit conversion static if (isBitPacked!T) // lack of user-defined implicit conversion
@ -1259,10 +1266,15 @@ pure nothrow:
void opIndexAssign(TypeOfBitPacked!T val, size_t idx) void opIndexAssign(TypeOfBitPacked!T val, size_t idx)
{ {
if (__ctfe) version (LittleEndian)
simpleWrite(val, idx); {
if (__ctfe)
simpleWrite(val, idx);
else
(cast(U*) origin)[idx] = cast(U) val;
}
else else
(cast(U*) origin)[idx] = cast(U) val; simpleWrite(val, idx);
} }
} }
else else

View File

@ -2201,8 +2201,10 @@ private
mixin Check!("Chars"); mixin Check!("Chars");
dchar c; dchar c;
int n = -1; ptrdiff_t n = -1;
foreach (int i,dchar d; s) // 'i' must not be smaller than size_t because size_t is used internally in
// aApply.d and it will be cast e.g to (int *) which fails on BigEndian targets.
foreach (size_t i, dchar d; s)
{ {
if (!isChar(d)) if (!isChar(d))
{ {
@ -2238,8 +2240,10 @@ private
mixin Check!("Name"); mixin Check!("Name");
if (s.length == 0) fail(); if (s.length == 0) fail();
int n; ptrdiff_t n;
foreach (int i,dchar c;s) // 'i' must not be smaller than size_t because size_t is used internally in
// aApply.d and it will be cast e.g to (int *) which fails on BigEndian targets.
foreach (size_t i, dchar c; s)
{ {
if (c == '_' || c == ':' || isLetter(c)) continue; if (c == '_' || c == ':' || isLetter(c)) continue;
if (i == 0) fail(); if (i == 0) fail();