libphobos: Merge upstream druntime 5cc061a8, phobos 64ed4684f

- core.cpuid has been fixed to not use i7 detection on AMD processors.
- std.net.curl has been fixed to correctly handle HTTP/2 status lines.
- std.zip has had a test fixed to not rely on unzip being installed.

Fixes: PR d/95166
       PR d/95167
       PR d/95168

Reviewed-on: https://github.com/dlang/druntime/pull/3107
	     https://github.com/dlang/phobos/pull/7486
This commit is contained in:
Iain Buclaw 2020-05-17 18:49:19 +02:00
parent cc558e2801
commit e977a5df5b
5 changed files with 56 additions and 16 deletions

View File

@ -1,4 +1,4 @@
7bdd83d7b4bd9fd4cb9ffca0d50babc90b31bfd6 5cc061a8733731d5b40334c0eb7a927b6d6241ce
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/druntime repository. merge done from the dlang/druntime repository.

View File

@ -941,13 +941,27 @@ void cpuidX86()
datacache[0].lineSize = 32; datacache[0].lineSize = 32;
} }
} }
if (max_cpuid >= 0x0B) { if (cf.probablyIntel && max_cpuid >= 0x0B) {
// For Intel i7 and later, use function 0x0B to determine // For Intel i7 and later, use function 0x0B to determine
// cores and hyperthreads. // cores and hyperthreads.
getCpuInfo0B(); getCpuInfo0B();
} else { } else {
if (hyperThreadingBit) cf.maxThreads = (apic>>>16) & 0xFF; if (hyperThreadingBit) cf.maxThreads = (apic>>>16) & 0xFF;
else cf.maxThreads = cf.maxCores; else cf.maxThreads = cf.maxCores;
if (cf.probablyAMD && max_extended_cpuid >= 0x8000_001E) {
version (GNU) asm pure nothrow @nogc {
"cpuid" : "=a" (a), "=b" (b) : "a" (0x8000_001E) : "ecx", "edx";
} else {
asm pure nothrow @nogc {
mov EAX, 0x8000_001e;
cpuid;
mov b, EBX;
}
}
ubyte coresPerComputeUnit = ((b >> 8) & 3) + 1;
cf.maxCores = cf.maxThreads / coresPerComputeUnit;
}
} }
} }
@ -975,7 +989,7 @@ bool hasCPUID()
xor {(%%esp), %%eax|eax, [esp]} xor {(%%esp), %%eax|eax, [esp]}
# eax = whichever bits were changed # eax = whichever bits were changed
popf{l|d} # Restore original EFLAGS popf{l|d} # Restore original EFLAGS
" : "=a" flags; " : "=a" (flags);
} }
} }
else version (D_InlineAsm_X86) else version (D_InlineAsm_X86)

View File

@ -1,4 +1,4 @@
bf0d0a37c4c2d8762ceff7d8677e7584b770800f 64ed4684fa2a0f2401f5b6df34f6dcb4c3973945
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

@ -2451,7 +2451,6 @@ struct HTTP
in char[] value) callback) in char[] value) callback)
{ {
import std.algorithm.searching : startsWith; import std.algorithm.searching : startsWith;
import std.conv : to;
import std.regex : regex, match; import std.regex : regex, match;
import std.uni : toLower; import std.uni : toLower;
@ -2471,18 +2470,8 @@ struct HTTP
if (header.startsWith("HTTP/")) if (header.startsWith("HTTP/"))
{ {
headersIn.clear(); headersIn.clear();
if (parseStatusLine(header, status))
const m = match(header, regex(r"^HTTP/(\d+)\.(\d+) (\d+) (.*)$"));
if (m.empty)
{ {
// Invalid status line
}
else
{
status.majorVersion = to!ushort(m.captures[1]);
status.minorVersion = to!ushort(m.captures[2]);
status.code = to!ushort(m.captures[3]);
status.reason = m.captures[4].idup;
if (onReceiveStatusLine != null) if (onReceiveStatusLine != null)
onReceiveStatusLine(status); onReceiveStatusLine(status);
} }
@ -2517,6 +2506,37 @@ struct HTTP
private RefCounted!Impl p; private RefCounted!Impl p;
/// Parse status line, as received from / generated by cURL.
private static bool parseStatusLine(in char[] header, out StatusLine status) @safe
{
import std.conv : to;
import std.regex : regex, match;
const m = match(header, regex(r"^HTTP/(\d+)(?:\.(\d+))? (\d+)(?: (.*))?$"));
if (m.empty)
return false; // Invalid status line
else
{
status.majorVersion = to!ushort(m.captures[1]);
status.minorVersion = m.captures[2].length ? to!ushort(m.captures[2]) : 0;
status.code = to!ushort(m.captures[3]);
status.reason = m.captures[4].idup;
return true;
}
}
@safe unittest
{
StatusLine status;
assert(parseStatusLine("HTTP/1.1 200 OK", status)
&& status == StatusLine(1, 1, 200, "OK"));
assert(parseStatusLine("HTTP/1.0 304 Not Modified", status)
&& status == StatusLine(1, 0, 304, "Not Modified"));
// The HTTP2 protocol is binary; cURL generates this fake text header.
assert(parseStatusLine("HTTP/2 200", status)
&& status == StatusLine(2, 0, 200, null));
}
/** Time condition enumeration as an alias of $(REF CurlTimeCond, etc,c,curl) /** Time condition enumeration as an alias of $(REF CurlTimeCond, etc,c,curl)
$(HTTP www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25, _RFC2616 Section 14.25) $(HTTP www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25, _RFC2616 Section 14.25)

View File

@ -970,6 +970,12 @@ version (Posix) @system unittest
{ {
import std.datetime, std.file, std.format, std.path, std.process, std.stdio; import std.datetime, std.file, std.format, std.path, std.process, std.stdio;
if (executeShell("unzip").status != 0)
{
writeln("Can't run unzip, skipping unzip test");
return;
}
auto zr = new ZipArchive(); auto zr = new ZipArchive();
auto am = new ArchiveMember(); auto am = new ArchiveMember();
am.compressionMethod = CompressionMethod.deflate; am.compressionMethod = CompressionMethod.deflate;