<!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 <darin@apple.com>
+
+ 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 <ossy@webkit.org>
</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 < digits; ++i) {
</span><del>- UChar c = *start++;
- if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= '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' <= c && c <= '9')
- return c - '0';
- if ('A' <= c && c <= 'F')
- return c - 'A' + 10;
- if ('a' <= c && c <= 'f')
- return c - 'a' + 10;
-
- ASSERT_NOT_REACHED();
- return 0;
-}
-
</del><span class="cx"> bool decodeString(const UChar* start, const UChar* end, StringBuilder& output)
</span><span class="cx"> {
</span><span class="cx"> while (start < 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) << 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) << 12) +
- (hexToInt(*(start + 1)) << 8) +
- (hexToInt(*(start + 2)) << 4) +
- hexToInt(*(start + 3));
</del><ins>+ c = toASCIIHexValue(start[0], start[1]) << 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 >= '0' && c <= '9')
</del><ins>+ if (isASCIIDigit(c))
</ins><span class="cx"> digit = c - '0';
</span><del>- else if (c >= 'A' && c <= 'Z')
</del><ins>+ else if (isASCIIUpper(c))
</ins><span class="cx"> digit = c - 'A' + 10;
</span><del>- else if (c >= 'a' && c <= '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 >= 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 && ref >= '0' && ref <= '9') {
</del><ins>+ } else if (reg && 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 > reg->numSubpatterns())
</span><span class="lines">@@ -227,7 +227,7 @@
</span><span class="cx"> continue;
</span><span class="cx"> if (replacement.length() > i + 2) {
</span><span class="cx"> ref = replacement[i + 2];
</span><del>- if (ref >= '0' && ref <= '9') {
</del><ins>+ if (isASCIIDigit(ref)) {
</ins><span class="cx"> backrefIndex = 10 * backrefIndex + ref - '0';
</span><span class="cx"> if (backrefIndex > reg->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 <darin@apple.com>
+
+ 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 <pecoraro@apple.com>
</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<typename CharacterType> bool isASCII(CharacterType);
+template<typename CharacterType> bool isASCIIAlpha(CharacterType);
+template<typename CharacterType> bool isASCIIAlphanumeric(CharacterType);
+template<typename CharacterType> bool isASCIIBinaryDigit(CharacterType);
+template<typename CharacterType> bool isASCIIDigit(CharacterType);
+template<typename CharacterType> bool isASCIIHexDigit(CharacterType);
+template<typename CharacterType> bool isASCIILower(CharacterType);
+template<typename CharacterType> bool isASCIIOctalDigit(CharacterType);
+template<typename CharacterType> bool isASCIIPrintable(CharacterType);
+template<typename CharacterType> bool isASCIISpace(CharacterType);
+template<typename CharacterType> bool isASCIIUpper(CharacterType);
+
+template<typename CharacterType> CharacterType toASCIILower(CharacterType);
+template<typename CharacterType> CharacterType toASCIIUpper(CharacterType);
+
+template<typename CharacterType> uint8_t toASCIIHexValue(CharacterType);
+template<typename CharacterType> uint8_t toASCIIHexValue(CharacterType firstCharacter, CharacterType secondCharacter);
+
+char lowerNibbleToASCIIHexDigit(uint8_t);
+char upperNibbleToASCIIHexDigit(uint8_t);
+char lowerNibbleToLowercaseASCIIHexDigit(uint8_t);
+char upperNibbleToLowercaseASCIIHexDigit(uint8_t);
+
+template<typename CharacterType> 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<typename CharacterType> 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] = "0123456789abcdef";
-const LChar upperHexDigits[17] = "0123456789ABCDEF";
</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] = "0123456789abcdef";
+ static const LChar uppercaseHexDigits[17] = "0123456789ABCDEF";
+ 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<typename T>
</span><span class="cx"> inline void appendByteAsHex(unsigned char byte, T& 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 >> 4]);
</span><span class="cx"> destination.append(hexDigits[byte & 0xF]);
</span><span class="cx"> }
</span><span class="lines">@@ -51,7 +48,7 @@
</span><span class="cx"> template<typename T>
</span><span class="cx"> inline void placeByteAsHexCompressIfPossible(unsigned char byte, T& destination, unsigned& 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 >= 0x10)
</span><span class="cx"> destination[index++] = hexDigits[byte >> 4];
</span><span class="cx"> destination[index++] = hexDigits[byte & 0xF];
</span><span class="lines">@@ -60,7 +57,7 @@
</span><span class="cx"> template<typename T>
</span><span class="cx"> inline void placeByteAsHex(unsigned char byte, T& 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 >> 4];
</span><span class="cx"> *destination++ = hexDigits[byte & 0xF];
</span><span class="cx"> }
</span><span class="lines">@@ -68,7 +65,7 @@
</span><span class="cx"> template<typename T>
</span><span class="cx"> inline void appendUnsignedAsHex(unsigned number, T& 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<LChar, 8> 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<typename T>
</span><span class="cx"> inline void appendUnsigned64AsHex(uint64_t number, T& 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<LChar, 8> 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<LChar, 8> 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 >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
-}
-
-inline char uncheckedHexDigit(int i)
-{
- if (i < 0 || i > 16)
- return '0';
-
- return (i >= 10) ? i - 10 + 'A' : i + '0';
-}
-
-inline bool hexDigitValue(char c, char& result)
-{
- if (c >= '0' && c <= '9') {
- result = c - '0';
- return true;
- }
-
- if (c >= 'A' && c <= 'F') {
- result = c - 'A' + 10;
- return true;
- }
-
- if (c >= 'a' && c <= 'f') {
- result = c - 'a' + 10;
- return true;
- }
-
- return false;
-}
-
-inline int uncheckedHexDigitValue(char c)
-{
- if (c >= '0' && c <= '9')
- return c - '0';
-
- if (c >= 'A' && c <= 'F')
- return c - 'A' + 10;
-
- if (c >= 'a' && c <= '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 "config.h"
</span><span class="cx"> #include "SixCharacterHash.h"
</span><span class="cx">
</span><del>-#include <wtf/StdLibExtras.h>
</del><ins>+#include <wtf/ASCIICType.h>
</ins><span class="cx">
</span><del>-#include <string.h>
-
</del><span class="cx"> namespace WTF {
</span><span class="cx">
</span><del>-#define TABLE ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
-
</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 < 6; ++i) {
</span><span class="cx"> hash *= 62;
</span><span class="cx"> unsigned c = string[i];
</span><del>- if (c >= 'A' && c <= '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 >= 'a' && c <= '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 >= '0' && c <= '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<char, 7> integerToSixCharacterHashString(unsigned hash)
</span><span class="cx"> {
</span><del>- static_assert(WTF_ARRAY_LENGTH(TABLE) - 1 == 62, "Six character hash table is not 62 characters long.");
-
</del><ins>+ static const char table[63] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
</ins><span class="cx"> std::array<char, 7> 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 "bignum.h"
</span><span class="cx"> #include "utils.h"
</span><ins>+#include <wtf/ASCIICType.h>
</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' <= c && c <= '9') return c - '0';
- if ('a' <= c && c <= 'f') return 10 + c - 'a';
- if ('A' <= c && c <= 'F') return 10 + c - 'A';
- UNREACHABLE();
- return 0; // To make compiler happy.
- }
-
-
</del><span class="cx"> void Bignum::AssignHexString(BufferReference<const char> 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 "full".
</span><span class="cx"> Chunk current_bigit = 0;
</span><span class="cx"> for (int j = 0; j < kBigitSize / 4; j++) {
</span><del>- current_bigit += HexCharValue(value[string_index--]) << (j * 4);
</del><ins>+ current_bigit += toASCIIHexValue(value[string_index--]) << (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 <= string_index; ++j) {
</span><span class="cx"> most_significant_bigit <<= 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 "config.h"
</span><del>-
-#include <limits.h>
-#include <math.h>
-
</del><span class="cx"> #include "double-conversion.h"
</span><span class="cx">
</span><span class="cx"> #include "bignum-dtoa.h"
</span><span class="lines">@@ -38,6 +34,9 @@
</span><span class="cx"> #include "fixed-dtoa.h"
</span><span class="cx"> #include "strtod.h"
</span><span class="cx"> #include "utils.h"
</span><ins>+#include <limits.h>
+#include <math.h>
+#include <wtf/ASCIICType.h>
</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 >= '0' && *current <= '9') {
</del><ins>+ while (isASCIIDigit(*current)) {
</ins><span class="cx"> if (significant_digits < kMaxSignificantDigits) {
</span><span class="cx"> ASSERT(buffer_pos < kBufferSize);
</span><span class="cx"> buffer[buffer_pos++] = static_cast<char>(*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 >= '0' && *current <= '9') {
</del><ins>+ while (isASCIIDigit(*current)) {
</ins><span class="cx"> if (significant_digits < kMaxSignificantDigits) {
</span><span class="cx"> ASSERT(buffer_pos < kBufferSize);
</span><span class="cx"> buffer[buffer_pos++] = static_cast<char>(*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 && *current >= '0' && *current <= '9');
</del><ins>+ } while (current != end && 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 & 0xFF00) == 0);
</span><del>- static const char hexDigits[] = "0123456789abcdef";
</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<LChar>(hexDigits[(*input >> 4) & 0xF]);
- *output++ = static_cast<LChar>(hexDigits[*input & 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 < length; ++i) {
</span><span class="cx"> LChar c = m_data8[i];
</span><span class="cx"> ored |= c;
</span><del>-#if CPU(X86) && defined(_MSC_VER) && _MSC_VER >=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 >= 'a' && c <= 'z' ? c & ~0x20 : c;
-#else
</del><span class="cx"> data8[i] = toASCIIUpper(c);
</span><del>-#endif
</del><span class="cx"> }
</span><span class="cx"> if (!(ored & ~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 <darin@apple.com>
+
+ 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 <ryanhaddad@apple.com>
</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 < 3; ++i)
</span><del>- if (statusCodeString[i] < '0' || statusCodeString[i] > '9') {
</del><ins>+ if (!isASCIIDigit(statusCodeString[i])) {
</ins><span class="cx"> m_failureReason = makeString("Invalid status code: ", 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"> $$->setValue($1, parser->m_context.mode == HTMLQuirksMode);
</span><span class="cx"> }
</span><span class="cx"> | HEX {
</span><del>- if ($1[0] >= '0' && $1[0] <= '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 >= '0' && c <= '9')
- from += c - '0';
- else if (c >= 'A' && c <= 'F')
- from += 10 + c - 'A';
- else if (c >= 'a' && c <= '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 < length) {
</span><span class="cx"> UChar c = rangeString[i];
</span><span class="cx"> to *= 16;
</span><del>- if (c >= '0' && c <= '9')
- to += c - '0';
- else if (c >= 'A' && c <= 'F')
- to += 10 + c - 'A';
- else if (c >= 'a' && c <= '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 >= 'a' && *constantString <= '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 != '-' && (ch > 'z' || ch < 'a');
</del><ins>+ return !(ch == '-' || isASCIILower(ch));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> std::unique_ptr<SavedFormState> SavedFormState::deserialize(const Vector<String>& stateVector, size_t& 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 >= 'A' && c <= 'Z') || (c >= 'a' && c <= '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 >= '0' && ch <= '9') {
</del><ins>+ if (isASCIIDigit(ch)) {
</ins><span class="cx"> if (numberOfDigits < 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 >= '0' && ch <= '9') {
</del><ins>+ if (isASCIIDigit(ch)) {
</ins><span class="cx"> if (numberOfDigits < 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 >= '0' && ch <= '9') {
</del><ins>+ if (isASCIIDigit(ch)) {
</ins><span class="cx"> if (numberOfDigits < 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 >= '0' && ch <= '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 >= '0' && ch <= '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 > 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 >= '0' && ch <= '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 << 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 >= 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 << 12;
-
- if (!hexDigitValue(inputString[i + 3], value))
</del><ins>+ if (!isASCIIHexDigit(inputString[i + 3]))
</ins><span class="cx"> return { };
</span><del>- character = character | (value << 8);
-
- if (!hexDigitValue(inputString[i + 4], value))
</del><ins>+ if (!isASCIIHexDigit(inputString[i + 4]))
</ins><span class="cx"> return { };
</span><del>- character = character | (value << 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]) << 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 << 0,
</span><span class="lines">@@ -356,14 +344,6 @@
</span><span class="cx"> static inline bool isBadChar(unsigned char c) { return characterClassTable[c] & BadChar; }
</span><span class="cx"> static inline bool isTabNewline(UChar c) { return c <= 0xff && (characterClassTable[c] & TabNewline); }
</span><span class="cx">
</span><del>-static inline bool isSchemeCharacterMatchIgnoringCase(char character, char schemeCharacter)
-{
- ASSERT(isSchemeChar(character));
- ASSERT(schemeCharacter & 0x20);
- ASSERT(isASCIILower(schemeCharacter) || (!isASCIIUpper(schemeCharacter) && isSchemeChar(schemeCharacter)));
- return (character | 0x20) == schemeCharacter;
-}
-
</del><span class="cx"> String encodeWithURLEscapeSequences(const String& 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 < protocol.length(); ++i) {
- const char c = protocol[i];
- ASSERT(c > ' ' && c < 0x7F && !(c >= 'A' && c <= '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 > ' ');
+ 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 < 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 < 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<size_t length>
</span><span class="lines">@@ -1537,16 +1526,16 @@
</span><span class="cx"> bool hasSecondSlash = hierarchical && url[schemeEnd + 2] == '/';
</span><span class="cx">
</span><span class="cx"> bool isFile = schemeEnd == 4
</span><del>- && isLetterMatchIgnoringCase(url[0], 'f')
- && isLetterMatchIgnoringCase(url[1], 'i')
- && isLetterMatchIgnoringCase(url[2], 'l')
- && isLetterMatchIgnoringCase(url[3], 'e');
</del><ins>+ && isASCIIAlphaCaselessEqual(url[0], 'f')
+ && isASCIIAlphaCaselessEqual(url[1], 'i')
+ && isASCIIAlphaCaselessEqual(url[2], 'l')
+ && isASCIIAlphaCaselessEqual(url[3], 'e');
</ins><span class="cx">
</span><del>- m_protocolIsInHTTPFamily = isLetterMatchIgnoringCase(url[0], 'h')
- && isLetterMatchIgnoringCase(url[1], 't')
- && isLetterMatchIgnoringCase(url[2], 't')
- && isLetterMatchIgnoringCase(url[3], 'p')
- && (url[4] == ':' || (isLetterMatchIgnoringCase(url[4], 's') && url[5] == ':'));
</del><ins>+ m_protocolIsInHTTPFamily = isASCIIAlphaCaselessEqual(url[0], 'h')
+ && isASCIIAlphaCaselessEqual(url[1], 't')
+ && isASCIIAlphaCaselessEqual(url[2], 't')
+ && isASCIIAlphaCaselessEqual(url[3], 'p')
+ && (url[4] == ':' || (isASCIIAlphaCaselessEqual(url[4], 's') && url[5] == ':'));
</ins><span class="cx">
</span><span class="cx"> if ((hierarchical && 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>- && isLetterMatchIgnoringCase(url[userStart], 'l')
- && isLetterMatchIgnoringCase(url[userStart+1], 'o')
- && isLetterMatchIgnoringCase(url[userStart+2], 'c')
- && isLetterMatchIgnoringCase(url[userStart+3], 'a')
- && isLetterMatchIgnoringCase(url[userStart+4], 'l')
- && isLetterMatchIgnoringCase(url[userStart+5], 'h')
- && isLetterMatchIgnoringCase(url[userStart+6], 'o')
- && isLetterMatchIgnoringCase(url[userStart+7], 's')
- && isLetterMatchIgnoringCase(url[userStart+8], 't');
</del><ins>+ && isASCIIAlphaCaselessEqual(url[userStart], 'l')
+ && isASCIIAlphaCaselessEqual(url[userStart+1], 'o')
+ && isASCIIAlphaCaselessEqual(url[userStart+2], 'c')
+ && isASCIIAlphaCaselessEqual(url[userStart+3], 'a')
+ && isASCIIAlphaCaselessEqual(url[userStart+4], 'l')
+ && isASCIIAlphaCaselessEqual(url[userStart+5], 'h')
+ && isASCIIAlphaCaselessEqual(url[userStart+6], 'o')
+ && isASCIIAlphaCaselessEqual(url[userStart+7], 's')
+ && 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 && (hostStart == hostEnd || hostIsLocalHost);
</span><span class="lines">@@ -1975,7 +1964,7 @@
</span><span class="cx"> for (unsigned i = 0; i < 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("%s\n", 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& 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')
- && isLetterMatchIgnoringCase(url[1], 't')
- && isLetterMatchIgnoringCase(url[2], 't')
- && isLetterMatchIgnoringCase(url[3], 'p')
- && (url[4] == ':' || (isLetterMatchIgnoringCase(url[4], 's') && url[5] == ':'));
</del><ins>+ return isASCIIAlphaCaselessEqual(url[0], 'h')
+ && isASCIIAlphaCaselessEqual(url[1], 't')
+ && isASCIIAlphaCaselessEqual(url[2], 't')
+ && isASCIIAlphaCaselessEqual(url[3], 'p')
+ && (url[4] == ':' || (isASCIIAlphaCaselessEqual(url[4], 's') && url[5] == ':'));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const URL& 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 < '0' || *iterator > '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 >= 0x0430 && ch <= 0x044f) || ch == 0x0451 || (ch >= '0' && ch <= '9') || ch == '-';
</del><ins>+ return (ch >= 0x0430 && ch <= 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 >= 0x0430 && ch <= 0x044f) || ch == 0x0451 || ch == 0x0456 || ch == 0x045E || ch == 0x2019 || (ch >= '0' && ch <= '9') || ch == '-';
</del><ins>+ return (ch >= 0x0430 && ch <= 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 >= 0x0430 && ch <= 0x044f) || ch == 0x0451 || ch == 0x04D9 || ch == 0x0493 || ch == 0x049B || ch == 0x04A3 || ch == 0x04E9 || ch == 0x04B1 || ch == 0x04AF || ch == 0x04BB || ch == 0x0456 || (ch >= '0' && ch <= '9') || ch == '-';
</del><ins>+ return (ch >= 0x0430 && ch <= 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 >= 0x0430 && ch <= 0x044f) || ch == 0x0451 || ch == 0x0491 || ch == 0x0404 || ch == 0x0456 || ch == 0x0457 || (ch >= '0' && ch <= '9') || ch == '-';
</del><ins>+ return (ch >= 0x0430 && ch <= 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 >= 0x0430 && ch <= 0x0438) || (ch >= 0x043A && ch <= 0x0448) || ch == 0x0452 || ch == 0x0458 || ch == 0x0459 || ch == 0x045A || ch == 0x045B || ch == 0x045F || (ch >= '0' && ch <= '9') || ch == '-';
</del><ins>+ return (ch >= 0x0430 && ch <= 0x0438) || (ch >= 0x043A && ch <= 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 >= 0x0430 && ch <= 0x0438) || (ch >= 0x043A && ch <= 0x0448) || ch == 0x0453 || ch == 0x0455 || ch == 0x0458 || ch == 0x0459 || ch == 0x045A || ch == 0x045C || ch == 0x045F || (ch >= '0' && ch <= '9') || ch == '-';
</del><ins>+ return (ch >= 0x0430 && ch <= 0x0438) || (ch >= 0x043A && ch <= 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 >= 0x0430 && ch <= 0x044f) || ch == 0x0451 || ch == 0x04E9 || ch == 0x04AF || (ch >= '0' && ch <= '9') || ch == '-';
</del><ins>+ return (ch >= 0x0430 && ch <= 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 <= 0x20 || c >= 0x7f) {
</span><span class="cx"> *p++ = '%';
</span><del>- *p++ = uncheckedHexDigit(c >> 4);
- *p++ = uncheckedHexDigit(c & 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 <= 0x20 || c >= 0x7f) {
</span><span class="cx"> char escaped[3];
</span><span class="cx"> escaped[0] = '%';
</span><del>- escaped[1] = uncheckedHexDigit(c >> 4);
- escaped[2] = uncheckedHexDigit(c & 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 < offset; ++j) {
</span><span class="cx"> outBuffer.append('%');
</span><del>- outBuffer.append(uncheckedHexDigit(utf8Buffer[j] >> 4));
- outBuffer.append(uncheckedHexDigit(utf8Buffer[j] & 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 < 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 == '%' && (i + 1 < length && isHexDigit(p[i + 1])) && i + 2 < length && isHexDigit(p[i + 2])) {
- unsigned char u = (uncheckedHexDigitValue(p[i + 1]) << 4) | uncheckedHexDigitValue(p[i + 2]);
</del><ins>+ if (c == '%' && (i + 1 < length && isASCIIHexDigit(p[i + 1])) && i + 2 < length && isASCIIHexDigit(p[i + 2])) {
+ auto u = toASCIIHexValue(p[i + 1], p[i + 2]);
</ins><span class="cx"> if (u > 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 > 0x7f) {
</span><span class="cx"> *q++ = '%';
</span><del>- *q++ = uncheckedHexDigit(c >> 4);
- *q++ = uncheckedHexDigit(c & 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 <= 0x20 || c == 0x7f) {
</span><span class="cx"> valid = NO;
</span><span class="cx"> break;
</span><del>- } else if (c == '%' && (i + 1 < length && isHexDigit(p[i + 1])) && i + 2 < length && isHexDigit(p[i + 2])) {
- unsigned char u = (uncheckedHexDigitValue(p[i + 1]) << 4) | uncheckedHexDigitValue(p[i + 2]);
</del><ins>+ } else if (c == '%' && (i + 1 < length && isASCIIHexDigit(p[i + 1])) && i + 2 < length && isASCIIHexDigit(p[i + 2])) {
+ auto u = toASCIIHexValue(p[i + 1], p[i + 2]);
</ins><span class="cx"> if (u > 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 < length; ++i) {
</span><span class="cx"> unsigned char c = string.data()[i];
</span><span class="cx">
</span><del>- if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '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' <= codePoint && codePoint <= 'Z') {
</del><ins>+ if (isASCIIUpper(codePoint)) {
</ins><span class="cx"> baseChar = codePoint - 'A';
</span><span class="cx"> varType = Latin;
</span><del>- } else if ('a' <= codePoint && codePoint <= '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' <= codePoint && codePoint <= '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 <= codePoint && codePoint <= 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 < '0' || *ptr > '9') && *ptr != '.'))
- // The first character of a number must be one of [0-9+-.]
</del><ins>+ if (ptr == end || (!isASCIIDigit(*ptr) && *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 < end && *ptr >= '0' && *ptr <= '9')
</del><ins>+ while (ptr < end && 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 >= end || *ptr < '0' || *ptr > '9')
</del><ins>+ if (ptr >= end || !isASCIIDigit(*ptr))
</ins><span class="cx"> return false;
</span><span class="cx">
</span><del>- while (ptr < end && *ptr >= '0' && *ptr <= '9')
</del><ins>+ while (ptr < end && isASCIIDigit(*ptr))
</ins><span class="cx"> decimal += (*(ptr++) - '0') * (frac *= static_cast<FloatType>(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 >= end || *ptr < '0' || *ptr > '9')
</del><ins>+ if (ptr >= end || !isASCIIDigit(*ptr))
</ins><span class="cx"> return false;
</span><span class="cx">
</span><del>- while (ptr < end && *ptr >= '0' && *ptr <= '9') {
</del><ins>+ while (ptr < end && isASCIIDigit(*ptr)) {
</ins><span class="cx"> exponent *= static_cast<FloatType>(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*& current, SVGPathSegType previousCommand, SVGPathSegType& nextCommand)
</span><span class="cx"> {
</span><span class="cx"> // Check for remaining coordinates in the current command.
</span><del>- if ((*current == '+' || *current == '-' || *current == '.' || (*current >= '0' && *current <= '9'))
</del><ins>+ if ((*current == '+' || *current == '-' || *current == '.' || isASCIIDigit(*current))
</ins><span class="cx"> && 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 >= 0xff) break;
</span><span class="cx">
</span><del>- if (aChar < '0' || aChar > '9') {
</del><ins>+ if (!isASCIIDigit(aChar)) {
</ins><span class="cx"> if (aChar == '.' && !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 >= '0' && next <= '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 <darin@apple.com>
+
+ 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 <hyatt@apple.com>
</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 < name.length(); i++) {
</span><del>- UChar c;
-
- if (capitalizeCharacter && name[i] >= 'a' && name[i] <= 'z')
- c = toASCIIUpper(name[i]);
- else if (!capitalizeCharacter && name[i] >= 'A' && name[i] <= '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>