Skip to content

Commit df4aa62

Browse files
committed
Have ""_span be constexpr and return a std::span<const char> instead of std::span<const LChar>
https://bugs.webkit.org/show_bug.cgi?id=286388 Reviewed by Darin Adler. Have ""_span be `constexpr` and return a `std::span<const char>` instead of `std::span<const LChar>`. One can still get a `std::span<const LChar>` by using ""_span8. One big benefit of ""_span is that it now can be used to initialize `constexpr` variables since it doesn't require converting into LChar using `byteCast<>()`. * Source/JavaScriptCore/API/JSStringRefCF.cpp: (JSStringCreateWithCFString): * Source/JavaScriptCore/runtime/Options.cpp: (JSC::OptionsHelper::Option::dump const): * Source/JavaScriptCore/wasm/WasmSectionParser.cpp: (JSC::Wasm::SectionParser::parseCustom): * Source/WTF/wtf/DateMath.cpp: (WTF::findMonth): (WTF::parseDate): * Source/WTF/wtf/URLParser.cpp: (WTF::URLParser::parse): (WTF::URLParser::serializeIPv6): * Source/WTF/wtf/text/ASCIILiteral.h: (WTF::StringLiterals::operator_span): (WTF::StringLiterals::operator_span8): * Source/WebCore/Modules/mediastream/RTCRtpSFrameTransformerCocoa.cpp: (WebCore::RTCRtpSFrameTransformer::computeSaltKey): (WebCore::createBaseSFrameKey): (WebCore::RTCRtpSFrameTransformer::computeAuthenticationKey): (WebCore::RTCRtpSFrameTransformer::computeEncryptionKey): * Source/WebCore/Modules/push-api/PushMessageCrypto.cpp: (WebCore::PushCrypto::decryptAES128GCMPayload): (WebCore::PushCrypto::decryptAESGCMPayload): * Source/WebCore/dom/make_names.pl: (generateFindNameForLength): * Source/WebCore/html/track/VTTCue.cpp: (WebCore::VTTCue::settingName): * Source/WebCore/html/track/VTTRegion.cpp: (WebCore::VTTRegion::scanSettingName): * Source/WebCore/html/track/WebVTTParser.cpp: (WebCore::WebVTTParser::fileFinished): (WebCore::WebVTTParser::collectTimingsAndSettings): * Source/WebCore/loader/TextResourceDecoder.cpp: (WebCore::findXMLEncoding): (WebCore::TextResourceDecoder::checkForCSSCharset): * Source/WebCore/platform/network/DNS.cpp: (WebCore::IPAddress::isLoopback const): * Source/WebCore/rendering/RenderQuote.cpp: (WebCore::subtagCompare): (WebCore::quotesForLanguage): Canonical link: https://commits.webkit.org/289290@main
1 parent bd9273e commit df4aa62

16 files changed

Lines changed: 68 additions & 58 deletions

File tree

‎Source/JavaScriptCore/API/JSStringRefCF.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ JSStringRef JSStringCreateWithCFString(CFStringRef string)
4343
// it can hold. (<rdar://problem/6806478>)
4444
size_t length = CFStringGetLength(string);
4545
if (!length)
46-
return &OpaqueJSString::create(""_span).leakRef();
46+
return &OpaqueJSString::create(""_span8).leakRef();
4747

4848
Vector<LChar, 1024> lcharBuffer(length);
4949
CFIndex usedBufferLength;

‎Source/JavaScriptCore/runtime/Options.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1442,7 +1442,7 @@ void Option::dump(StringBuilder& builder) const
14421442
builder.append(span(m_optionRange.rangeString()));
14431443
break;
14441444
case Options::Type::OptionString:
1445-
builder.append('"', m_optionString ? span8(m_optionString) : ""_span, '"');
1445+
builder.append('"', m_optionString ? span8(m_optionString) : ""_span8, '"');
14461446
break;
14471447
case Options::Type::GCLogLevel:
14481448
builder.append(m_gcLogLevel);

‎Source/JavaScriptCore/wasm/WasmSectionParser.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,17 +1362,17 @@ auto SectionParser::parseCustom() -> PartialResult
13621362
section.payload[byteNumber] = byte;
13631363
}
13641364

