Modified: trunk/Source/WTF/ChangeLog (293023 => 293024)
--- trunk/Source/WTF/ChangeLog 2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WTF/ChangeLog 2022-04-19 17:57:44 UTC (rev 293024)
@@ -1,3 +1,18 @@
+2022-04-19 Chris Dumez <[email protected]>
+
+ Introduce makeAtomString()
+ https://bugs.webkit.org/show_bug.cgi?id=239464
+
+ Reviewed by Sam Weinig.
+
+ Introduce makeAtomString() which is an optimized version of makeString() when the caller knows it wants an
+ AtomString. It may avoid a StringImpl allocation when the string is already in the AtomStringTable.
+
+ * wtf/text/StringConcatenate.h:
+ (WTF::tryMakeAtomStringFromAdapters):
+ (WTF::tryMakeAtomString):
+ (WTF::makeAtomString):
+
2022-04-18 Elliott Williams <[email protected]>
[XCBuild] Use XCBuild for all command-line and project builds
Modified: trunk/Source/WTF/wtf/text/StringConcatenate.h (293023 => 293024)
--- trunk/Source/WTF/wtf/text/StringConcatenate.h 2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WTF/wtf/text/StringConcatenate.h 2022-04-19 17:57:44 UTC (rev 293024)
@@ -431,20 +431,14 @@
}
template<typename StringTypeAdapter, typename... StringTypeAdapters>
-String tryMakeStringFromAdapters(StringTypeAdapter adapter, StringTypeAdapters ...adapters)
+RefPtr<StringImpl> tryMakeStringImplFromAdaptersInternal(unsigned length, bool areAllAdapters8Bit, StringTypeAdapter adapter, StringTypeAdapters ...adapters)
{
- static_assert(String::MaxLength == std::numeric_limits<int32_t>::max());
- auto sum = checkedSum<int32_t>(adapter.length(), adapters.length()...);
- if (sum.hasOverflowed())
- return String();
-
- unsigned length = sum;
ASSERT(length <= String::MaxLength);
- if (are8Bit(adapter, adapters...)) {
+ if (areAllAdapters8Bit) {
LChar* buffer;
RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
if (!resultImpl)
- return String();
+ return nullptr;
if (buffer)
stringTypeAdapterAccumulator(buffer, adapter, adapters...);
@@ -455,7 +449,7 @@
UChar* buffer;
RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
if (!resultImpl)
- return String();
+ return nullptr;
if (buffer)
stringTypeAdapterAccumulator(buffer, adapter, adapters...);
@@ -463,6 +457,18 @@
return resultImpl;
}
+template<typename StringTypeAdapter, typename... StringTypeAdapters>
+String tryMakeStringFromAdapters(StringTypeAdapter adapter, StringTypeAdapters ...adapters)
+{
+ static_assert(String::MaxLength == std::numeric_limits<int32_t>::max());
+ auto sum = checkedSum<int32_t>(adapter.length(), adapters.length()...);
+ if (sum.hasOverflowed())
+ return String();
+
+ bool areAllAdapters8Bit = are8Bit(adapter, adapters...);
+ return tryMakeStringImplFromAdaptersInternal(sum, areAllAdapters8Bit, adapter, adapters...);
+}
+
template<typename... StringTypes>
String tryMakeString(StringTypes ...strings)
{
@@ -478,6 +484,47 @@
return result;
}
+template<typename StringTypeAdapter, typename... StringTypeAdapters>
+AtomString tryMakeAtomStringFromAdapters(StringTypeAdapter adapter, StringTypeAdapters ...adapters)
+{
+ static_assert(String::MaxLength == std::numeric_limits<int32_t>::max());
+ auto sum = checkedSum<int32_t>(adapter.length(), adapters.length()...);
+ if (sum.hasOverflowed())
+ return String();
+
+ unsigned length = sum;
+ ASSERT(length <= String::MaxLength);
+
+ bool areAllAdapters8Bit = are8Bit(adapter, adapters...);
+ constexpr size_t maxLengthToUseStackVariable = 64;
+ if (length < maxLengthToUseStackVariable) {
+ if (areAllAdapters8Bit) {
+ LChar buffer[maxLengthToUseStackVariable];
+ stringTypeAdapterAccumulator(buffer, adapter, adapters...);
+ return AtomString { buffer, length };
+ }
+ UChar buffer[maxLengthToUseStackVariable];
+ stringTypeAdapterAccumulator(buffer, adapter, adapters...);
+ return AtomString { buffer, length };
+ }
+ return tryMakeStringImplFromAdaptersInternal(length, areAllAdapters8Bit, adapter, adapters...).get();
+}
+
+template<typename... StringTypes>
+AtomString tryMakeAtomString(StringTypes ...strings)
+{
+ return tryMakeAtomStringFromAdapters(StringTypeAdapter<StringTypes>(strings)...);
+}
+
+template<typename... StringTypes>
+AtomString makeAtomString(StringTypes... strings)
+{
+ AtomString result = tryMakeAtomString(strings...);
+ if (result.isNull())
+ CRASH();
+ return result;
+}
+
inline String makeStringByInserting(StringView originalString, StringView stringToInsert, unsigned position)
{
return makeString(originalString.left(position), stringToInsert, originalString.substring(position));
@@ -487,11 +534,13 @@
using WTF::Indentation;
using WTF::IndentationScope;
+using WTF::makeAtomString;
using WTF::makeString;
using WTF::makeStringByInserting;
using WTF::pad;
using WTF::lowercase;
using WTF::tryMakeString;
+using WTF::tryMakeAtomString;
using WTF::uppercase;
#include <wtf/text/StringOperators.h>
Modified: trunk/Source/WebCore/ChangeLog (293023 => 293024)
--- trunk/Source/WebCore/ChangeLog 2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WebCore/ChangeLog 2022-04-19 17:57:44 UTC (rev 293024)
@@ -1,3 +1,19 @@
+2022-04-19 Chris Dumez <[email protected]>
+
+ Introduce makeAtomString()
+ https://bugs.webkit.org/show_bug.cgi?id=239464
+
+ Reviewed by Sam Weinig.
+
+ Adopt makeAtomString() in a few places where it is useful.
+
+ * html/parser/HTMLTreeBuilder.cpp:
+ (WebCore::HTMLTreeBuilder::insertPhoneNumberLink):
+ * page/FrameTree.cpp:
+ (WebCore::FrameTree::generateUniqueName const):
+ * svg/SVGLengthValue.cpp:
+ (WebCore::SVGLengthValue::valueAsAtomString const):
+
2022-04-19 Joseph Griego <[email protected]>
Fix runtime expose scope check for shadow realms
Modified: trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp (293023 => 293024)
--- trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp 2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp 2022-04-19 17:57:44 UTC (rev 293024)
@@ -2200,7 +2200,7 @@
// From the string 4089961010, creates a link of the form <a href="" and inserts it.
void HTMLTreeBuilder::insertPhoneNumberLink(const String& string)
{
- Attribute attribute(HTMLNames::hrefAttr, makeString("tel:"_s, string));
+ Attribute attribute(HTMLNames::hrefAttr, makeAtomString("tel:"_s, string));
const AtomString& aTagLocalName = aTag->localName();
AtomHTMLToken aStartToken(HTMLToken::StartTag, aTagLocalName, { WTFMove(attribute) });
Modified: trunk/Source/WebCore/page/FrameTree.cpp (293023 => 293024)
--- trunk/Source/WebCore/page/FrameTree.cpp 2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WebCore/page/FrameTree.cpp 2022-04-19 17:57:44 UTC (rev 293024)
@@ -117,7 +117,7 @@
if (&top.tree() != this)
return top.tree().generateUniqueName();
- return makeString("<!--frame", ++m_frameIDGenerator, "-->");
+ return makeAtomString("<!--frame", ++m_frameIDGenerator, "-->");
}
static bool inScope(Frame& frame, TreeScope& scope)
Modified: trunk/Source/WebCore/svg/SVGLengthValue.cpp (293023 => 293024)
--- trunk/Source/WebCore/svg/SVGLengthValue.cpp 2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WebCore/svg/SVGLengthValue.cpp 2022-04-19 17:57:44 UTC (rev 293024)
@@ -271,9 +271,7 @@
AtomString SVGLengthValue::valueAsAtomString() const
{
- StringBuilder builder;
- builder.append(m_valueInSpecifiedUnits, lengthTypeToString(m_lengthType));
- return builder.toAtomString();
+ return makeAtomString(m_valueInSpecifiedUnits, lengthTypeToString(m_lengthType));
}
ExceptionOr<float> SVGLengthValue::valueForBindings(const SVGLengthContext& context) const