Commit 105d4c85 by Iain Buclaw

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
parent eb5f748a
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.
...@@ -207,9 +207,7 @@ version (unittest) ...@@ -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
} }
} }
} }
......
...@@ -408,11 +408,17 @@ class OutBuffer ...@@ -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");
} }
} }
...@@ -770,6 +770,8 @@ version (X86) ...@@ -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: ...@@ -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: ...@@ -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
......
...@@ -2201,8 +2201,10 @@ private ...@@ -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 ...@@ -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();
......
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