<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[209399] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/209399">209399</a></dd>
<dt>Author</dt> <dd>darin@apple.com</dd>
<dt>Date</dt> <dd>2016-12-06 09:18:20 -0800 (Tue, 06 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Use ASCIICType more, and improve it a little bit
https://bugs.webkit.org/show_bug.cgi?id=165360

Reviewed by Sam Weinig.

Source/JavaScriptCore:

* inspector/InspectorValues.cpp:
(Inspector::readHexDigits): Use isASCIIHexDigit.
(Inspector::hextoInt): Deleted.
(decodeString): Use toASCIIHexValue.

* runtime/JSGlobalObjectFunctions.cpp:
(JSC::parseDigit): Use isASCIIDigit, isASCIIUpper, and isASCIILower.

* runtime/StringPrototype.cpp:
(JSC::substituteBackreferencesSlow): Use isASCIIDigit.

Source/WebCore:

* css/CSSGrammar.y.in: Use isASCIIDigit.

* css/parser/CSSParser.cpp:
(WebCore::CSSParser::parseFontFaceUnicodeRange): Use isASCIIHexDigit and
toASCIIHexValue.
(WebCore::isEqualToCSSIdentifier): Use isASCIILower.
* html/FormController.cpp:
(WebCore::isNotFormControlTypeCharacter): Use isASCIILower.
* html/parser/CSSPreloadScanner.cpp:
(WebCore::CSSPreloadScanner::tokenize): Use isASCIIAlpha.
* platform/Decimal.cpp:
(WebCore::Decimal::fromString): Use isASCIIDigit.
* platform/FileSystem.cpp:
(WebCore::decodeFromFilename): Use isASCIIHexDigit and toASCIIHexValue.
* platform/URL.cpp:
(WebCore::isLetterMatchIgnoringCase): Deleted.
(WebCore::isSchemeCharacterMatchIgnoringCase): Deleted.
(WebCore::assertProtocolIsGood): Use isASCIIUpper.
(WebCore::URL::protocolIs): Use isASCIIAlphaCaselessEqual.
(WebCore::URL::parse): Ditto.
(WebCore::protocolIs): Ditto.
(WebCore::protocolIsInHTTPFamily): Ditto.
* platform/URLParser.cpp:
(WeCore::URLParser::parseIPv4Piece): Use isASCIIDigit.

* platform/mac/WebCoreNSURLExtras.mm:
(WebCore::isRussianDomainNameCharacter): Use isASCIIDigit.
(WebCore::allCharactersAllowedByTLDRules): Ditto.
(WebCore::dataWithUserTypedString): Use upperNibbleToASCIIHexDigit and
lowerNibbleToASCIIHexDigit.
(WebCore::dataForURLComponentType): Ditto.
(WebCore::createStringWithEscapedUnsafeCharacters): Ditto.
(WebCore::userVisibleString): Use isASCIIHexDigit, toASCIIHexValue,
upperNibbleToASCIIHexDigit, and lowerNibbleToASCIIHexDigit.
(WebCore::isUserVisibleURL): Use isASCIIHexDigit and toASCIIHexValue.

* platform/network/FormDataBuilder.cpp:
(WebCore::FormDataBuilder::encodeStringAsFormData): Use isASCIIAlphanumeric.

* rendering/mathml/RenderMathMLToken.cpp:
(WebCore::mathVariant): Use isASCIIUpper, isASCIILower, and isASCIIDigit.

* svg/SVGParserUtilities.cpp:
(WebCore::genericParseNumber): Use isASCIIDigit.
* svg/SVGPathStringSource.cpp:
(WebCore::nextCommandHelper): Ditto.
* xml/XPathParser.cpp:
(WebCore::XPath::Parser::lexNumber): Ditto.
(WebCore::XPath::Parser::nextTokenInternal): Ditto.

Source/WebKit2:

* WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
(WebKit::capitalizeRFC822HeaderFieldName): Removed unneeded checks to simplify code.

Source/WTF:

* wtf/ASCIICType.h: Added declarations of all the functions to the top of the file,
so we have a list of what's available, not just a mix of that and the implementation.

* wtf/HexNumber.h:
(WTF::Internal::hexDigitsForMode): Moved lowerHexDigits and upperHexDigits
inside this function.
(WTF::appendByteAsHex): Use auto.
(WTF::placeByteAsHexCompressIfPossible): Ditto.
(WTF::placeByteAsHex): Ditto.
(WTF::appendUnsignedAsHex): Ditto.
(WTF::appendUnsigned64AsHex): Ditto.
(WTF::appendUnsignedAsHexFixedSize): Ditto.
(WTF::isHexDigit): Deleted.
(WTF::uncheckedHexDigit): Deleted.
(WTF::hexDigitValue): Deleted.
(WTF::uncheckedHexDigitValue): Deleted.

* wtf/SixCharacterHash.cpp:
(WTF::sixCharacterHashStringToInteger): Use isASCIIUpper, isASCIILower, and
isASCIIDigit. Also added some FIXMEs; for some reason this function uses
RELEASE_ASSERT to abort if the passed-in string is not six characters long,
and it's not clear to me why this is so critical to assert.
(WTF::integerToSixCharacterHashString): Moved the table inside this function,
obviating the need for a macro named TABLE.

* wtf/dtoa/bignum.cc:
(WTF::double_conversion::HexCharValue): Deleted.
(WTF::double_conversion::Bignum::AssignHexString): Use toASCIIHexValue.
* wtf/dtoa/double-conversion.cc:
(WTF::double_conversion::StringToDoubleConverter::StringToDouble): Use isASCIIDigit.

* wtf/text/StringBuilder.cpp:
(WTF::appendQuotedJSONStringInternal): Use upperNibbleToASCIIHexDigit and
lowerNibbleToASCIIHexDigit.

* wtf/text/StringImpl.cpp:
(WTF::StringImpl::convertToUppercaseWithoutLocale): Use toASCIIUpper.
Removed the workaround for a bug that was fixed in Visual Studio 2013.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorValuescpp">trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGlobalObjectFunctionscpp">trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStringPrototypecpp">trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfASCIICTypeh">trunk/Source/WTF/wtf/ASCIICType.h</a></li>
<li><a href="#trunkSourceWTFwtfHexNumberh">trunk/Source/WTF/wtf/HexNumber.h</a></li>
<li><a href="#trunkSourceWTFwtfSixCharacterHashcpp">trunk/Source/WTF/wtf/SixCharacterHash.cpp</a></li>
<li><a href="#trunkSourceWTFwtfdtoabignumcc">trunk/Source/WTF/wtf/dtoa/bignum.cc</a></li>
<li><a href="#trunkSourceWTFwtfdtoadoubleconversioncc">trunk/Source/WTF/wtf/dtoa/double-conversion.cc</a></li>
<li><a href="#trunkSourceWTFwtftextStringBuildercpp">trunk/Source/WTF/wtf/text/StringBuilder.cpp</a></li>
<li><a href="#trunkSourceWTFwtftextStringImplcpp">trunk/Source/WTF/wtf/text/StringImpl.cpp</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModuleswebsocketsWebSocketHandshakecpp">trunk/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSGrammaryin">trunk/Source/WebCore/css/CSSGrammar.y.in</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSParsercpp">trunk/Source/WebCore/css/parser/CSSParser.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlFormControllercpp">trunk/Source/WebCore/html/FormController.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlparserCSSPreloadScannercpp">trunk/Source/WebCore/html/parser/CSSPreloadScanner.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformDecimalcpp">trunk/Source/WebCore/platform/Decimal.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformFileSystemcpp">trunk/Source/WebCore/platform/FileSystem.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformURLcpp">trunk/Source/WebCore/platform/URL.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformURLParsercpp">trunk/Source/WebCore/platform/URLParser.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmacWebCoreNSURLExtrasmm">trunk/Source/WebCore/platform/mac/WebCoreNSURLExtras.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkFormDataBuildercpp">trunk/Source/WebCore/platform/network/FormDataBuilder.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingmathmlRenderMathMLTokencpp">trunk/Source/WebCore/rendering/mathml/RenderMathMLToken.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGParserUtilitiescpp">trunk/Source/WebCore/svg/SVGParserUtilities.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPathStringSourcecpp">trunk/Source/WebCore/svg/SVGPathStringSource.cpp</a></li>
<li><a href="#trunkSourceWebCorexmlXPathParsercpp">trunk/Source/WebCore/xml/XPathParser.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsNetscapeNetscapeBrowserFuncscpp">trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2016-12-04  Darin Adler  &lt;darin@apple.com&gt;
+
+        Use ASCIICType more, and improve it a little bit
+        https://bugs.webkit.org/show_bug.cgi?id=165360
+
+        Reviewed by Sam Weinig.
+
+        * inspector/InspectorValues.cpp:
+        (Inspector::readHexDigits): Use isASCIIHexDigit.
+        (Inspector::hextoInt): Deleted.
+        (decodeString): Use toASCIIHexValue.
+
+        * runtime/JSGlobalObjectFunctions.cpp:
+        (JSC::parseDigit): Use isASCIIDigit, isASCIIUpper, and isASCIILower.
+
+        * runtime/StringPrototype.cpp:
+        (JSC::substituteBackreferencesSlow): Use isASCIIDigit.
+
</ins><span class="cx"> 2016-12-06  Csaba Osztrogonác  &lt;ossy@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Add storeFence support for ARMv7
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorValuescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -151,8 +151,7 @@
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     for (int i = 0; i &lt; digits; ++i) {
</span><del>-        UChar c = *start++;
-        if (!(('0' &lt;= c &amp;&amp; c &lt;= '9') || ('a' &lt;= c &amp;&amp; c &lt;= 'f') || ('A' &lt;= c &amp;&amp; c &lt;= 'F')))
</del><ins>+        if (!isASCIIHexDigit(*start++))
</ins><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -262,19 +261,6 @@
</span><span class="cx">     return INVALID_TOKEN;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline int hexToInt(UChar c)
-{
-    if ('0' &lt;= c &amp;&amp; c &lt;= '9')
-        return c - '0';
-    if ('A' &lt;= c &amp;&amp; c &lt;= 'F')
-        return c - 'A' + 10;
-    if ('a' &lt;= c &amp;&amp; c &lt;= 'f')
-        return c - 'a' + 10;
-
-    ASSERT_NOT_REACHED();
-    return 0;
-}
-
</del><span class="cx"> bool decodeString(const UChar* start, const UChar* end, StringBuilder&amp; output)
</span><span class="cx"> {
</span><span class="cx">     while (start &lt; end) {
</span><span class="lines">@@ -308,15 +294,11 @@
</span><span class="cx">             c = '\v';
</span><span class="cx">             break;
</span><span class="cx">         case 'x':
</span><del>-            c = (hexToInt(*start) &lt;&lt; 4) +
-                hexToInt(*(start + 1));
</del><ins>+            c = toASCIIHexValue(start[0], start[1]);
</ins><span class="cx">             start += 2;
</span><span class="cx">             break;
</span><span class="cx">         case 'u':
</span><del>-            c = (hexToInt(*start) &lt;&lt; 12) +
-                (hexToInt(*(start + 1)) &lt;&lt; 8) +
-                (hexToInt(*(start + 2)) &lt;&lt; 4) +
-                hexToInt(*(start + 3));
</del><ins>+            c = toASCIIHexValue(start[0], start[1]) &lt;&lt; 8 | toASCIIHexValue(start[2], start[3]);
</ins><span class="cx">             start += 4;
</span><span class="cx">             break;
</span><span class="cx">         default:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGlobalObjectFunctionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -272,11 +272,11 @@
</span><span class="cx"> {
</span><span class="cx">     int digit = -1;
</span><span class="cx"> 
</span><del>-    if (c &gt;= '0' &amp;&amp; c &lt;= '9')
</del><ins>+    if (isASCIIDigit(c))
</ins><span class="cx">         digit = c - '0';
</span><del>-    else if (c &gt;= 'A' &amp;&amp; c &lt;= 'Z')
</del><ins>+    else if (isASCIIUpper(c))
</ins><span class="cx">         digit = c - 'A' + 10;
</span><del>-    else if (c &gt;= 'a' &amp;&amp; c &lt;= 'z')
</del><ins>+    else if (isASCIILower(c))
</ins><span class="cx">         digit = c - 'a' + 10;
</span><span class="cx"> 
</span><span class="cx">     if (digit &gt;= radix)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStringPrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -220,7 +220,7 @@
</span><span class="cx">         } else if (ref == '\'') {
</span><span class="cx">             backrefStart = ovector[1];
</span><span class="cx">             backrefLength = source.length() - backrefStart;
</span><del>-        } else if (reg &amp;&amp; ref &gt;= '0' &amp;&amp; ref &lt;= '9') {
</del><ins>+        } else if (reg &amp;&amp; isASCIIDigit(ref)) {
</ins><span class="cx">             // 1- and 2-digit back references are allowed
</span><span class="cx">             unsigned backrefIndex = ref - '0';
</span><span class="cx">             if (backrefIndex &gt; reg-&gt;numSubpatterns())
</span><span class="lines">@@ -227,7 +227,7 @@
</span><span class="cx">                 continue;
</span><span class="cx">             if (replacement.length() &gt; i + 2) {
</span><span class="cx">                 ref = replacement[i + 2];
</span><del>-                if (ref &gt;= '0' &amp;&amp; ref &lt;= '9') {
</del><ins>+                if (isASCIIDigit(ref)) {
</ins><span class="cx">                     backrefIndex = 10 * backrefIndex + ref - '0';
</span><span class="cx">                     if (backrefIndex &gt; reg-&gt;numSubpatterns())
</span><span class="cx">                         backrefIndex = backrefIndex / 10;   // Fall back to the 1-digit reference
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WTF/ChangeLog        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -1,3 +1,49 @@
</span><ins>+2016-12-04  Darin Adler  &lt;darin@apple.com&gt;
+
+        Use ASCIICType more, and improve it a little bit
+        https://bugs.webkit.org/show_bug.cgi?id=165360
+
+        Reviewed by Sam Weinig.
+
+        * wtf/ASCIICType.h: Added declarations of all the functions to the top of the file,
+        so we have a list of what's available, not just a mix of that and the implementation.
+
+        * wtf/HexNumber.h:
+        (WTF::Internal::hexDigitsForMode): Moved lowerHexDigits and upperHexDigits
+        inside this function.
+        (WTF::appendByteAsHex): Use auto.
+        (WTF::placeByteAsHexCompressIfPossible): Ditto.
+        (WTF::placeByteAsHex): Ditto.
+        (WTF::appendUnsignedAsHex): Ditto.
+        (WTF::appendUnsigned64AsHex): Ditto.
+        (WTF::appendUnsignedAsHexFixedSize): Ditto.
+        (WTF::isHexDigit): Deleted.
+        (WTF::uncheckedHexDigit): Deleted.
+        (WTF::hexDigitValue): Deleted.
+        (WTF::uncheckedHexDigitValue): Deleted.
+
+        * wtf/SixCharacterHash.cpp:
+        (WTF::sixCharacterHashStringToInteger): Use isASCIIUpper, isASCIILower, and
+        isASCIIDigit. Also added some FIXMEs; for some reason this function uses
+        RELEASE_ASSERT to abort if the passed-in string is not six characters long,
+        and it's not clear to me why this is so critical to assert.
+        (WTF::integerToSixCharacterHashString): Moved the table inside this function,
+        obviating the need for a macro named TABLE.
+
+        * wtf/dtoa/bignum.cc:
+        (WTF::double_conversion::HexCharValue): Deleted.
+        (WTF::double_conversion::Bignum::AssignHexString): Use toASCIIHexValue.
+        * wtf/dtoa/double-conversion.cc:
+        (WTF::double_conversion::StringToDoubleConverter::StringToDouble): Use isASCIIDigit.
+
+        * wtf/text/StringBuilder.cpp:
+        (WTF::appendQuotedJSONStringInternal): Use upperNibbleToASCIIHexDigit and
+        lowerNibbleToASCIIHexDigit.
+
+        * wtf/text/StringImpl.cpp:
+        (WTF::StringImpl::convertToUppercaseWithoutLocale): Use toASCIIUpper.
+        Removed the workaround for a bug that was fixed in Visual Studio 2013.
+
</ins><span class="cx"> 2016-12-05  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r208985): SafariForWebKitDevelopment Symbol Not Found looking for method with WTF::Optional
</span></span></pre></div>
<a id="trunkSourceWTFwtfASCIICTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/ASCIICType.h (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/ASCIICType.h        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WTF/wtf/ASCIICType.h        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2007-2009, 2011, 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2007-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -44,6 +44,37 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><ins>+template&lt;typename CharacterType&gt; bool isASCII(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIIAlpha(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIIAlphanumeric(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIIBinaryDigit(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIIDigit(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIIHexDigit(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIILower(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIIOctalDigit(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIIPrintable(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIISpace(CharacterType);
+template&lt;typename CharacterType&gt; bool isASCIIUpper(CharacterType);
+
+template&lt;typename CharacterType&gt; CharacterType toASCIILower(CharacterType);
+template&lt;typename CharacterType&gt; CharacterType toASCIIUpper(CharacterType);
+
+template&lt;typename CharacterType&gt; uint8_t toASCIIHexValue(CharacterType);
+template&lt;typename CharacterType&gt; uint8_t toASCIIHexValue(CharacterType firstCharacter, CharacterType secondCharacter);
+
+char lowerNibbleToASCIIHexDigit(uint8_t);
+char upperNibbleToASCIIHexDigit(uint8_t);
+char lowerNibbleToLowercaseASCIIHexDigit(uint8_t);
+char upperNibbleToLowercaseASCIIHexDigit(uint8_t);
+
+template&lt;typename CharacterType&gt; bool isASCIIAlphaCaselessEqual(CharacterType, char expectedASCIILowercaseLetter);
+
+// The toASCIILowerUnchecked function can be used for comparing any input character
+// to a lowercase English character. The isASCIIAlphaCaselessEqual function should
+// be used for regular comparison of ASCII alpha characters, but switch statements
+// in the CSS tokenizer, for example, instead make direct use toASCIILowerUnchecked.
+template&lt;typename CharacterType&gt; CharacterType toASCIILowerUnchecked(CharacterType);
+
</ins><span class="cx"> const unsigned char asciiCaseFoldTable[256] = {
</span><span class="cx">     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
</span><span class="cx">     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
</span></span></pre></div>
<a id="trunkSourceWTFwtfHexNumberh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/HexNumber.h (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/HexNumber.h        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WTF/wtf/HexNumber.h        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -24,26 +24,23 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><del>-enum HexConversionMode {
-    Lowercase,
-    Uppercase
-};
</del><ins>+enum HexConversionMode { Lowercase, Uppercase };
</ins><span class="cx"> 
</span><span class="cx"> namespace Internal {
</span><span class="cx"> 
</span><del>-const LChar lowerHexDigits[17] = &quot;0123456789abcdef&quot;;
-const LChar upperHexDigits[17] = &quot;0123456789ABCDEF&quot;;
</del><span class="cx"> inline const LChar* hexDigitsForMode(HexConversionMode mode)
</span><span class="cx"> {
</span><del>-    return mode == Lowercase ? lowerHexDigits : upperHexDigits;
</del><ins>+    static const LChar lowercaseHexDigits[17] = &quot;0123456789abcdef&quot;;
+    static const LChar uppercaseHexDigits[17] = &quot;0123456789ABCDEF&quot;;
+    return mode == Lowercase ? lowercaseHexDigits : uppercaseHexDigits;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}; // namespace Internal
</del><ins>+} // namespace Internal
</ins><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt;
</span><span class="cx"> inline void appendByteAsHex(unsigned char byte, T&amp; destination, HexConversionMode mode = Uppercase)
</span><span class="cx"> {
</span><del>-    const LChar* hexDigits = Internal::hexDigitsForMode(mode);
</del><ins>+    auto* hexDigits = Internal::hexDigitsForMode(mode);
</ins><span class="cx">     destination.append(hexDigits[byte &gt;&gt; 4]);
</span><span class="cx">     destination.append(hexDigits[byte &amp; 0xF]);
</span><span class="cx"> }
</span><span class="lines">@@ -51,7 +48,7 @@
</span><span class="cx"> template&lt;typename T&gt;
</span><span class="cx"> inline void placeByteAsHexCompressIfPossible(unsigned char byte, T&amp; destination, unsigned&amp; index, HexConversionMode mode = Uppercase)
</span><span class="cx"> {
</span><del>-    const LChar* hexDigits = Internal::hexDigitsForMode(mode);
</del><ins>+    auto* hexDigits = Internal::hexDigitsForMode(mode);
</ins><span class="cx">     if (byte &gt;= 0x10)
</span><span class="cx">         destination[index++] = hexDigits[byte &gt;&gt; 4];
</span><span class="cx">     destination[index++] = hexDigits[byte &amp; 0xF];
</span><span class="lines">@@ -60,7 +57,7 @@
</span><span class="cx"> template&lt;typename T&gt;
</span><span class="cx"> inline void placeByteAsHex(unsigned char byte, T&amp; destination, HexConversionMode mode = Uppercase)
</span><span class="cx"> {
</span><del>-    const LChar* hexDigits = Internal::hexDigitsForMode(mode);
</del><ins>+    auto* hexDigits = Internal::hexDigitsForMode(mode);
</ins><span class="cx">     *destination++ = hexDigits[byte &gt;&gt; 4];
</span><span class="cx">     *destination++ = hexDigits[byte &amp; 0xF];
</span><span class="cx"> }
</span><span class="lines">@@ -68,7 +65,7 @@
</span><span class="cx"> template&lt;typename T&gt;
</span><span class="cx"> inline void appendUnsignedAsHex(unsigned number, T&amp; destination, HexConversionMode mode = Uppercase)
</span><span class="cx"> {
</span><del>-    const LChar* hexDigits = Internal::hexDigitsForMode(mode);
</del><ins>+    auto* hexDigits = Internal::hexDigitsForMode(mode);
</ins><span class="cx">     Vector&lt;LChar, 8&gt; result;
</span><span class="cx">     do {
</span><span class="cx">         result.append(hexDigits[number % 16]);
</span><span class="lines">@@ -82,7 +79,7 @@
</span><span class="cx"> template&lt;typename T&gt;
</span><span class="cx"> inline void appendUnsigned64AsHex(uint64_t number, T&amp; destination, HexConversionMode mode = Uppercase)
</span><span class="cx"> {
</span><del>-    const LChar* hexDigits = Internal::hexDigitsForMode(mode);
</del><ins>+    auto* hexDigits = Internal::hexDigitsForMode(mode);
</ins><span class="cx">     Vector&lt;LChar, 8&gt; result;
</span><span class="cx">     do {
</span><span class="cx">         result.append(hexDigits[number % 16]);
</span><span class="lines">@@ -99,7 +96,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(desiredDigits);
</span><span class="cx"> 
</span><del>-    const LChar* hexDigits = Internal::hexDigitsForMode(mode);
</del><ins>+    auto* hexDigits = Internal::hexDigitsForMode(mode);
</ins><span class="cx">     Vector&lt;LChar, 8&gt; result;
</span><span class="cx">     do {
</span><span class="cx">         result.append(hexDigits[number % 16]);
</span><span class="lines">@@ -111,54 +108,6 @@
</span><span class="cx">     destination.append(result.data(), result.size());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-inline bool isHexDigit(char c)
-{
-    return (c &gt;= '0' &amp;&amp; c &lt;= '9') || (c &gt;= 'A' &amp;&amp; c &lt;= 'F') || (c &gt;= 'a' &amp;&amp; c &lt;= 'f');
-}
-
-inline char uncheckedHexDigit(int i)
-{
-    if (i &lt; 0 || i &gt; 16)
-        return '0';
-
-    return (i &gt;= 10) ? i - 10 + 'A' : i + '0';
-}
-
-inline bool hexDigitValue(char c, char&amp; result)
-{
-    if (c &gt;= '0' &amp;&amp; c &lt;= '9') {
-        result = c - '0';
-        return true;
-    }
-
-    if (c &gt;= 'A' &amp;&amp; c &lt;= 'F') {
-        result = c - 'A' + 10;
-        return true;
-    }
-
-    if (c &gt;= 'a' &amp;&amp; c &lt;= 'f') {
-        result = c - 'a' + 10;
-        return true;
-    }
-
-    return false;
-}
-
-inline int uncheckedHexDigitValue(char c)
-{
-    if (c &gt;= '0' &amp;&amp; c &lt;= '9')
-        return c - '0';
-
-    if (c &gt;= 'A' &amp;&amp; c &lt;= 'F')
-        return c - 'A' + 10;
-
-    if (c &gt;= 'a' &amp;&amp; c &lt;= 'f')
-        return c - 'a' + 10;
-
-    return 0;
-}
-
</del><span class="cx"> } // namespace WTF
</span><span class="cx"> 
</span><span class="cx"> using WTF::appendByteAsHex;
</span><span class="lines">@@ -167,7 +116,3 @@
</span><span class="cx"> using WTF::placeByteAsHex;
</span><span class="cx"> using WTF::placeByteAsHexCompressIfPossible;
</span><span class="cx"> using WTF::Lowercase;
</span><del>-using WTF::isHexDigit;
-using WTF::uncheckedHexDigit;
-using WTF::hexDigitValue;
-using WTF::uncheckedHexDigitValue;
</del></span></pre></div>
<a id="trunkSourceWTFwtfSixCharacterHashcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/SixCharacterHash.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/SixCharacterHash.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WTF/wtf/SixCharacterHash.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -26,46 +26,42 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;SixCharacterHash.h&quot;
</span><span class="cx"> 
</span><del>-#include &lt;wtf/StdLibExtras.h&gt;
</del><ins>+#include &lt;wtf/ASCIICType.h&gt;
</ins><span class="cx"> 
</span><del>-#include &lt;string.h&gt;
-
</del><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><del>-#define TABLE (&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&quot;)
-
</del><span class="cx"> unsigned sixCharacterHashStringToInteger(const char* string)
</span><span class="cx"> {
</span><span class="cx">     unsigned hash = 0;
</span><span class="cx"> 
</span><del>-    RELEASE_ASSERT(strlen(string) == 6);
-    
</del><span class="cx">     for (unsigned i = 0; i &lt; 6; ++i) {
</span><span class="cx">         hash *= 62;
</span><span class="cx">         unsigned c = string[i];
</span><del>-        if (c &gt;= 'A' &amp;&amp; c &lt;= 'Z') {
</del><ins>+        RELEASE_ASSERT(c); // FIXME: Why does this need to be a RELEASE_ASSERT?
+        if (isASCIIUpper(c)) {
</ins><span class="cx">             hash += c - 'A';
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><del>-        if (c &gt;= 'a' &amp;&amp; c &lt;= 'z') {
</del><ins>+        if (isASCIILower(c)) {
</ins><span class="cx">             hash += c - 'a' + 26;
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><del>-        ASSERT(c &gt;= '0' &amp;&amp; c &lt;= '9');
</del><ins>+        ASSERT(isASCIIDigit(c));
</ins><span class="cx">         hash += c - '0' + 26 * 2;
</span><span class="cx">     }
</span><del>-    
</del><ins>+
+    RELEASE_ASSERT(string[6]); // FIXME: Why does this need to be a RELEASE_ASSERT?
+
</ins><span class="cx">     return hash;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::array&lt;char, 7&gt; integerToSixCharacterHashString(unsigned hash)
</span><span class="cx"> {
</span><del>-    static_assert(WTF_ARRAY_LENGTH(TABLE) - 1 == 62, &quot;Six character hash table is not 62 characters long.&quot;);
-
</del><ins>+    static const char table[63] = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&quot;;
</ins><span class="cx">     std::array&lt;char, 7&gt; buffer;
</span><span class="cx">     unsigned accumulator = hash;
</span><span class="cx">     for (unsigned i = 6; i--;) {
</span><del>-        buffer[i] = TABLE[accumulator % 62];
</del><ins>+        buffer[i] = table[accumulator % 62];
</ins><span class="cx">         accumulator /= 62;
</span><span class="cx">     }
</span><span class="cx">     buffer[6] = 0;
</span></span></pre></div>
<a id="trunkSourceWTFwtfdtoabignumcc"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/dtoa/bignum.cc (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/dtoa/bignum.cc        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WTF/wtf/dtoa/bignum.cc        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;bignum.h&quot;
</span><span class="cx"> #include &quot;utils.h&quot;
</span><ins>+#include &lt;wtf/ASCIICType.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><span class="lines">@@ -123,15 +124,6 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     
</span><del>-    static int HexCharValue(char c) {
-        if ('0' &lt;= c &amp;&amp; c &lt;= '9') return c - '0';
-        if ('a' &lt;= c &amp;&amp; c &lt;= 'f') return 10 + c - 'a';
-        if ('A' &lt;= c &amp;&amp; c &lt;= 'F') return 10 + c - 'A';
-        UNREACHABLE();
-        return 0;  // To make compiler happy.
-    }
-    
-    
</del><span class="cx">     void Bignum::AssignHexString(BufferReference&lt;const char&gt; value) {
</span><span class="cx">         Zero();
</span><span class="cx">         int length = value.length();
</span><span class="lines">@@ -143,7 +135,7 @@
</span><span class="cx">             // These bigits are guaranteed to be &quot;full&quot;.
</span><span class="cx">             Chunk current_bigit = 0;
</span><span class="cx">             for (int j = 0; j &lt; kBigitSize / 4; j++) {
</span><del>-                current_bigit += HexCharValue(value[string_index--]) &lt;&lt; (j * 4);
</del><ins>+                current_bigit += toASCIIHexValue(value[string_index--]) &lt;&lt; (j * 4);
</ins><span class="cx">             }
</span><span class="cx">             bigits_[i] = current_bigit;
</span><span class="cx">         }
</span><span class="lines">@@ -152,7 +144,7 @@
</span><span class="cx">         Chunk most_significant_bigit = 0;  // Could be = 0;
</span><span class="cx">         for (int j = 0; j &lt;= string_index; ++j) {
</span><span class="cx">             most_significant_bigit &lt;&lt;= 4;
</span><del>-            most_significant_bigit += HexCharValue(value[j]);
</del><ins>+            most_significant_bigit += toASCIIHexValue(value[j]);
</ins><span class="cx">         }
</span><span class="cx">         if (most_significant_bigit != 0) {
</span><span class="cx">             bigits_[used_digits_] = most_significant_bigit;
</span></span></pre></div>
<a id="trunkSourceWTFwtfdtoadoubleconversioncc"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/dtoa/double-conversion.cc (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/dtoa/double-conversion.cc        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WTF/wtf/dtoa/double-conversion.cc        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -26,10 +26,6 @@
</span><span class="cx"> // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><del>-
-#include &lt;limits.h&gt;
-#include &lt;math.h&gt;
-
</del><span class="cx"> #include &quot;double-conversion.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;bignum-dtoa.h&quot;
</span><span class="lines">@@ -38,6 +34,9 @@
</span><span class="cx"> #include &quot;fixed-dtoa.h&quot;
</span><span class="cx"> #include &quot;strtod.h&quot;
</span><span class="cx"> #include &quot;utils.h&quot;
</span><ins>+#include &lt;limits.h&gt;
+#include &lt;math.h&gt;
+#include &lt;wtf/ASCIICType.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><span class="lines">@@ -483,7 +482,7 @@
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         // Copy significant digits of the integer part (if any) to the buffer.
</span><del>-        while (*current &gt;= '0' &amp;&amp; *current &lt;= '9') {
</del><ins>+        while (isASCIIDigit(*current)) {
</ins><span class="cx">             if (significant_digits &lt; kMaxSignificantDigits) {
</span><span class="cx">                 ASSERT(buffer_pos &lt; kBufferSize);
</span><span class="cx">                 buffer[buffer_pos++] = static_cast&lt;char&gt;(*current);
</span><span class="lines">@@ -520,7 +519,7 @@
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             // There is a fractional part.
</span><del>-            while (*current &gt;= '0' &amp;&amp; *current &lt;= '9') {
</del><ins>+            while (isASCIIDigit(*current)) {
</ins><span class="cx">                 if (significant_digits &lt; kMaxSignificantDigits) {
</span><span class="cx">                     ASSERT(buffer_pos &lt; kBufferSize);
</span><span class="cx">                     buffer[buffer_pos++] = static_cast&lt;char&gt;(*current);
</span><span class="lines">@@ -580,7 +579,7 @@
</span><span class="cx">                     num = num * 10 + digit;
</span><span class="cx">                 }
</span><span class="cx">                 ++current;
</span><del>-            } while (current != end &amp;&amp; *current &gt;= '0' &amp;&amp; *current &lt;= '9');
</del><ins>+            } while (current != end &amp;&amp; isASCIIDigit(*current));
</ins><span class="cx">             
</span><span class="cx">             exponent += (sign == '-' ? -num : num);
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWTFwtftextStringBuildercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/StringBuilder.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/StringBuilder.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WTF/wtf/text/StringBuilder.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -418,13 +418,12 @@
</span><span class="cx">             break;
</span><span class="cx">         default:
</span><span class="cx">             ASSERT((*input &amp; 0xFF00) == 0);
</span><del>-            static const char hexDigits[] = &quot;0123456789abcdef&quot;;
</del><span class="cx">             *output++ = '\\';
</span><span class="cx">             *output++ = 'u';
</span><span class="cx">             *output++ = '0';
</span><span class="cx">             *output++ = '0';
</span><del>-            *output++ = static_cast&lt;LChar&gt;(hexDigits[(*input &gt;&gt; 4) &amp; 0xF]);
-            *output++ = static_cast&lt;LChar&gt;(hexDigits[*input &amp; 0xF]);
</del><ins>+            *output++ = upperNibbleToLowercaseASCIIHexDigit(*input);
+            *output++ = lowerNibbleToLowercaseASCIIHexDigit(*input);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWTFwtftextStringImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/StringImpl.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/StringImpl.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WTF/wtf/text/StringImpl.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -451,14 +451,7 @@
</span><span class="cx">         for (int i = 0; i &lt; length; ++i) {
</span><span class="cx">             LChar c = m_data8[i];
</span><span class="cx">             ored |= c;
</span><del>-#if CPU(X86) &amp;&amp; defined(_MSC_VER) &amp;&amp; _MSC_VER &gt;=1700
-            // Workaround for an MSVC 2012 x86 optimizer bug. Remove once the bug is fixed.
-            // See https://connect.microsoft.com/VisualStudio/feedback/details/780362/optimization-bug-of-range-comparison
-            // for more details.
-            data8[i] = c &gt;= 'a' &amp;&amp; c &lt;= 'z' ? c &amp; ~0x20 : c;
-#else
</del><span class="cx">             data8[i] = toASCIIUpper(c);
</span><del>-#endif
</del><span class="cx">         }
</span><span class="cx">         if (!(ored &amp; ~0x7F))
</span><span class="cx">             return newImpl;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/ChangeLog        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -1,3 +1,60 @@
</span><ins>+2016-12-04  Darin Adler  &lt;darin@apple.com&gt;
+
+        Use ASCIICType more, and improve it a little bit
+        https://bugs.webkit.org/show_bug.cgi?id=165360
+
+        Reviewed by Sam Weinig.
+
+        * css/CSSGrammar.y.in: Use isASCIIDigit.
+
+        * css/parser/CSSParser.cpp:
+        (WebCore::CSSParser::parseFontFaceUnicodeRange): Use isASCIIHexDigit and
+        toASCIIHexValue.
+        (WebCore::isEqualToCSSIdentifier): Use isASCIILower.
+        * html/FormController.cpp:
+        (WebCore::isNotFormControlTypeCharacter): Use isASCIILower.
+        * html/parser/CSSPreloadScanner.cpp:
+        (WebCore::CSSPreloadScanner::tokenize): Use isASCIIAlpha.
+        * platform/Decimal.cpp:
+        (WebCore::Decimal::fromString): Use isASCIIDigit.
+        * platform/FileSystem.cpp:
+        (WebCore::decodeFromFilename): Use isASCIIHexDigit and toASCIIHexValue.
+        * platform/URL.cpp:
+        (WebCore::isLetterMatchIgnoringCase): Deleted.
+        (WebCore::isSchemeCharacterMatchIgnoringCase): Deleted.
+        (WebCore::assertProtocolIsGood): Use isASCIIUpper.
+        (WebCore::URL::protocolIs): Use isASCIIAlphaCaselessEqual.
+        (WebCore::URL::parse): Ditto.
+        (WebCore::protocolIs): Ditto.
+        (WebCore::protocolIsInHTTPFamily): Ditto.
+        * platform/URLParser.cpp:
+        (WeCore::URLParser::parseIPv4Piece): Use isASCIIDigit.
+
+        * platform/mac/WebCoreNSURLExtras.mm:
+        (WebCore::isRussianDomainNameCharacter): Use isASCIIDigit.
+        (WebCore::allCharactersAllowedByTLDRules): Ditto.
+        (WebCore::dataWithUserTypedString): Use upperNibbleToASCIIHexDigit and
+        lowerNibbleToASCIIHexDigit.
+        (WebCore::dataForURLComponentType): Ditto.
+        (WebCore::createStringWithEscapedUnsafeCharacters): Ditto.
+        (WebCore::userVisibleString): Use isASCIIHexDigit, toASCIIHexValue,
+        upperNibbleToASCIIHexDigit, and lowerNibbleToASCIIHexDigit.
+        (WebCore::isUserVisibleURL): Use isASCIIHexDigit and toASCIIHexValue.
+
+        * platform/network/FormDataBuilder.cpp:
+        (WebCore::FormDataBuilder::encodeStringAsFormData): Use isASCIIAlphanumeric.
+
+        * rendering/mathml/RenderMathMLToken.cpp:
+        (WebCore::mathVariant): Use isASCIIUpper, isASCIILower, and isASCIIDigit.
+
+        * svg/SVGParserUtilities.cpp:
+        (WebCore::genericParseNumber): Use isASCIIDigit.
+        * svg/SVGPathStringSource.cpp:
+        (WebCore::nextCommandHelper): Ditto.
+        * xml/XPathParser.cpp:
+        (WebCore::XPath::Parser::lexNumber): Ditto.
+        (WebCore::XPath::Parser::nextTokenInternal): Ditto.
+
</ins><span class="cx"> 2016-12-06  Ryan Haddad  &lt;ryanhaddad@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Rebaseline bindings tests after r209390.
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebsocketsWebSocketHandshakecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -487,7 +487,7 @@
</span><span class="cx">     if (statusCodeString.length() != 3) // Status code must consist of three digits.
</span><span class="cx">         return lineLength;
</span><span class="cx">     for (int i = 0; i &lt; 3; ++i)
</span><del>-        if (statusCodeString[i] &lt; '0' || statusCodeString[i] &gt; '9') {
</del><ins>+        if (!isASCIIDigit(statusCodeString[i])) {
</ins><span class="cx">             m_failureReason = makeString(&quot;Invalid status code: &quot;, statusCodeString);
</span><span class="cx">             return lineLength;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSGrammaryin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSGrammar.y.in (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSGrammar.y.in        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/css/CSSGrammar.y.in        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -1217,7 +1217,7 @@
</span><span class="cx">         $$-&gt;setValue($1, parser-&gt;m_context.mode == HTMLQuirksMode);
</span><span class="cx">     }
</span><span class="cx">   | HEX {
</span><del>-        if ($1[0] &gt;= '0' &amp;&amp; $1[0] &lt;= '9')
</del><ins>+        if (isASCIIDigit($1[0]))
</ins><span class="cx">             $$ = nullptr;
</span><span class="cx">         else {
</span><span class="cx">             $$ = new CSSParserSelector;
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSParser.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSParser.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/css/parser/CSSParser.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -7238,12 +7238,8 @@
</span><span class="cx">             if (c == '-' || c == '?')
</span><span class="cx">                 break;
</span><span class="cx">             from *= 16;
</span><del>-            if (c &gt;= '0' &amp;&amp; c &lt;= '9')
-                from += c - '0';
-            else if (c &gt;= 'A' &amp;&amp; c &lt;= 'F')
-                from += 10 + c - 'A';
-            else if (c &gt;= 'a' &amp;&amp; c &lt;= 'f')
-                from += 10 + c - 'a';
</del><ins>+            if (isASCIIHexDigit(c))
+                from += toASCIIHexValue(c);
</ins><span class="cx">             else {
</span><span class="cx">                 failed = true;
</span><span class="cx">                 break;
</span><span class="lines">@@ -7274,12 +7270,8 @@
</span><span class="cx">             while (i &lt; length) {
</span><span class="cx">                 UChar c = rangeString[i];
</span><span class="cx">                 to *= 16;
</span><del>-                if (c &gt;= '0' &amp;&amp; c &lt;= '9')
-                    to += c - '0';
-                else if (c &gt;= 'A' &amp;&amp; c &lt;= 'F')
-                    to += 10 + c - 'A';
-                else if (c &gt;= 'a' &amp;&amp; c &lt;= 'f')
-                    to += 10 + c - 'a';
</del><ins>+                if (isASCIIHexDigit(c))
+                    to += toASCIIHexValue(c);
</ins><span class="cx">                 else {
</span><span class="cx">                     failed = true;
</span><span class="cx">                     break;
</span><span class="lines">@@ -11504,11 +11496,11 @@
</span><span class="cx"> {
</span><span class="cx">     // Compare an character memory data with a zero terminated string.
</span><span class="cx">     do {
</span><del>-        // The input must be part of an identifier if constantChar or constString
</del><ins>+        // The input must be part of an identifier if constantString
</ins><span class="cx">         // contains '-'. Otherwise toASCIILowerUnchecked('\r') would be equal to '-'.
</span><del>-        ASSERT((*constantString &gt;= 'a' &amp;&amp; *constantString &lt;= 'z') || *constantString == '-');
</del><ins>+        ASSERT(isASCIILower(*constantString) || *constantString == '-');
</ins><span class="cx">         ASSERT(*constantString != '-' || isCSSLetter(*cssString));
</span><del>-        if (toASCIILowerUnchecked(*cssString++) != (*constantString++))
</del><ins>+        if (toASCIILowerUnchecked(*cssString++) != *constantString++)
</ins><span class="cx">             return false;
</span><span class="cx">     } while (*constantString);
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlFormControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/FormController.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/FormController.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/html/FormController.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -195,7 +195,7 @@
</span><span class="cx"> 
</span><span class="cx"> static bool isNotFormControlTypeCharacter(UChar ch)
</span><span class="cx"> {
</span><del>-    return ch != '-' &amp;&amp; (ch &gt; 'z' || ch &lt; 'a');
</del><ins>+    return !(ch == '-' || isASCIILower(ch));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::unique_ptr&lt;SavedFormState&gt; SavedFormState::deserialize(const Vector&lt;String&gt;&amp; stateVector, size_t&amp; index)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlparserCSSPreloadScannercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/parser/CSSPreloadScanner.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/parser/CSSPreloadScanner.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/html/parser/CSSPreloadScanner.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -97,7 +97,7 @@
</span><span class="cx">             m_state = Comment;
</span><span class="cx">         break;
</span><span class="cx">     case RuleStart:
</span><del>-        if ((c &gt;= 'A' &amp;&amp; c &lt;= 'Z') || (c &gt;= 'a' &amp;&amp; c &lt;= 'z')) {
</del><ins>+        if (isASCIIAlpha(c)) {
</ins><span class="cx">             m_rule.clear();
</span><span class="cx">             m_ruleValue.clear();
</span><span class="cx">             m_rule.append(c);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformDecimalcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/Decimal.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/Decimal.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/platform/Decimal.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -728,7 +728,7 @@
</span><span class="cx">         const int ch = str[index];
</span><span class="cx">         switch (state) {
</span><span class="cx">         case StateDigit:
</span><del>-            if (ch &gt;= '0' &amp;&amp; ch &lt;= '9') {
</del><ins>+            if (isASCIIDigit(ch)) {
</ins><span class="cx">                 if (numberOfDigits &lt; Precision) {
</span><span class="cx">                     ++numberOfDigits;
</span><span class="cx">                     accumulator *= 10;
</span><span class="lines">@@ -743,7 +743,7 @@
</span><span class="cx">             return nan();
</span><span class="cx"> 
</span><span class="cx">         case StateDot:
</span><del>-            if (ch &gt;= '0' &amp;&amp; ch &lt;= '9') {
</del><ins>+            if (isASCIIDigit(ch)) {
</ins><span class="cx">                 if (numberOfDigits &lt; Precision) {
</span><span class="cx">                     ++numberOfDigits;
</span><span class="cx">                     ++numberOfDigitsAfterDot;
</span><span class="lines">@@ -757,7 +757,7 @@
</span><span class="cx">             FALLTHROUGH;
</span><span class="cx"> 
</span><span class="cx">         case StateDotDigit:
</span><del>-            if (ch &gt;= '0' &amp;&amp; ch &lt;= '9') {
</del><ins>+            if (isASCIIDigit(ch)) {
</ins><span class="cx">                 if (numberOfDigits &lt; Precision) {
</span><span class="cx">                     ++numberOfDigits;
</span><span class="cx">                     ++numberOfDigitsAfterDot;
</span><span class="lines">@@ -783,7 +783,7 @@
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            if (ch &gt;= '0' &amp;&amp; ch &lt;= '9') {
</del><ins>+            if (isASCIIDigit(ch)) {
</ins><span class="cx">                 exponent = ch - '0';
</span><span class="cx">                 state = StateEDigit;
</span><span class="cx">                 break;
</span><span class="lines">@@ -792,7 +792,7 @@
</span><span class="cx">             return nan();
</span><span class="cx"> 
</span><span class="cx">         case StateEDigit:
</span><del>-            if (ch &gt;= '0' &amp;&amp; ch &lt;= '9') {
</del><ins>+            if (isASCIIDigit(ch)) {
</ins><span class="cx">                 exponent *= 10;
</span><span class="cx">                 exponent += ch - '0';
</span><span class="cx">                 if (exponent &gt; ExponentMax + Precision) {
</span><span class="lines">@@ -807,7 +807,7 @@
</span><span class="cx">             return nan();
</span><span class="cx"> 
</span><span class="cx">         case StateESign:
</span><del>-            if (ch &gt;= '0' &amp;&amp; ch &lt;= '9') {
</del><ins>+            if (isASCIIDigit(ch)) {
</ins><span class="cx">                 exponent = ch - '0';
</span><span class="cx">                 state = StateEDigit;
</span><span class="cx">                 break;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformFileSystemcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/FileSystem.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/FileSystem.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/platform/FileSystem.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -151,17 +151,12 @@
</span><span class="cx">             return { };
</span><span class="cx"> 
</span><span class="cx">         if (inputString[i+1] != '+') {
</span><del>-            char value;
-            if (!hexDigitValue(inputString[i + 1], value))
</del><ins>+            if (!isASCIIHexDigit(inputString[i + 1]))
</ins><span class="cx">                 return { };
</span><del>-            LChar character = value &lt;&lt; 4;
-
-            if (!hexDigitValue(inputString[i + 2], value))
</del><ins>+            if (!isASCIIHexDigit(inputString[i + 2]))
</ins><span class="cx">                 return { };
</span><del>-
-            result.append(character | value);
</del><ins>+            result.append(toASCIIHexValue(inputString[i + 1], inputString[i + 2]));
</ins><span class="cx">             i += 2;
</span><del>-
</del><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -170,23 +165,16 @@
</span><span class="cx">         if (i + 5 &gt;= length)
</span><span class="cx">             return { };
</span><span class="cx"> 
</span><del>-        char value;
-        if (!hexDigitValue(inputString[i + 2], value))
</del><ins>+        if (!isASCIIHexDigit(inputString[i + 2]))
</ins><span class="cx">             return { };
</span><del>-        UChar character = value &lt;&lt; 12;
-
-        if (!hexDigitValue(inputString[i + 3], value))
</del><ins>+        if (!isASCIIHexDigit(inputString[i + 3]))
</ins><span class="cx">             return { };
</span><del>-        character = character | (value &lt;&lt; 8);
-
-        if (!hexDigitValue(inputString[i + 4], value))
</del><ins>+        if (!isASCIIHexDigit(inputString[i + 4]))
</ins><span class="cx">             return { };
</span><del>-        character = character | (value &lt;&lt; 4);
-
-        if (!hexDigitValue(inputString[i + 5], value))
</del><ins>+        if (!isASCIIHexDigit(inputString[i + 5]))
</ins><span class="cx">             return { };
</span><span class="cx"> 
</span><del>-        result.append(character | value);
</del><ins>+        result.append(toASCIIHexValue(inputString[i + 2], inputString[i + 3]) &lt;&lt; 8 | toASCIIHexValue(inputString[i + 4], inputString[i + 5]));
</ins><span class="cx">         i += 5;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformURLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/URL.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/URL.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/platform/URL.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -55,12 +55,6 @@
</span><span class="cx"> 
</span><span class="cx"> static const unsigned invalidPortNumber = 0xFFFF;
</span><span class="cx"> 
</span><del>-static inline bool isLetterMatchIgnoringCase(UChar character, char lowercaseLetter)
-{
-    ASSERT(isASCIILower(lowercaseLetter));
-    return (character | 0x20) == lowercaseLetter;
-}
-
</del><span class="cx"> static const char wsScheme[] = {'w', 's'};
</span><span class="cx"> static const char ftpScheme[] = {'f', 't', 'p'};
</span><span class="cx"> static const char ftpPort[] = {'2', '1'};
</span><span class="lines">@@ -73,12 +67,6 @@
</span><span class="cx"> static const char gopherScheme[] = {'g', 'o', 'p', 'h', 'e', 'r'};
</span><span class="cx"> static const char gopherPort[] = {'7', '0'};
</span><span class="cx"> 
</span><del>-static inline bool isLetterMatchIgnoringCase(char character, char lowercaseLetter)
-{
-    ASSERT(isASCIILower(lowercaseLetter));
-    return (character | 0x20) == lowercaseLetter;
-}
-
</del><span class="cx"> enum URLCharacterClasses {
</span><span class="cx">     // alpha 
</span><span class="cx">     SchemeFirstChar = 1 &lt;&lt; 0,
</span><span class="lines">@@ -356,14 +344,6 @@
</span><span class="cx"> static inline bool isBadChar(unsigned char c) { return characterClassTable[c] &amp; BadChar; }
</span><span class="cx"> static inline bool isTabNewline(UChar c) { return c &lt;= 0xff &amp;&amp; (characterClassTable[c] &amp; TabNewline); }
</span><span class="cx"> 
</span><del>-static inline bool isSchemeCharacterMatchIgnoringCase(char character, char schemeCharacter)
-{
-    ASSERT(isSchemeChar(character));
-    ASSERT(schemeCharacter &amp; 0x20);
-    ASSERT(isASCIILower(schemeCharacter) || (!isASCIIUpper(schemeCharacter) &amp;&amp; isSchemeChar(schemeCharacter)));
-    return (character | 0x20) == schemeCharacter;
-}
-
</del><span class="cx"> String encodeWithURLEscapeSequences(const String&amp; notEncodedString, PercentEncodeCharacterClass whatToEncode);
</span><span class="cx"> 
</span><span class="cx"> // Copies the source to the destination, assuming all the source characters are
</span><span class="lines">@@ -782,6 +762,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !USE(CF)
</span><ins>+
</ins><span class="cx"> String URL::fileSystemPath() const
</span><span class="cx"> {
</span><span class="cx">     if (!isValid() || !isLocalFile())
</span><span class="lines">@@ -789,6 +770,7 @@
</span><span class="cx"> 
</span><span class="cx">     return decodeURLEscapeSequences(path());
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #ifdef NDEBUG
</span><span class="lines">@@ -801,9 +783,14 @@
</span><span class="cx"> 
</span><span class="cx"> static void assertProtocolIsGood(StringView protocol)
</span><span class="cx"> {
</span><del>-    for (size_t i = 0; i &lt; protocol.length(); ++i) {
-        const char c = protocol[i];
-        ASSERT(c &gt; ' ' &amp;&amp; c &lt; 0x7F &amp;&amp; !(c &gt;= 'A' &amp;&amp; c &lt;= 'Z'));
</del><ins>+    // FIXME: We probably don't need this function any more.
+    // The isASCIIAlphaCaselessEqual function asserts that passed-in characters
+    // are ones it can handle; the older code did not and relied on these checks.
+    for (auto character : protocol.codeUnits()) {
+        ASSERT(isASCII(character));
+        ASSERT(character &gt; ' ');
+        ASSERT(!isASCIIUpper(character));
+        ASSERT(toASCIILowerUnchecked(character) == character);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -853,7 +840,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Do the comparison without making a new string object.
</span><span class="cx">     for (unsigned i = 0; i &lt; m_schemeEnd; ++i) {
</span><del>-        if (!protocol[i] || !isSchemeCharacterMatchIgnoringCase(m_string[i], protocol[i]))
</del><ins>+        if (!protocol[i] || !isASCIIAlphaCaselessEqual(m_string[i], protocol[i]))
</ins><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx">     return !protocol[m_schemeEnd]; // We should have consumed all characters in the argument.
</span><span class="lines">@@ -871,7 +858,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Do the comparison without making a new string object.
</span><span class="cx">     for (unsigned i = 0; i &lt; m_schemeEnd; ++i) {
</span><del>-        if (!isSchemeCharacterMatchIgnoringCase(m_string[i], protocol[i]))
</del><ins>+        if (!isASCIIAlphaCaselessEqual(m_string[i], protocol[i]))
</ins><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx">     return true;
</span><span class="lines">@@ -1399,6 +1386,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><ins>+
</ins><span class="cx"> static bool shouldCanonicalizeScheme = true;
</span><span class="cx"> 
</span><span class="cx"> void enableURLSchemeCanonicalization(bool enableSchemeCanonicalization)
</span><span class="lines">@@ -1405,6 +1393,7 @@
</span><span class="cx"> {
</span><span class="cx">     shouldCanonicalizeScheme = enableSchemeCanonicalization;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> template&lt;size_t length&gt;
</span><span class="lines">@@ -1537,16 +1526,16 @@
</span><span class="cx">     bool hasSecondSlash = hierarchical &amp;&amp; url[schemeEnd + 2] == '/';
</span><span class="cx"> 
</span><span class="cx">     bool isFile = schemeEnd == 4
</span><del>-        &amp;&amp; isLetterMatchIgnoringCase(url[0], 'f')
-        &amp;&amp; isLetterMatchIgnoringCase(url[1], 'i')
-        &amp;&amp; isLetterMatchIgnoringCase(url[2], 'l')
-        &amp;&amp; isLetterMatchIgnoringCase(url[3], 'e');
</del><ins>+        &amp;&amp; isASCIIAlphaCaselessEqual(url[0], 'f')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[1], 'i')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[2], 'l')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[3], 'e');
</ins><span class="cx"> 
</span><del>-    m_protocolIsInHTTPFamily = isLetterMatchIgnoringCase(url[0], 'h')
-        &amp;&amp; isLetterMatchIgnoringCase(url[1], 't')
-        &amp;&amp; isLetterMatchIgnoringCase(url[2], 't')
-        &amp;&amp; isLetterMatchIgnoringCase(url[3], 'p')
-        &amp;&amp; (url[4] == ':' || (isLetterMatchIgnoringCase(url[4], 's') &amp;&amp; url[5] == ':'));
</del><ins>+    m_protocolIsInHTTPFamily = isASCIIAlphaCaselessEqual(url[0], 'h')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[1], 't')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[2], 't')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[3], 'p')
+        &amp;&amp; (url[4] == ':' || (isASCIIAlphaCaselessEqual(url[4], 's') &amp;&amp; url[5] == ':'));
</ins><span class="cx"> 
</span><span class="cx">     if ((hierarchical &amp;&amp; hasSecondSlash) || isNonFileHierarchicalScheme(url, schemeEnd)) {
</span><span class="cx">         // The part after the scheme is either a net_path or an abs_path whose first path segment is empty.
</span><span class="lines">@@ -1719,15 +1708,15 @@
</span><span class="cx">     m_schemeEnd = p - buffer.data();
</span><span class="cx"> 
</span><span class="cx">     bool hostIsLocalHost = portEnd - userStart == 9
</span><del>-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart], 'l')
-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart+1], 'o')
-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart+2], 'c')
-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart+3], 'a')
-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart+4], 'l')
-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart+5], 'h')
-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart+6], 'o')
-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart+7], 's')
-        &amp;&amp; isLetterMatchIgnoringCase(url[userStart+8], 't');
</del><ins>+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart], 'l')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart+1], 'o')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart+2], 'c')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart+3], 'a')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart+4], 'l')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart+5], 'h')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart+6], 'o')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart+7], 's')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[userStart+8], 't');
</ins><span class="cx"> 
</span><span class="cx">     // File URLs need a host part unless it is just file:// or file://localhost
</span><span class="cx">     bool degenerateFilePath = pathStart == pathEnd &amp;&amp; (hostStart == hostEnd || hostIsLocalHost);
</span><span class="lines">@@ -1975,7 +1964,7 @@
</span><span class="cx">     for (unsigned i = 0; i &lt; length; ++i) {
</span><span class="cx">         if (!protocol[i])
</span><span class="cx">             return stringURL[i] == ':';
</span><del>-        if (!isLetterMatchIgnoringCase(stringURL[i], protocol[i]))
</del><ins>+        if (!isASCIIAlphaCaselessEqual(stringURL[i], protocol[i]))
</ins><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx">     return false;
</span><span class="lines">@@ -2211,7 +2200,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (!protocol[j])
</span><span class="cx">             return url[i] == ':';
</span><del>-        if (!isLetterMatchIgnoringCase(url[i], protocol[j]))
</del><ins>+        if (!isASCIIAlphaCaselessEqual(url[i], protocol[j]))
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         ++j;
</span><span class="lines">@@ -2236,10 +2225,12 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span><ins>+
</ins><span class="cx"> void URL::print() const
</span><span class="cx"> {
</span><span class="cx">     printf(&quot;%s\n&quot;, m_string.utf8().data());
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> String URL::strippedForUseAsReferrer() const
</span><span class="lines">@@ -2268,11 +2259,11 @@
</span><span class="cx"> bool protocolIsInHTTPFamily(const String&amp; url)
</span><span class="cx"> {
</span><span class="cx">     // Do the comparison without making a new string object.
</span><del>-    return isLetterMatchIgnoringCase(url[0], 'h')
-        &amp;&amp; isLetterMatchIgnoringCase(url[1], 't')
-        &amp;&amp; isLetterMatchIgnoringCase(url[2], 't')
-        &amp;&amp; isLetterMatchIgnoringCase(url[3], 'p')
-        &amp;&amp; (url[4] == ':' || (isLetterMatchIgnoringCase(url[4], 's') &amp;&amp; url[5] == ':'));
</del><ins>+    return isASCIIAlphaCaselessEqual(url[0], 'h')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[1], 't')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[2], 't')
+        &amp;&amp; isASCIIAlphaCaselessEqual(url[3], 'p')
+        &amp;&amp; (url[4] == ':' || (isASCIIAlphaCaselessEqual(url[4], 's') &amp;&amp; url[5] == ':'));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const URL&amp; blankURL()
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformURLParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/URLParser.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/URLParser.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/platform/URLParser.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -2156,7 +2156,7 @@
</span><span class="cx">             state = State::Octal;
</span><span class="cx">             break;
</span><span class="cx">         case State::Decimal:
</span><del>-            if (*iterator &lt; '0' || *iterator &gt; '9')
</del><ins>+            if (!isASCIIDigit(*iterator))
</ins><span class="cx">                 return std::nullopt;
</span><span class="cx">             value *= 10;
</span><span class="cx">             value += *iterator - '0';
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacWebCoreNSURLExtrasmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/WebCoreNSURLExtras.mm (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/WebCoreNSURLExtras.mm        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/platform/mac/WebCoreNSURLExtras.mm        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -294,7 +294,7 @@
</span><span class="cx"> static bool isRussianDomainNameCharacter(UChar ch)
</span><span class="cx"> {
</span><span class="cx">     // Only modern Russian letters, digits and dashes are allowed.
</span><del>-    return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || (ch &gt;= '0' &amp;&amp; ch &lt;= '9') || ch == '-';
</del><ins>+    return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || isASCIIDigit(ch) || ch == '-';
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static BOOL allCharactersAllowedByTLDRules(const UChar* buffer, int32_t length)
</span><span class="lines">@@ -385,7 +385,7 @@
</span><span class="cx">     };
</span><span class="cx">     CHECK_RULES_IF_SUFFIX_MATCHES(cyrillicBEL, [](UChar ch) {
</span><span class="cx">         // Russian and Byelorussian letters, digits and dashes are allowed.
</span><del>-        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || ch == 0x0456 || ch == 0x045E || ch == 0x2019 || (ch &gt;= '0' &amp;&amp; ch &lt;= '9') || ch == '-';
</del><ins>+        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || ch == 0x0456 || ch == 0x045E || ch == 0x2019 || isASCIIDigit(ch) || ch == '-';
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     // http://www.nic.kz/docs/poryadok_vnedreniya_kaz_ru.pdf
</span><span class="lines">@@ -397,7 +397,7 @@
</span><span class="cx">     };
</span><span class="cx">     CHECK_RULES_IF_SUFFIX_MATCHES(cyrillicKAZ, [](UChar ch) {
</span><span class="cx">         // Kazakh letters, digits and dashes are allowed.
</span><del>-        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || ch == 0x04D9 || ch == 0x0493 || ch == 0x049B || ch == 0x04A3 || ch == 0x04E9 || ch == 0x04B1 || ch == 0x04AF || ch == 0x04BB || ch == 0x0456 || (ch &gt;= '0' &amp;&amp; ch &lt;= '9') || ch == '-';
</del><ins>+        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || ch == 0x04D9 || ch == 0x0493 || ch == 0x049B || ch == 0x04A3 || ch == 0x04E9 || ch == 0x04B1 || ch == 0x04AF || ch == 0x04BB || ch == 0x0456 || isASCIIDigit(ch) || ch == '-';
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     // http://uanic.net/docs/documents-ukr/Rules%20of%20UKR_v4.0.pdf
</span><span class="lines">@@ -409,7 +409,7 @@
</span><span class="cx">     };
</span><span class="cx">     CHECK_RULES_IF_SUFFIX_MATCHES(cyrillicUKR, [](UChar ch) {
</span><span class="cx">         // Russian and Ukrainian letters, digits and dashes are allowed.
</span><del>-        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || ch == 0x0491 || ch == 0x0404 || ch == 0x0456 || ch == 0x0457 || (ch &gt;= '0' &amp;&amp; ch &lt;= '9') || ch == '-';
</del><ins>+        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || ch == 0x0491 || ch == 0x0404 || ch == 0x0456 || ch == 0x0457 || isASCIIDigit(ch) || ch == '-';
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     // http://www.rnids.rs/data/DOKUMENTI/idn-srb-policy-termsofuse-v1.4-eng.pdf
</span><span class="lines">@@ -421,7 +421,7 @@
</span><span class="cx">     };
</span><span class="cx">     CHECK_RULES_IF_SUFFIX_MATCHES(cyrillicSRB, [](UChar ch) {
</span><span class="cx">         // Serbian letters, digits and dashes are allowed.
</span><del>-        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x0438) || (ch &gt;= 0x043A &amp;&amp; ch &lt;= 0x0448) || ch == 0x0452 || ch == 0x0458 || ch == 0x0459 || ch == 0x045A || ch == 0x045B || ch == 0x045F || (ch &gt;= '0' &amp;&amp; ch &lt;= '9') || ch == '-';
</del><ins>+        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x0438) || (ch &gt;= 0x043A &amp;&amp; ch &lt;= 0x0448) || ch == 0x0452 || ch == 0x0458 || ch == 0x0459 || ch == 0x045A || ch == 0x045B || ch == 0x045F || isASCIIDigit(ch) || ch == '-';
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     // http://marnet.mk/doc/pravilnik-mk-mkd.pdf
</span><span class="lines">@@ -433,7 +433,7 @@
</span><span class="cx">     };
</span><span class="cx">     CHECK_RULES_IF_SUFFIX_MATCHES(cyrillicMKD, [](UChar ch) {
</span><span class="cx">         // Macedonian letters, digits and dashes are allowed.
</span><del>-        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x0438) || (ch &gt;= 0x043A &amp;&amp; ch &lt;= 0x0448) || ch == 0x0453 || ch == 0x0455 || ch == 0x0458 || ch == 0x0459 || ch == 0x045A || ch == 0x045C || ch == 0x045F || (ch &gt;= '0' &amp;&amp; ch &lt;= '9') || ch == '-';
</del><ins>+        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x0438) || (ch &gt;= 0x043A &amp;&amp; ch &lt;= 0x0448) || ch == 0x0453 || ch == 0x0455 || ch == 0x0458 || ch == 0x0459 || ch == 0x045A || ch == 0x045C || ch == 0x045F || isASCIIDigit(ch) || ch == '-';
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     // https://www.mon.mn/cs/
</span><span class="lines">@@ -445,7 +445,7 @@
</span><span class="cx">     };
</span><span class="cx">     CHECK_RULES_IF_SUFFIX_MATCHES(cyrillicMON, [](UChar ch) {
</span><span class="cx">         // Mongolian letters, digits and dashes are allowed.
</span><del>-        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || ch == 0x04E9 || ch == 0x04AF || (ch &gt;= '0' &amp;&amp; ch &lt;= '9') || ch == '-';
</del><ins>+        return (ch &gt;= 0x0430 &amp;&amp; ch &lt;= 0x044f) || ch == 0x0451 || ch == 0x04E9 || ch == 0x04AF || isASCIIDigit(ch) || ch == '-';
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     // Not a known top level domain with special rules.
</span><span class="lines">@@ -806,8 +806,8 @@
</span><span class="cx">         UInt8 c = inBytes[i];
</span><span class="cx">         if (c &lt;= 0x20 || c &gt;= 0x7f) {
</span><span class="cx">             *p++ = '%';
</span><del>-            *p++ = uncheckedHexDigit(c &gt;&gt; 4);
-            *p++ = uncheckedHexDigit(c &amp; 0xf);
</del><ins>+            *p++ = upperNibbleToASCIIHexDigit(c);
+            *p++ = lowerNibbleToASCIIHexDigit(c);
</ins><span class="cx">             outLength += 3;
</span><span class="cx">         } else {
</span><span class="cx">             *p++ = c;
</span><span class="lines">@@ -901,8 +901,8 @@
</span><span class="cx">         if (c &lt;= 0x20 || c &gt;= 0x7f) {
</span><span class="cx">             char escaped[3];
</span><span class="cx">             escaped[0] = '%';
</span><del>-            escaped[1] = uncheckedHexDigit(c &gt;&gt; 4);
-            escaped[2] = uncheckedHexDigit(c &amp; 0xf);
</del><ins>+            escaped[1] = upperNibbleToASCIIHexDigit(c);
+            escaped[2] = lowerNibbleToASCIIHexDigit(c);
</ins><span class="cx">             [resultData appendBytes:escaped length:3];    
</span><span class="cx">         } else {
</span><span class="cx">             char b[1];
</span><span class="lines">@@ -1013,8 +1013,8 @@
</span><span class="cx">             
</span><span class="cx">             for (CFIndex j = 0; j &lt; offset; ++j) {
</span><span class="cx">                 outBuffer.append('%');
</span><del>-                outBuffer.append(uncheckedHexDigit(utf8Buffer[j] &gt;&gt; 4));
-                outBuffer.append(uncheckedHexDigit(utf8Buffer[j] &amp; 0xf));
</del><ins>+                outBuffer.append(upperNibbleToASCIIHexDigit(utf8Buffer[j]));
+                outBuffer.append(lowerNibbleToASCIIHexDigit(utf8Buffer[j]));
</ins><span class="cx">             }
</span><span class="cx">         } else {
</span><span class="cx">             UChar utf16Buffer[2];
</span><span class="lines">@@ -1045,8 +1045,8 @@
</span><span class="cx">     for (int i = 0; i &lt; length; i++) {
</span><span class="cx">         unsigned char c = p[i];
</span><span class="cx">         // unescape escape sequences that indicate bytes greater than 0x7f
</span><del>-        if (c == '%' &amp;&amp; (i + 1 &lt; length &amp;&amp; isHexDigit(p[i + 1])) &amp;&amp; i + 2 &lt; length &amp;&amp; isHexDigit(p[i + 2])) {
-            unsigned char u = (uncheckedHexDigitValue(p[i + 1]) &lt;&lt; 4) | uncheckedHexDigitValue(p[i + 2]);
</del><ins>+        if (c == '%' &amp;&amp; (i + 1 &lt; length &amp;&amp; isASCIIHexDigit(p[i + 1])) &amp;&amp; i + 2 &lt; length &amp;&amp; isASCIIHexDigit(p[i + 2])) {
+            auto u = toASCIIHexValue(p[i + 1], p[i + 2]);
</ins><span class="cx">             if (u &gt; 0x7f) {
</span><span class="cx">                 // unescape
</span><span class="cx">                 *q++ = u;
</span><span class="lines">@@ -1083,8 +1083,8 @@
</span><span class="cx">             unsigned char c = *p;
</span><span class="cx">             if (c &gt; 0x7f) {
</span><span class="cx">                 *q++ = '%';
</span><del>-                *q++ = uncheckedHexDigit(c &gt;&gt; 4);
-                *q++ = uncheckedHexDigit(c &amp; 0xf);
</del><ins>+                *q++ = upperNibbleToASCIIHexDigit(c);
+                *q++ = lowerNibbleToASCIIHexDigit(c);
</ins><span class="cx">             } else
</span><span class="cx">                 *q++ = *p;
</span><span class="cx">             p++;
</span><span class="lines">@@ -1126,8 +1126,8 @@
</span><span class="cx">         if (c &lt;= 0x20 || c == 0x7f) {
</span><span class="cx">             valid = NO;
</span><span class="cx">             break;
</span><del>-        } else if (c == '%' &amp;&amp; (i + 1 &lt; length &amp;&amp; isHexDigit(p[i + 1])) &amp;&amp; i + 2 &lt; length &amp;&amp; isHexDigit(p[i + 2])) {
-            unsigned char u = (uncheckedHexDigitValue(p[i + 1]) &lt;&lt; 4) | uncheckedHexDigitValue(p[i + 2]);
</del><ins>+        } else if (c == '%' &amp;&amp; (i + 1 &lt; length &amp;&amp; isASCIIHexDigit(p[i + 1])) &amp;&amp; i + 2 &lt; length &amp;&amp; isASCIIHexDigit(p[i + 2])) {
+            auto u = toASCIIHexValue(p[i + 1], p[i + 2]);
</ins><span class="cx">             if (u &gt; 0x7f) {
</span><span class="cx">                 valid = NO;
</span><span class="cx">                 break;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkFormDataBuildercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/FormDataBuilder.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/FormDataBuilder.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/platform/network/FormDataBuilder.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -187,7 +187,7 @@
</span><span class="cx">     for (unsigned i = 0; i &lt; length; ++i) {
</span><span class="cx">         unsigned char c = string.data()[i];
</span><span class="cx"> 
</span><del>-        if ((c &gt;= 'A' &amp;&amp; c &lt;= 'Z') || (c &gt;= 'a' &amp;&amp; c &lt;= 'z') || (c &gt;= '0' &amp;&amp; c &lt;= '9') || strchr(safeCharacters, c))
</del><ins>+        if (isASCIIAlphanumeric(c) || strchr(safeCharacters, c))
</ins><span class="cx">             append(buffer, c);
</span><span class="cx">         else if (c == ' ')
</span><span class="cx">             append(buffer, '+');
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingmathmlRenderMathMLTokencpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLToken.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/mathml/RenderMathMLToken.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/rendering/mathml/RenderMathMLToken.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -330,15 +330,15 @@
</span><span class="cx">         Arabic
</span><span class="cx">     };
</span><span class="cx">     CharacterType varType;
</span><del>-    if ('A' &lt;= codePoint &amp;&amp; codePoint &lt;= 'Z') {
</del><ins>+    if (isASCIIUpper(codePoint)) {
</ins><span class="cx">         baseChar = codePoint - 'A';
</span><span class="cx">         varType = Latin;
</span><del>-    } else if ('a' &lt;= codePoint &amp;&amp; codePoint &lt;= 'z') {
</del><ins>+    } else if (isASCIILower(codePoint)) {
</ins><span class="cx">         // Lowercase characters are placed immediately after the uppercase characters in the Unicode mathematical block.
</span><span class="cx">         // The constant subtraction represents the number of characters between the start of the sequence (capital A) and the first lowercase letter.
</span><span class="cx">         baseChar = mathBoldSmallA - mathBoldUpperA + codePoint - 'a';
</span><span class="cx">         varType = Latin;
</span><del>-    } else if ('0' &lt;= codePoint &amp;&amp; codePoint &lt;= '9') {
</del><ins>+    } else if (isASCIIDigit(codePoint)) {
</ins><span class="cx">         baseChar = codePoint - '0';
</span><span class="cx">         varType = Number;
</span><span class="cx">     } else if (greekUpperAlpha &lt;= codePoint &amp;&amp; codePoint &lt;= greekUpperOmega) {
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGParserUtilitiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGParserUtilities.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGParserUtilities.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/svg/SVGParserUtilities.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -62,13 +62,12 @@
</span><span class="cx">         sign = -1;
</span><span class="cx">     } 
</span><span class="cx">     
</span><del>-    if (ptr == end || ((*ptr &lt; '0' || *ptr &gt; '9') &amp;&amp; *ptr != '.'))
-        // The first character of a number must be one of [0-9+-.]
</del><ins>+    if (ptr == end || (!isASCIIDigit(*ptr) &amp;&amp; *ptr != '.'))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     // read the integer part, build right-to-left
</span><span class="cx">     const CharacterType* ptrStartIntPart = ptr;
</span><del>-    while (ptr &lt; end &amp;&amp; *ptr &gt;= '0' &amp;&amp; *ptr &lt;= '9')
</del><ins>+    while (ptr &lt; end &amp;&amp; isASCIIDigit(*ptr))
</ins><span class="cx">         ++ptr; // Advance to first non-digit.
</span><span class="cx"> 
</span><span class="cx">     if (ptr != ptrStartIntPart) {
</span><span class="lines">@@ -87,10 +86,10 @@
</span><span class="cx">         ptr++;
</span><span class="cx">         
</span><span class="cx">         // There must be a least one digit following the .
</span><del>-        if (ptr &gt;= end || *ptr &lt; '0' || *ptr &gt; '9')
</del><ins>+        if (ptr &gt;= end || !isASCIIDigit(*ptr))
</ins><span class="cx">             return false;
</span><span class="cx">         
</span><del>-        while (ptr &lt; end &amp;&amp; *ptr &gt;= '0' &amp;&amp; *ptr &lt;= '9')
</del><ins>+        while (ptr &lt; end &amp;&amp; isASCIIDigit(*ptr))
</ins><span class="cx">             decimal += (*(ptr++) - '0') * (frac *= static_cast&lt;FloatType&gt;(0.1));
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -108,10 +107,10 @@
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         // There must be an exponent
</span><del>-        if (ptr &gt;= end || *ptr &lt; '0' || *ptr &gt; '9')
</del><ins>+        if (ptr &gt;= end || !isASCIIDigit(*ptr))
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        while (ptr &lt; end &amp;&amp; *ptr &gt;= '0' &amp;&amp; *ptr &lt;= '9') {
</del><ins>+        while (ptr &lt; end &amp;&amp; isASCIIDigit(*ptr)) {
</ins><span class="cx">             exponent *= static_cast&lt;FloatType&gt;(10);
</span><span class="cx">             exponent += *ptr - '0';
</span><span class="cx">             ptr++;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPathStringSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPathStringSource.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPathStringSource.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/svg/SVGPathStringSource.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -134,7 +134,7 @@
</span><span class="cx"> static bool nextCommandHelper(const CharacterType*&amp; current, SVGPathSegType previousCommand, SVGPathSegType&amp; nextCommand)
</span><span class="cx"> {
</span><span class="cx">     // Check for remaining coordinates in the current command.
</span><del>-    if ((*current == '+' || *current == '-' || *current == '.' || (*current &gt;= '0' &amp;&amp; *current &lt;= '9'))
</del><ins>+    if ((*current == '+' || *current == '-' || *current == '.' || isASCIIDigit(*current))
</ins><span class="cx">         &amp;&amp; previousCommand != PathSegClosePath) {
</span><span class="cx">         if (previousCommand == PathSegMoveToAbs) {
</span><span class="cx">             nextCommand = PathSegLineToAbs;
</span></span></pre></div>
<a id="trunkSourceWebCorexmlXPathParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/xml/XPathParser.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/xml/XPathParser.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebCore/xml/XPathParser.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -209,7 +209,7 @@
</span><span class="cx">         UChar aChar = m_data[m_nextPos];
</span><span class="cx">         if (aChar &gt;= 0xff) break;
</span><span class="cx"> 
</span><del>-        if (aChar &lt; '0' || aChar &gt; '9') {
</del><ins>+        if (!isASCIIDigit(aChar)) {
</ins><span class="cx">             if (aChar == '.' &amp;&amp; !seenDot)
</span><span class="cx">                 seenDot = true;
</span><span class="cx">             else
</span><span class="lines">@@ -283,7 +283,7 @@
</span><span class="cx">         char next = peekAheadHelper();
</span><span class="cx">         if (next == '.')
</span><span class="cx">             return makeTokenAndAdvance(DOTDOT, 2);
</span><del>-        if (next &gt;= '0' &amp;&amp; next &lt;= '9')
</del><ins>+        if (isASCIIDigit(next))
</ins><span class="cx">             return lexNumber();
</span><span class="cx">         return makeTokenAndAdvance('.');
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebKit2/ChangeLog        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-12-04  Darin Adler  &lt;darin@apple.com&gt;
+
+        Use ASCIICType more, and improve it a little bit
+        https://bugs.webkit.org/show_bug.cgi?id=165360
+
+        Reviewed by Sam Weinig.
+
+        * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
+        (WebKit::capitalizeRFC822HeaderFieldName): Removed unneeded checks to simplify code.
+
</ins><span class="cx"> 2016-12-06  Dave Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Parser] Turn on the new CSS parser
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsNetscapeNetscapeBrowserFuncscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp (209398 => 209399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp        2016-12-06 17:14:03 UTC (rev 209398)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp        2016-12-06 17:18:20 UTC (rev 209399)
</span><span class="lines">@@ -131,25 +131,13 @@
</span><span class="cx"> {
</span><span class="cx">     bool capitalizeCharacter = true;
</span><span class="cx">     StringBuilder result;
</span><del>-
</del><span class="cx">     for (unsigned i = 0; i &lt; name.length(); i++) {
</span><del>-        UChar c;
-
-        if (capitalizeCharacter &amp;&amp; name[i] &gt;= 'a' &amp;&amp; name[i] &lt;= 'z')
-            c = toASCIIUpper(name[i]);
-        else if (!capitalizeCharacter &amp;&amp; name[i] &gt;= 'A' &amp;&amp; name[i] &lt;= 'Z')
-            c = toASCIILower(name[i]);
-        else
-            c = name[i];
-
</del><ins>+        result.append(capitalizeCharacter ? toASCIIUpper(name[i]) : toASCIILower(name[i]));
</ins><span class="cx">         if (name[i] == '-')
</span><span class="cx">             capitalizeCharacter = true;
</span><span class="cx">         else
</span><span class="cx">             capitalizeCharacter = false;
</span><del>-
-        result.append(c);
</del><span class="cx">     }
</span><del>-
</del><span class="cx">     return result.toString();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>