1365-
if (WTF::Unicode::equal("name"_span, section.name.span())) {
1365+
if (WTF::Unicode::equal("name"_span8, section.name.span())) {
13661366
NameSectionParser nameSectionParser(section.payload, m_info);
13671367
auto nameSection = nameSectionParser.parse();
13681368
if (nameSection)
13691369
m_info->nameSection = WTFMove(*nameSection);
13701370
else
13711371
dataLogLnIf(Options::dumpWasmWarnings(), "Could not parse name section: ", nameSection.error());
1372-
} else if (WTF::Unicode::equal("metadata.code.branch_hint"_span, section.name.span())) {
1372+
} else if (WTF::Unicode::equal("metadata.code.branch_hint"_span8, section.name.span())) {
13731373
BranchHintsSectionParser branchHintsSectionParser(section.payload, m_info);
13741374
branchHintsSectionParser.parse();
1375-
} else if (WTF::Unicode::equal("sourceMappingURL"_span, section.name.span())) {
1375+
} else if (WTF::Unicode::equal("sourceMappingURL"_span8, section.name.span())) {
13761376
SourceMappingURLSectionParser sourceMappingURLSectionParser(section.payload, m_info);
13771377
sourceMappingURLSectionParser.parse();
13781378
}

‎Source/WTF/wtf/DateMath.cpp‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ static int findMonth(std::span<const LChar> monthStr)
413413
std::array<LChar, 3> needle;
414414
for (unsigned i = 0; i < 3; ++i)
415415
needle[i] = toASCIILower(monthStr[i]);
416-
auto haystack = "janfebmaraprmayjunjulaugsepoctnovdec"_span;
416+
constexpr auto haystack = "janfebmaraprmayjunjulaugsepoctnovdec"_span;
417417
if (size_t index = find(haystack, std::span { needle }); index != notFound) {
418418
if (!(index % 3))
419419
return index / 3;
@@ -854,13 +854,13 @@ double parseDate(std::span<const LChar> dateString, bool& isLocalTime)
854854

855855
skipSpacesAndComments(dateString);
856856

857-
if (skipLettersExactlyIgnoringASCIICase(dateString, "am"_span)) {
857+
if (skipLettersExactlyIgnoringASCIICase(dateString, "am"_span8)) {
858858
if (hour > 12)
859859
return std::numeric_limits<double>::quiet_NaN();
860860
if (hour == 12)
861861
hour = 0;
862862
skipSpacesAndComments(dateString);
863-
} else if (skipLettersExactlyIgnoringASCIICase(dateString, "pm"_span)) {
863+
} else if (skipLettersExactlyIgnoringASCIICase(dateString, "pm"_span8)) {
864864
if (hour > 12)
865865
return std::numeric_limits<double>::quiet_NaN();
866866
if (hour != 12)
@@ -882,7 +882,7 @@ double parseDate(std::span<const LChar> dateString, bool& isLocalTime)
882882
// Don't fail if the time zone is missing.
883883
// Some websites omit the time zone (4275206).
884884
if (!dateString.empty()) {
885-
if (skipLettersExactlyIgnoringASCIICase(dateString, "gmt"_span) || skipLettersExactlyIgnoringASCIICase(dateString, "utc"_span))
885+
if (skipLettersExactlyIgnoringASCIICase(dateString, "gmt"_span8) || skipLettersExactlyIgnoringASCIICase(dateString, "utc"_span8))
886886
isLocalTime = false;
887887

888888
if (!dateString.empty() && (dateString.front() == '+' || dateString.front() == '-')) {

‎Source/WTF/wtf/URLParser.cpp‎

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,7 +1382,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
13821382
if (*c == '/' || *c == '\\') {
13831383
++c;
13841384
copyURLPartsUntil(base, URLPart::SchemeEnd, c, nonUTF8QueryEncoding);
1385-
appendToASCIIBuffer("://"_span);
1385+
appendToASCIIBuffer("://"_span8);
13861386
if (m_urlIsSpecial)
13871387
state = State::SpecialAuthorityIgnoreSlashes;
13881388
else {
@@ -1415,7 +1415,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
14151415
}
14161416
} else {
14171417
syntaxViolation(c);
1418-
appendToASCIIBuffer("//"_span);
1418+
appendToASCIIBuffer("//"_span8);
14191419
}
14201420
state = State::SpecialAuthorityIgnoreSlashes;
14211421
break;
@@ -1527,7 +1527,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
15271527
appendToASCIIBuffer('?');
15281528
++c;
15291529
} else {
1530-
appendToASCIIBuffer("///?"_span);
1530+
appendToASCIIBuffer("///?"_span8);
15311531
++c;
15321532
m_url.m_userStart = currentPosition(c) - 2;
15331533
m_url.m_userEnd = m_url.m_userStart;
@@ -1549,7 +1549,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
15491549
copyURLPartsUntil(base, URLPart::QueryEnd, c, nonUTF8QueryEncoding);
15501550
appendToASCIIBuffer('#');
15511551
} else {
1552-
appendToASCIIBuffer("///#"_span);
1552+
appendToASCIIBuffer("///#"_span8);
15531553
m_url.m_userStart = currentPosition(c) - 2;
15541554
m_url.m_userEnd = m_url.m_userStart;
15551555
m_url.m_passwordEnd = m_url.m_userStart;
@@ -1571,14 +1571,14 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
15711571
if (base.isValid() && base.protocolIsFile()) {
15721572
if (base.host().isEmpty()) {
15731573
copyURLPartsUntil(base, URLPart::SchemeEnd, c, nonUTF8QueryEncoding);
1574-
appendToASCIIBuffer(":///"_span);
1574+
appendToASCIIBuffer(":///"_span8);
15751575
} else {
15761576
copyURLPartsUntil(base, URLPart::PortEnd, c, nonUTF8QueryEncoding);
15771577
appendToASCIIBuffer('/');
15781578
copiedHost = true;
15791579
}
15801580
} else
1581-
appendToASCIIBuffer("///"_span);
1581+
appendToASCIIBuffer("///"_span8);
15821582
if (!copiedHost) {
15831583
m_url.m_userStart = currentPosition(c) - 1;
15841584
m_url.m_userEnd = m_url.m_userStart;
@@ -1601,7 +1601,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
16011601
syntaxViolation(c);
16021602
if (base.isValid() && base.protocolIsFile()) {
16031603
copyURLPartsUntil(base, URLPart::SchemeEnd, c, nonUTF8QueryEncoding);
1604-
appendToASCIIBuffer(":/"_span);
1604+
appendToASCIIBuffer(":/"_span8);
16051605
}
16061606
appendToASCIIBuffer('/');
16071607
advance(c);
@@ -1619,15 +1619,15 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
16191619
if (base.isValid() && base.protocolIsFile()) {
16201620
if (base.host().isEmpty()) {
16211621
copyURLPartsUntil(base, URLPart::SchemeEnd, c, nonUTF8QueryEncoding);
1622-
appendToASCIIBuffer(":///"_span);
1622+
appendToASCIIBuffer(":///"_span8);
16231623
} else {
16241624
copyURLPartsUntil(base, URLPart::PortEnd, c, nonUTF8QueryEncoding);
16251625
appendToASCIIBuffer('/');
16261626
copiedHost = true;
16271627
}
16281628
} else {
16291629
syntaxViolation(c);
1630-
appendToASCIIBuffer("//"_span);
1630+
appendToASCIIBuffer("//"_span8);
16311631
}
16321632
if (!copiedHost) {
16331633
m_url.m_userStart = currentPosition(c) - 1;
@@ -1662,7 +1662,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
16621662
ASSERT(windowsQuirk || parsedDataView(currentPosition(c) - 1) == '/');
16631663
if (UNLIKELY(*c == '?')) {
16641664
syntaxViolation(c);
1665-
appendToASCIIBuffer("/?"_span);
1665+
appendToASCIIBuffer("/?"_span8);
16661666
++c;
16671667
if (nonUTF8QueryEncoding) {
16681668
queryBegin = c;
@@ -1675,7 +1675,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
16751675
}
16761676
if (UNLIKELY(*c == '#')) {
16771677
syntaxViolation(c);
1678-
appendToASCIIBuffer("/#"_span);
1678+
appendToASCIIBuffer("/#"_span8);
16791679
++c;
16801680
m_url.m_pathAfterLastSlash = currentPosition(c) - 1;
16811681
m_url.m_pathEnd = m_url.m_pathAfterLastSlash;
@@ -1915,7 +1915,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
19151915
break;
19161916
}
19171917
syntaxViolation(c);
1918-
appendToASCIIBuffer("///"_span);
1918+
appendToASCIIBuffer("///"_span8);
19191919
m_url.m_userStart = currentPosition(c) - 1;
19201920
m_url.m_userEnd = m_url.m_userStart;
19211921
m_url.m_passwordEnd = m_url.m_userStart;
@@ -1933,7 +1933,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
19331933
if (base.isValid() && base.protocolIsFile()) {
19341934
if (base.host().isEmpty()) {
19351935
copyURLPartsUntil(base, URLPart::SchemeEnd, c, nonUTF8QueryEncoding);
1936-
appendToASCIIBuffer(":/"_span);
1936+
appendToASCIIBuffer(":/"_span8);
19371937
} else {
19381938
copyURLPartsUntil(base, URLPart::PortEnd, c, nonUTF8QueryEncoding);
19391939
appendToASCIIBuffer('/');
@@ -1942,7 +1942,7 @@ void URLParser::parse(std::span<const CharacterType> input, const URL& base, con
19421942
}
19431943
if (!copiedHost) {
19441944
m_url.m_userStart = currentPosition(c) + 1;
1945-
appendToASCIIBuffer("//"_span);
1945+
appendToASCIIBuffer("//"_span8);
19461946
m_url.m_userEnd = m_url.m_userStart;
19471947
m_url.m_passwordEnd = m_url.m_userStart;
19481948
m_url.m_hostEnd = m_url.m_userStart;
@@ -2159,7 +2159,7 @@ void URLParser::serializeIPv6(URLParser::IPv6Address address)
21592159
if (piece)
21602160
appendToASCIIBuffer(':');
21612161
else
2162-
appendToASCIIBuffer("::"_span);
2162+
appendToASCIIBuffer("::"_span8);
21632163
while (piece < 8 && !address[piece])
21642164
piece++;
21652165
if (piece == 8)

‎Source/WTF/wtf/text/ASCIILiteral.h‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,17 @@ constexpr ASCIILiteral operator""_s(const char* characters, size_t)
151151
return result;
152152
}
153153

154-
constexpr std::span<const LChar> operator""_span(const char* characters, size_t n)
154+
constexpr std::span<const char> operator""_span(const char* characters, size_t n)
155+
{
156+
auto span = unsafeMakeSpan(characters, n);
157+
#if ASSERT_ENABLED
158+
for (size_t i = 0, size = span.size(); i < size; ++i)
159+
ASSERT_UNDER_CONSTEXPR_CONTEXT(isASCII(span[i]));
160+
#endif
161+
return span;
162+
}
163+
164+
constexpr std::span<const LChar> operator""_span8(const char* characters, size_t n)
155165
{
156166
auto span = byteCast<LChar>(unsafeMakeSpan(characters, n));
157167
#if ASSERT_ENABLED

‎Source/WebCore/Modules/mediastream/RTCRtpSFrameTransformerCocoa.cpp‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ namespace WebCore {
3636

3737
ExceptionOr<Vector<uint8_t>> RTCRtpSFrameTransformer::computeSaltKey(const Vector<uint8_t>& rawKey)
3838
{
39-
return deriveHDKFSHA256Bits(rawKey.subspan(0, 16), "SFrame10"_span, "salt"_span, 96);
39+
return deriveHDKFSHA256Bits(rawKey.subspan(0, 16), "SFrame10"_span8, "salt"_span8, 96);
4040
}
4141

4242
static ExceptionOr<Vector<uint8_t>> createBaseSFrameKey(const Vector<uint8_t>& rawKey)
4343
{
44-
return deriveHDKFSHA256Bits(rawKey.subspan(0, 16), "SFrame10"_span, "key"_span, 128);
44+
return deriveHDKFSHA256Bits(rawKey.subspan(0, 16), "SFrame10"_span8, "key"_span8, 128);
4545
}
4646

4747
ExceptionOr<Vector<uint8_t>> RTCRtpSFrameTransformer::computeAuthenticationKey(const Vector<uint8_t>& rawKey)
@@ -50,7 +50,7 @@ ExceptionOr<Vector<uint8_t>> RTCRtpSFrameTransformer::computeAuthenticationKey(c
5050
if (key.hasException())
5151
return key;
5252

53-
return deriveHDKFSHA256Bits(key.returnValue().subspan(0, 16), "SFrame10 AES CM AEAD"_span, "auth"_span, 256);
53+
return deriveHDKFSHA256Bits(key.returnValue().subspan(0, 16), "SFrame10 AES CM AEAD"_span8, "auth"_span8, 256);
5454
}
5555

5656
ExceptionOr<Vector<uint8_t>> RTCRtpSFrameTransformer::computeEncryptionKey(const Vector<uint8_t>& rawKey)
@@ -59,7 +59,7 @@ ExceptionOr<Vector<uint8_t>> RTCRtpSFrameTransformer::computeEncryptionKey(const
5959
if (key.hasException())
6060
return key;
6161

62-
return deriveHDKFSHA256Bits(key.returnValue().subspan(0, 16), "SFrame10 AES CM AEAD"_span, "enc"_span, 128);
62+
return deriveHDKFSHA256Bits(key.returnValue().subspan(0, 16), "SFrame10 AES CM AEAD"_span8, "enc"_span8, 128);
6363
}
6464

6565
ExceptionOr<Vector<uint8_t>> RTCRtpSFrameTransformer::decryptData(std::span<const uint8_t> data, const Vector<uint8_t>& iv, const Vector<uint8_t>& key)

‎Source/WebCore/Modules/push-api/PushMessageCrypto.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ std::optional<Vector<uint8_t>> decryptAES128GCMPayload(const ClientKeys& clientK
151151
* cek_info = "Content-Encoding: aes128gcm" || 0x00
152152
* CEK = HMAC-SHA-256(PRK, cek_info || 0x01)[0..15]
153153
*/
154-
static const auto cekInfo = "Content-Encoding: aes128gcm\x00\x01"_span;
154+
static const auto cekInfo = "Content-Encoding: aes128gcm\x00\x01"_span8;
155155
auto cek = hmacSHA256(prk, cekInfo);
156156
cek.shrink(16);
157157

@@ -160,7 +160,7 @@ std::optional<Vector<uint8_t>> decryptAES128GCMPayload(const ClientKeys& clientK
160160
* nonce_info = "Content-Encoding: nonce" || 0x00
161161
* NONCE = HMAC-SHA-256(PRK, nonce_info || 0x01)[0..11]
162162
*/
163-
static const auto nonceInfo = "Content-Encoding: nonce\x00\x01"_span;
163+
static const auto nonceInfo = "Content-Encoding: nonce\x00\x01"_span8;
164164
auto nonce = hmacSHA256(prk, nonceInfo);
165165
nonce.shrink(12);
166166

@@ -236,7 +236,7 @@ std::optional<Vector<uint8_t>> decryptAESGCMPayload(const ClientKeys& clientKeys
236236
* IKM = HMAC-SHA-256(PRK_combine, auth_info || 0x01)
237237
* PRK = HMAC-SHA-256(salt, IKM)
238238
*/
239-
static const auto authInfo = "Content-Encoding: auth\x00\x01"_span;
239+
static const auto authInfo = "Content-Encoding: auth\x00\x01"_span8;
240240
auto prkCombine = hmacSHA256(clientKeys.sharedAuthSecret, *ecdhSecretResult);
241241
auto ikm = hmacSHA256(prkCombine, authInfo);
242242
auto prk = hmacSHA256(salt, ikm);

‎Source/WebCore/dom/make_names.pl‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1396,7 +1396,7 @@ sub generateFindNameForLength
13961396
}
13971397
print F ")) {\n";
13981398
} else {
1399-
print F "${indent}if (WTF::equal($bufferStart, \"". substr($string, $currentIndex, $length - $currentIndex) . "\"_span)) {\n";
1399+
print F "${indent}if (WTF::equal($bufferStart, \"". substr($string, $currentIndex, $length - $currentIndex) . "\"_span8)) {\n";
14001400
}
14011401
}
14021402
print F "$indent return ${enumClass}::$enumValue;\n";

‎Source/WebCore/html/track/VTTCue.cpp‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,17 +1128,17 @@ std::pair<double, double> VTTCue::getPositionCoordinates() const
11281128
VTTCue::CueSetting VTTCue::settingName(VTTScanner& input)
11291129
{
11301130
CueSetting parsedSetting = None;
1131-
if (input.scan("vertical"_span))
1131+
if (input.scan("vertical"_span8))
11321132
parsedSetting = Vertical;
1133-
else if (input.scan("line"_span))
1133+
else if (input.scan("line"_span8))
11341134
parsedSetting = Line;
1135-
else if (input.scan("position"_span))
1135+
else if (input.scan("position"_span8))
11361136
parsedSetting = Position;
1137-
else if (input.scan("size"_span))
1137+
else if (input.scan("size"_span8))
11381138
parsedSetting = Size;
1139-
else if (input.scan("align"_span))
1139+
else if (input.scan("align"_span8))
11401140
parsedSetting = Align;
1141-
else if (input.scan("region"_span))
1141+
else if (input.scan("region"_span8))
11421142
parsedSetting = Region;
11431143

11441144
// Verify that a ':' follows.

0 commit comments

Comments
 (0)