WebKit Bugzilla
Attachment 371173 Details for
Bug 198471
: Finish cleanup of String::number for floating point
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198471-20190602174928.patch (text/plain), 82.11 KB, created by
Darin Adler
on 2019-06-02 17:49:29 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Darin Adler
Created:
2019-06-02 17:49:29 PDT
Size:
82.11 KB
patch
obsolete
>Subversion Revision: 246024 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 25a5e395b767924300436dbec9e1fea6732c4a28..8224d7923869b9e8d7644eafab59ce2550786013 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,30 @@ >+2019-06-02 Darin Adler <darin@apple.com> >+ >+ Finish cleanup of String::number for floating point >+ https://bugs.webkit.org/show_bug.cgi?id=198471 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * dfg/DFGStrengthReductionPhase.cpp: >+ (JSC::DFG::StrengthReductionPhase::handleNode): Use String::number instead of >+ String::numberToStringECMAScript, since that's now the default. >+ * parser/ParserArena.h: >+ (JSC::IdentifierArena::makeNumericIdentifier): Ditto. >+ * runtime/JSONObject.cpp: >+ (JSC::Stringifier::appendStringifiedValue): Use appendNumber instead of >+ builder.appendECMAScriptNumber, since that's now the default. >+ * runtime/NumberPrototype.cpp: >+ (JSC::toStringWithRadix): Use String::number instead of >+ String::numberToStringECMAScript, since that's now the default. >+ (JSC::numberProtoFuncToExponential): Ditto. >+ (JSC::numberProtoFuncToFixed): Ditto. >+ (JSC::numberProtoFuncToPrecision): Ditto. >+ (JSC::numberToStringInternal): Ditto. >+ * runtime/NumericStrings.h: >+ (JSC::NumericStrings::add): Ditto. >+ * wasm/WasmBBQPlan.cpp: >+ (JSC::Wasm::BBQPlan::prepare): Ditto. >+ > 2019-06-02 Yusuke Suzuki <ysuzuki@apple.com> > > [JSC] Crash explicitly if StructureIDs are exhausted >diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog >index 8346686d812436086a9715954b82e7906cdbe172..058e527776748b7774b67099689d348c6cd894bc 100644 >--- a/Source/WTF/ChangeLog >+++ b/Source/WTF/ChangeLog >@@ -1,3 +1,24 @@ >+2019-06-02 Darin Adler <darin@apple.com> >+ >+ Finish cleanup of String::number for floating point >+ https://bugs.webkit.org/show_bug.cgi?id=198471 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * wtf/JSONValues.cpp: >+ (WTF::JSONImpl::Value::writeJSON const): Use appendNumber instead of >+ appendECMAScriptNumber, since that's now the default. >+ >+ * wtf/text/StringBuilder.cpp: >+ (WTF::StringBuilder::appendNumber): Renamed from appendShortestFormNumber. >+ * wtf/text/StringBuilder.h: Removed appendShortestFormNumber and >+ appendECMAScriptNumber, replacing both with overload of appendNumber. >+ >+ * wtf/text/WTFString.cpp: >+ (WTF::String::number): Renamed from numberToStringShortest. >+ * wtf/text/WTFString.h: Removed numberToStringShortest and >+ numberToStringECMAScript, replacing both with overload of number. >+ > 2019-06-02 Keith Miller <keith_miller@apple.com> > > Reenable Gigacage on ARM64. >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 196d2609c9e3d7207ffa92d1da2ea763f36a2105..82d901e2d0d1063a6ef33656d73d490dd888a2f8 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,57 @@ >+2019-06-02 Darin Adler <darin@apple.com> >+ >+ Finish cleanup of String::number for floating point >+ https://bugs.webkit.org/show_bug.cgi?id=198471 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * css/CSSCursorImageValue.cpp: >+ (WebCore::CSSCursorImageValue::customCSSText const): Use makeString instead >+ of StringBuilder since it is more terse and possibly more efficient as well. >+ * css/DOMMatrixReadOnly.cpp: >+ (WebCore::DOMMatrixReadOnly::toString const): Ditto. >+ * css/WebKitCSSMatrix.cpp: >+ (WebCore::WebKitCSSMatrix::toString const): Ditto. >+ >+ * html/parser/HTMLParserIdioms.cpp: >+ (WebCore::serializeForNumberType): Use String::number instead of >+ String::numberToStringECMAScript since that is now the default. >+ * html/shadow/MediaControlElementTypes.cpp: >+ (WebCore::MediaControlVolumeSliderElement::setVolume): Ditto. >+ * html/shadow/MediaControlElements.cpp: >+ (WebCore::MediaControlTimelineElement::setPosition): Ditto. >+ * platform/Decimal.cpp: >+ (WebCore::Decimal::fromDouble): Ditto. >+ >+ * rendering/RenderListMarker.cpp: >+ (WebCore::toRoman): Return a String instead of taking a StringBuilder argument. >+ Use LetterCase enum instead of bool for the uppercase vs. lowercase argument, to >+ be less mysterious at call sites. Use unsigned for string lengths since that's >+ what WTF::String uses. >+ (WebCore::toAlphabeticOrNumeric): Ditto. Also updated since SequenceType is now >+ an enum class. >+ (WebCore::toSymbolic): Use String::createUninitialized instead of StringBuilder. >+ Return a String instead of taking a StringBuilder argument. Straighten out the >+ algorithm so it's easier to understand. >+ (WebCore::toAlphabetic): Updated since SequenceType is now an enum class. >+ (WebCore::toNumeric): Ditto. >+ (WebCore::toHebrew): Return a String instead of taking a StringBuilder argument. >+ Use unsigned for string lengths since that's what WTF::String uses. >+ (WebCore::toArmenianUnder10000): Use unsigned and the LetterCase enum class. >+ (WebCore::toArmenian): Return a String instead of taking a StringBuilder argument. >+ Also use unsigned for string lengths since that's what WTF::String uses. >+ (WebCore::toGeorgian): Ditto. >+ (WebCore::toCJKIdeographic): Ditto. >+ (WebCore::listMarkerSuffix): Tweaked a comment. >+ (WebCore::listMarkerText): Use String return values instead of StringBuilder. >+ (WebCore::RenderListMarker::paint): Use String::createUninitialized instead of >+ StringBuilder since it's a bit more efficient. Use makeString instead of turning >+ single characters into strings since that's more efficient. >+ >+ * svg/SVGPathUtilities.cpp: >+ (WebCore::buildStringFromPath): Use appendNumber instead of appendShortestFormNumber >+ since that is now the default. >+ > 2019-06-01 Simon Fraser <simon.fraser@apple.com> > > [Async overflow scroll] Flashing content when scrolling async overflow with a negative z-index child >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 0ae2a31e86e4d05aafbe15edb3e6a522e0ed3b6c..e9d5c32eb5939c0d55eb850f453a4d3255249a69 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,18 @@ >+2019-06-02 Darin Adler <darin@apple.com> >+ >+ Finish cleanup of String::number for floating point >+ https://bugs.webkit.org/show_bug.cgi?id=198471 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * NetworkProcess/Classifier/WebResourceLoadStatisticsTelemetry.cpp: >+ (WebKit::submitTopList): Use makeString instead of StringBuilder since it >+ is more terse and possibly more efficient as well. >+ * UIProcess/API/APIUserScript.cpp: >+ (API::UserScript::generateUniqueURL): Ditto. >+ * UIProcess/API/APIUserStyleSheet.cpp: >+ (API::UserStyleSheet::generateUniqueURL): Ditto. >+ > 2019-06-01 Dean Jackson <dino@apple.com> > > Provide an action to save an image on a link sheet >diff --git a/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp b/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp >index c7fd52a8eb9755ad1b1b29957f13f4bbe16c48c1..d1cde134133ec302f94f4fac8f12c71c7839fd94 100644 >--- a/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp >+++ b/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp >@@ -350,7 +350,7 @@ private: > if (value.isInt32()) > return String::number(value.asInt32()); > if (value.isNumber()) >- return String::numberToStringECMAScript(value.asNumber()); >+ return String::number(value.asNumber()); > if (value.isBoolean()) > return value.asBoolean() ? "true"_s : "false"_s; > if (value.isNull()) >@@ -421,7 +421,7 @@ private: > if (value.isInt32()) > result = String::number(value.asInt32()); > else if (value.isNumber()) >- result = String::numberToStringECMAScript(value.asNumber()); >+ result = String::number(value.asNumber()); > > if (!result.isNull()) { > convertToLazyJSValue(m_node, LazyJSValue::newString(m_graph, result)); >diff --git a/Source/JavaScriptCore/parser/ParserArena.h b/Source/JavaScriptCore/parser/ParserArena.h >index 67b782dd3dc6cb52c178f336df338a726d986969..df17be53663e7cb7b70c48770f9a0529cf33a7ee 100644 >--- a/Source/JavaScriptCore/parser/ParserArena.h >+++ b/Source/JavaScriptCore/parser/ParserArena.h >@@ -130,7 +130,9 @@ namespace JSC { > > inline const Identifier& IdentifierArena::makeNumericIdentifier(VM* vm, double number) > { >- m_identifiers.append(Identifier::fromString(vm, String::numberToStringECMAScript(number))); >+ // FIXME: Why doesn't this use the Identifier::from overload that takes a double? >+ // Seems we are missing out on multiple optimizations by not using it. >+ m_identifiers.append(Identifier::fromString(vm, String::number(number))); > return m_identifiers.last(); > } > >diff --git a/Source/JavaScriptCore/runtime/JSONObject.cpp b/Source/JavaScriptCore/runtime/JSONObject.cpp >index dd12bd36a7203a2372f91a194ec4551a7b75735c..97c10451c831297f6df3dfbe55322ed7cfb131cd 100644 >--- a/Source/JavaScriptCore/runtime/JSONObject.cpp >+++ b/Source/JavaScriptCore/runtime/JSONObject.cpp >@@ -377,7 +377,7 @@ Stringifier::StringifyResult Stringifier::appendStringifiedValue(StringBuilder& > if (!std::isfinite(number)) > builder.appendLiteral("null"); > else >- builder.appendECMAScriptNumber(number); >+ builder.appendNumber(number); > } > return StringifySucceeded; > } >diff --git a/Source/JavaScriptCore/runtime/NumberPrototype.cpp b/Source/JavaScriptCore/runtime/NumberPrototype.cpp >index ab3afd003bb36f0c1d6aed63acdc356647c729c6..f69e68b8ef5d1b4ca133d567ebefc9967a1ef0e5 100644 >--- a/Source/JavaScriptCore/runtime/NumberPrototype.cpp >+++ b/Source/JavaScriptCore/runtime/NumberPrototype.cpp >@@ -395,7 +395,7 @@ String toStringWithRadix(double doubleValue, int32_t radix) > return toStringWithRadixInternal(integerValue, radix); > > if (radix == 10 || !std::isfinite(doubleValue)) >- return String::numberToStringECMAScript(doubleValue); >+ return String::number(doubleValue); > > RadixBuffer buffer; > return toStringWithRadixInternal(buffer, doubleValue, radix); >@@ -422,7 +422,7 @@ EncodedJSValue JSC_HOST_CALL numberProtoFuncToExponential(ExecState* exec) > > // Handle NaN and Infinity. > if (!std::isfinite(x)) >- return JSValue::encode(jsNontrivialString(exec, String::numberToStringECMAScript(x))); >+ return JSValue::encode(jsNontrivialString(exec, String::number(x))); > > if (!inRange) > return throwVMError(exec, scope, createRangeError(exec, "toExponential() argument must be between 0 and 20"_s)); >@@ -463,7 +463,7 @@ EncodedJSValue JSC_HOST_CALL numberProtoFuncToFixed(ExecState* exec) > // This also covers Ininity, and structure the check so that NaN > // values are also handled by numberToString > if (!(fabs(x) < 1e+21)) >- return JSValue::encode(jsString(exec, String::numberToStringECMAScript(x))); >+ return JSValue::encode(jsString(exec, String::number(x))); > > // The check above will return false for NaN or Infinity, these will be > // handled by numberToString. >@@ -496,11 +496,11 @@ EncodedJSValue JSC_HOST_CALL numberProtoFuncToPrecision(ExecState* exec) > > // To precision called with no argument is treated as ToString. > if (isUndefined) >- return JSValue::encode(jsString(exec, String::numberToStringECMAScript(x))); >+ return JSValue::encode(jsString(exec, String::number(x))); > > // Handle NaN and Infinity. > if (!std::isfinite(x)) >- return JSValue::encode(jsNontrivialString(exec, String::numberToStringECMAScript(x))); >+ return JSValue::encode(jsNontrivialString(exec, String::number(x))); > > if (!inRange) > return throwVMError(exec, scope, createRangeError(exec, "toPrecision() argument must be between 1 and 21"_s)); >@@ -537,7 +537,7 @@ static ALWAYS_INLINE JSString* numberToStringInternal(VM& vm, double doubleValue > return jsString(&vm, vm.numericStrings.add(doubleValue)); > > if (!std::isfinite(doubleValue)) >- return jsNontrivialString(&vm, String::numberToStringECMAScript(doubleValue)); >+ return jsNontrivialString(&vm, String::number(doubleValue)); > > RadixBuffer buffer; > return jsString(&vm, toStringWithRadixInternal(buffer, doubleValue, radix)); >diff --git a/Source/JavaScriptCore/runtime/NumericStrings.h b/Source/JavaScriptCore/runtime/NumericStrings.h >index 86c5c3823f9c8c00e7eed002f64233390ec903c8..ca93f47b7972ceeb51fb8d1ffcdf6921e2305b5d 100644 >--- a/Source/JavaScriptCore/runtime/NumericStrings.h >+++ b/Source/JavaScriptCore/runtime/NumericStrings.h >@@ -39,7 +39,7 @@ public: > if (d == entry.key && !entry.value.isNull()) > return entry.value; > entry.key = d; >- entry.value = String::numberToStringECMAScript(d); >+ entry.value = String::number(d); > return entry.value; > } > >diff --git a/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp b/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp >index fe09d3300e4d34523e445c0a91e98044b806fe07..0b38f9d596bfc07bcb672bc2a17b71aadc1c49aa 100644 >--- a/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp >+++ b/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2016-2018 Apple Inc. All rights reserved. >+ * Copyright (C) 2016-2019 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -45,7 +45,7 @@ > #include <wtf/MonotonicTime.h> > #include <wtf/StdLibExtras.h> > #include <wtf/SystemTracing.h> >-#include <wtf/text/StringBuilder.h> >+#include <wtf/text/StringConcatenateNumbers.h> > > namespace JSC { namespace Wasm { > >@@ -151,11 +151,7 @@ void BBQPlan::prepare() > > auto tryReserveCapacity = [this] (auto& vector, size_t size, const char* what) { > if (UNLIKELY(!vector.tryReserveCapacity(size))) { >- StringBuilder builder; >- builder.appendLiteral("Failed allocating enough space for "); >- builder.appendNumber(size); >- builder.append(what); >- fail(holdLock(m_lock), builder.toString()); >+ fail(holdLock(m_lock), WTF::makeString("Failed allocating enough space for ", size, what)); > return false; > } > return true; >diff --git a/Source/WTF/wtf/JSONValues.cpp b/Source/WTF/wtf/JSONValues.cpp >index 829acca997ccded03d6149e24f9c6cec357eaef9..8681a88e4862070f5db34f202d0dea820567caf3 100644 >--- a/Source/WTF/wtf/JSONValues.cpp >+++ b/Source/WTF/wtf/JSONValues.cpp >@@ -680,7 +680,7 @@ void Value::writeJSON(StringBuilder& output) const > if (!std::isfinite(m_value.number)) > output.appendLiteral("null"); > else >- output.appendECMAScriptNumber(m_value.number); >+ output.appendNumber(m_value.number); > break; > } > default: >diff --git a/Source/WTF/wtf/text/StringBuilder.cpp b/Source/WTF/wtf/text/StringBuilder.cpp >index e3d3542287a42e94c9a3c77acf6ff551c6644637..da1d4a4c1dc9c946d3314e0e6de1e813d1031373 100644 >--- a/Source/WTF/wtf/text/StringBuilder.cpp >+++ b/Source/WTF/wtf/text/StringBuilder.cpp >@@ -415,13 +415,13 @@ void StringBuilder::appendFixedPrecisionNumber(double number, unsigned precision > append(numberToFixedPrecisionString(number, precision, buffer, policy == TruncateTrailingZeros)); > } > >-void StringBuilder::appendShortestFormNumber(float number) >+void StringBuilder::appendNumber(float number) > { > NumberToStringBuffer buffer; > append(numberToString(number, buffer)); > } > >-void StringBuilder::appendShortestFormNumber(double number) >+void StringBuilder::appendNumber(double number) > { > NumberToStringBuffer buffer; > append(numberToString(number, buffer)); >diff --git a/Source/WTF/wtf/text/StringBuilder.h b/Source/WTF/wtf/text/StringBuilder.h >index ebaf73e6ef790c8269ab9a012d425488c57b1e11..fe4c5320ceb3f1d28a04f59283996b92bbc1e51e 100644 >--- a/Source/WTF/wtf/text/StringBuilder.h >+++ b/Source/WTF/wtf/text/StringBuilder.h >@@ -222,21 +222,14 @@ public: > WTF_EXPORT_PRIVATE void appendNumber(unsigned long); > WTF_EXPORT_PRIVATE void appendNumber(long long); > WTF_EXPORT_PRIVATE void appendNumber(unsigned long long); >- // FIXME: Change to call appendShortestFormNumber. >- void appendNumber(float) = delete; >- void appendNumber(double) = delete; >+ WTF_EXPORT_PRIVATE void appendNumber(float); >+ WTF_EXPORT_PRIVATE void appendNumber(double); > >- WTF_EXPORT_PRIVATE void appendShortestFormNumber(float); >- WTF_EXPORT_PRIVATE void appendShortestFormNumber(double); > WTF_EXPORT_PRIVATE void appendFixedPrecisionNumber(float, unsigned precision = 6, TrailingZerosTruncatingPolicy = TruncateTrailingZeros); > WTF_EXPORT_PRIVATE void appendFixedPrecisionNumber(double, unsigned precision = 6, TrailingZerosTruncatingPolicy = TruncateTrailingZeros); > WTF_EXPORT_PRIVATE void appendFixedWidthNumber(float, unsigned decimalPlaces); > WTF_EXPORT_PRIVATE void appendFixedWidthNumber(double, unsigned decimalPlaces); > >- // FIXME: Delete in favor of the name appendShortestFormNumber or just appendNumber. >- void appendECMAScriptNumber(float) = delete; >- void appendECMAScriptNumber(double); >- > String toString() > { > if (!m_string.isNull()) { >@@ -394,11 +387,6 @@ ALWAYS_INLINE UChar* StringBuilder::getBufferCharacters<UChar>() > return m_bufferCharacters16; > } > >-inline void StringBuilder::appendECMAScriptNumber(double number) >-{ >- appendShortestFormNumber(number); >-} >- > template <typename CharType> > bool equal(const StringBuilder& s, const CharType* buffer, unsigned length) > { >diff --git a/Source/WTF/wtf/text/WTFString.cpp b/Source/WTF/wtf/text/WTFString.cpp >index f5acba8374cba236f86eec5e7b7400b6bb6bb360..e5c18fe4c36f59d97203d9270f6f2a208b1e2764 100644 >--- a/Source/WTF/wtf/text/WTFString.cpp >+++ b/Source/WTF/wtf/text/WTFString.cpp >@@ -491,13 +491,13 @@ String String::numberToStringFixedPrecision(double number, unsigned precision, T > return numberToFixedPrecisionString(number, precision, buffer, trailingZerosTruncatingPolicy == TruncateTrailingZeros); > } > >-String String::numberToStringShortest(float number) >+String String::number(float number) > { > NumberToStringBuffer buffer; > return numberToString(number, buffer); > } > >-String String::numberToStringShortest(double number) >+String String::number(double number) > { > NumberToStringBuffer buffer; > return numberToString(number, buffer); >diff --git a/Source/WTF/wtf/text/WTFString.h b/Source/WTF/wtf/text/WTFString.h >index 007ac572d6be07b1fd85b9ddc353a59fe7d17472..9a753adb6123da4c4f1eb8fab9912e146d37b363 100644 >--- a/Source/WTF/wtf/text/WTFString.h >+++ b/Source/WTF/wtf/text/WTFString.h >@@ -124,12 +124,10 @@ public: > WTF_EXPORT_PRIVATE String(ASCIILiteral); > > // Construct a string from a constant string literal. >- // This constructor is the "big" version, as it put the length in the function call and generate bigger code. >+ // This is the "big" version: puts the length in the function call and generates bigger code. > enum ConstructFromLiteralTag { ConstructFromLiteral }; > template<unsigned characterCount> String(const char (&characters)[characterCount], ConstructFromLiteralTag) : m_impl(StringImpl::createFromLiteral<characterCount>(characters)) { } > >- // FIXME: Why do we have to define these explicitly given that we just want the default versions? >- // We have verified empirically that we do. > String(const String&) = default; > String(String&&) = default; > String& operator=(const String&) = default; >@@ -179,21 +177,14 @@ public: > WTF_EXPORT_PRIVATE static String number(unsigned long); > WTF_EXPORT_PRIVATE static String number(long long); > WTF_EXPORT_PRIVATE static String number(unsigned long long); >- // FIXME: Change to call numberToStringShortest. >- static String number(float) = delete; >- static String number(double) = delete; >+ WTF_EXPORT_PRIVATE static String number(float); >+ WTF_EXPORT_PRIVATE static String number(double); > >- WTF_EXPORT_PRIVATE static String numberToStringShortest(float); >- WTF_EXPORT_PRIVATE static String numberToStringShortest(double); > WTF_EXPORT_PRIVATE static String numberToStringFixedPrecision(float, unsigned precision = 6, TrailingZerosTruncatingPolicy = TruncateTrailingZeros); > WTF_EXPORT_PRIVATE static String numberToStringFixedPrecision(double, unsigned precision = 6, TrailingZerosTruncatingPolicy = TruncateTrailingZeros); > WTF_EXPORT_PRIVATE static String numberToStringFixedWidth(float, unsigned decimalPlaces); > WTF_EXPORT_PRIVATE static String numberToStringFixedWidth(double, unsigned decimalPlaces); > >- // FIXME: Delete in favor of the name numberToStringShortest or just number. >- static String numberToStringECMAScript(float) = delete; >- static String numberToStringECMAScript(double); >- > // Find a single character or string, also with match function & latin1 forms. > size_t find(UChar character, unsigned start = 0) const { return m_impl ? m_impl->find(character, start) : notFound; } > >@@ -654,11 +645,6 @@ template<unsigned length> inline bool startsWithLettersIgnoringASCIICase(const S > return startsWithLettersIgnoringASCIICase(string.impl(), lowercaseLetters); > } > >-inline String String::numberToStringECMAScript(double number) >-{ >- return numberToStringShortest(number); >-} >- > inline namespace StringLiterals { > > inline String operator"" _str(const char* characters, size_t) >diff --git a/Source/WebCore/css/CSSCursorImageValue.cpp b/Source/WebCore/css/CSSCursorImageValue.cpp >index 33a529e81266073135693e0d747d5d12e9de1602..f157aafd4ced81e43173689d17d8831ca161a171 100644 >--- a/Source/WebCore/css/CSSCursorImageValue.cpp >+++ b/Source/WebCore/css/CSSCursorImageValue.cpp >@@ -1,7 +1,7 @@ > /* > * Copyright (C) 2006 Rob Buis <buis@kde.org> > * (C) 2008 Nikolas Zimmermann <zimmermann@kde.org> >- * Copyright (C) 2008 Apple Inc. All rights reserved. >+ * Copyright (C) 2008-2019 Apple Inc. All rights reserved. > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Library General Public >@@ -54,15 +54,10 @@ CSSCursorImageValue::~CSSCursorImageValue() > > String CSSCursorImageValue::customCSSText() const > { >- StringBuilder result; >- result.append(m_imageValue.get().cssText()); >- if (m_hasHotSpot) { >- result.append(' '); >- result.appendNumber(m_hotSpot.x()); >- result.append(' '); >- result.appendNumber(m_hotSpot.y()); >- } >- return result.toString(); >+ String text = m_imageValue.get().cssText(); >+ if (!m_hasHotSpot) >+ return text; >+ return makeString(text, ' ', m_hotSpot.x(), ' ', m_hotSpot.y()); > } > > // FIXME: Should this function take a TreeScope instead? >diff --git a/Source/WebCore/css/DOMMatrixReadOnly.cpp b/Source/WebCore/css/DOMMatrixReadOnly.cpp >index 656641b7e19c5b3327196ef75aa7a0f3861e969e..5d8955da11fac92e30ae8ba50236909fcb11fdf7 100644 >--- a/Source/WebCore/css/DOMMatrixReadOnly.cpp >+++ b/Source/WebCore/css/DOMMatrixReadOnly.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2019 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -404,56 +404,10 @@ ExceptionOr<String> DOMMatrixReadOnly::toString() const > if (!m_matrix.containsOnlyFiniteValues()) > return Exception { InvalidStateError, "Matrix contains non-finite values"_s }; > >- StringBuilder builder; >- if (is2D()) { >- builder.appendLiteral("matrix("); >- builder.appendECMAScriptNumber(m_matrix.a()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.b()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.c()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.d()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.e()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.f()); >- } else { >- builder.appendLiteral("matrix3d("); >- builder.appendECMAScriptNumber(m_matrix.m11()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m12()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m13()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m14()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m21()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m22()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m23()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m24()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m31()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m32()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m33()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m34()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m41()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m42()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m43()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m44()); >- } >- builder.append(')'); >- return builder.toString(); >+ if (is2D()) >+ return makeString("matrix(", m_matrix.a(), ", ", m_matrix.b(), ", ", m_matrix.c(), ", ", m_matrix.d(), ", ", m_matrix.e(), ", ", m_matrix.f(), ')'); >+ >+ return makeString("matrix3d(", m_matrix.m11(), ", ", m_matrix.m12(), ", ", m_matrix.m13(), ", ", m_matrix.m14(), ", ", m_matrix.m21(), ", ", m_matrix.m22(), ", ", m_matrix.m23(), ", ", m_matrix.m24(), ", ", m_matrix.m31(), ", ", m_matrix.m32(), ", ", m_matrix.m33(), ", ", m_matrix.m34(), ", ", m_matrix.m41(), ", ", m_matrix.m42(), ", ", m_matrix.m43(), ", ", m_matrix.m44(), ')'); > } > > } // namespace WebCore >diff --git a/Source/WebCore/css/WebKitCSSMatrix.cpp b/Source/WebCore/css/WebKitCSSMatrix.cpp >index 2b301e95172373c5462ee0ed07e4900700e18afc..d3e86004b00026154a49e4d9a54ff778fb171762 100644 >--- a/Source/WebCore/css/WebKitCSSMatrix.cpp >+++ b/Source/WebCore/css/WebKitCSSMatrix.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2008 Apple Inc. All Rights Reserved. >+ * Copyright (C) 2008-2019 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -35,7 +35,7 @@ > #include "TransformFunctions.h" > #include <wtf/IsoMallocInlines.h> > #include <wtf/MathExtras.h> >-#include <wtf/text/StringBuilder.h> >+#include <wtf/text/StringConcatenateNumbers.h> > > namespace WebCore { > >@@ -203,56 +203,10 @@ ExceptionOr<String> WebKitCSSMatrix::toString() const > if (!m_matrix.containsOnlyFiniteValues()) > return Exception { InvalidStateError, "Matrix contains non-finite values"_s }; > >- StringBuilder builder; >- if (m_matrix.isAffine()) { >- builder.appendLiteral("matrix("); >- builder.appendECMAScriptNumber(m_matrix.a()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.b()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.c()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.d()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.e()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.f()); >- } else { >- builder.appendLiteral("matrix3d("); >- builder.appendECMAScriptNumber(m_matrix.m11()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m12()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m13()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m14()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m21()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m22()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m23()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m24()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m31()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m32()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m33()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m34()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m41()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m42()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m43()); >- builder.appendLiteral(", "); >- builder.appendECMAScriptNumber(m_matrix.m44()); >- } >- builder.append(')'); >- return builder.toString(); >+ if (m_matrix.isAffine()) >+ return makeString("matrix(", m_matrix.a(), ", ", m_matrix.b(), ", ", m_matrix.c(), ", ", m_matrix.d(), ", ", m_matrix.e(), ", ", m_matrix.f(), ')'); >+ >+ return makeString("matrix3d(", m_matrix.m11(), ", ", m_matrix.m12(), ", ", m_matrix.m13(), ", ", m_matrix.m14(), ", ", m_matrix.m21(), ", ", m_matrix.m22(), ", ", m_matrix.m23(), ", ", m_matrix.m24(), ", ", m_matrix.m31(), ", ", m_matrix.m32(), ", ", m_matrix.m33(), ", ", m_matrix.m34(), ", ", m_matrix.m41(), ", ", m_matrix.m42(), ", ", m_matrix.m43(), ", ", m_matrix.m44(), ')'); > } > > } // namespace WebCore >diff --git a/Source/WebCore/html/parser/HTMLParserIdioms.cpp b/Source/WebCore/html/parser/HTMLParserIdioms.cpp >index 3991e754615dd130cfbfa59dd754fe977600592a..5442e0c4a067ba727b6295f9b918f3399db2eace 100644 >--- a/Source/WebCore/html/parser/HTMLParserIdioms.cpp >+++ b/Source/WebCore/html/parser/HTMLParserIdioms.cpp >@@ -89,7 +89,7 @@ String serializeForNumberType(double number) > { > // According to HTML5, "the best representation of the number n as a floating > // point number" is a string produced by applying ToString() to n. >- return String::numberToStringECMAScript(number); >+ return String::number(number); > } > > Decimal parseToDecimalForNumberType(const String& string, const Decimal& fallbackValue) >diff --git a/Source/WebCore/html/shadow/MediaControlElementTypes.cpp b/Source/WebCore/html/shadow/MediaControlElementTypes.cpp >index d2891a7e9d5e5e49fbeaec3af5889b66632e978d..26aaa153eae37ff84e5b1918ca938056f08b048f 100644 >--- a/Source/WebCore/html/shadow/MediaControlElementTypes.cpp >+++ b/Source/WebCore/html/shadow/MediaControlElementTypes.cpp >@@ -242,7 +242,7 @@ bool MediaControlVolumeSliderElement::willRespondToMouseClickEvents() > void MediaControlVolumeSliderElement::setVolume(double volume) > { > if (value().toDouble() != volume) >- setValue(String::numberToStringECMAScript(volume)); >+ setValue(String::number(volume)); > } > > void MediaControlVolumeSliderElement::setClearMutedOnUserInteraction(bool clearMute) >diff --git a/Source/WebCore/html/shadow/MediaControlElements.cpp b/Source/WebCore/html/shadow/MediaControlElements.cpp >index 7fa4ab6da4ef78bea8134ee8340370cf0f3a46f5..089e139348362827bb5ed0437b6720ce61dfc996 100644 >--- a/Source/WebCore/html/shadow/MediaControlElements.cpp >+++ b/Source/WebCore/html/shadow/MediaControlElements.cpp >@@ -909,7 +909,7 @@ bool MediaControlTimelineElement::willRespondToMouseClickEvents() > > void MediaControlTimelineElement::setPosition(double currentTime) > { >- setValue(String::numberToStringECMAScript(currentTime)); >+ setValue(String::number(currentTime)); > } > > void MediaControlTimelineElement::setDuration(double duration) >diff --git a/Source/WebCore/platform/Decimal.cpp b/Source/WebCore/platform/Decimal.cpp >index b1ac6592ef281a21cbb36c6e80a829dbcbaa3fbe..0b21104f9657ef9d032827db602123ad879f4c21 100644 >--- a/Source/WebCore/platform/Decimal.cpp >+++ b/Source/WebCore/platform/Decimal.cpp >@@ -681,8 +681,11 @@ Decimal Decimal::floor() const > > Decimal Decimal::fromDouble(double doubleValue) > { >- if (std::isfinite(doubleValue)) >- return fromString(String::numberToStringECMAScript(doubleValue)); >+ if (std::isfinite(doubleValue)) { >+ // FIXME: Change fromString to take a StringView instead of a String and then >+ // use a fixed size stack buffer instead of allocating and deallocating a string. >+ return fromString(String::number(doubleValue)); >+ } > > if (std::isinf(doubleValue)) > return infinity(doubleValue < 0 ? Negative : Positive); >diff --git a/Source/WebCore/rendering/RenderListMarker.cpp b/Source/WebCore/rendering/RenderListMarker.cpp >index 4f78f83105c96cc6bf81d73ef824459d644a9326..ce019baa3bd55a16ee24faee6e976626bcbeaed4 100644 >--- a/Source/WebCore/rendering/RenderListMarker.cpp >+++ b/Source/WebCore/rendering/RenderListMarker.cpp >@@ -1,7 +1,7 @@ > /* > * Copyright (C) 1999 Lars Knoll (knoll@kde.org) > * (C) 1999 Antti Koivisto (koivisto@kde.org) >- * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. >+ * Copyright (C) 2003-2019 Apple Inc. All rights reserved. > * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) > * Copyright (C) 2010 Daniel Bates (dbates@intudata.com) > * >@@ -34,7 +34,7 @@ > #include "RenderView.h" > #include <wtf/IsoMallocInlines.h> > #include <wtf/StackStats.h> >-#include <wtf/text/StringBuilder.h> >+#include <wtf/text/StringConcatenateNumbers.h> > #include <wtf/unicode/CharacterNames.h> > > namespace WebCore { >@@ -45,9 +45,10 @@ WTF_MAKE_ISO_ALLOCATED_IMPL(RenderListMarker); > > const int cMarkerPadding = 7; > >-enum SequenceType { NumericSequence, AlphabeticSequence }; >+enum class LetterCase { Lower, Upper }; >+enum class SequenceType { Numeric, Alphabetic }; > >-static NEVER_INLINE void toRoman(StringBuilder& builder, int number, bool upper) >+static NEVER_INLINE String toRoman(int number, LetterCase letterCase) > { > // FIXME: CSS3 describes how to make this work for much larger numbers, > // using overbars and special characters. It also specifies the characters >@@ -56,13 +57,13 @@ static NEVER_INLINE void toRoman(StringBuilder& builder, int number, bool upper) > > // Big enough to store largest roman number less than 3999 which > // is 3888 (MMMDCCCLXXXVIII) >- const int lettersSize = 15; >+ constexpr unsigned lettersSize = 15; > LChar letters[lettersSize]; > >- int length = 0; >+ unsigned length = 0; > const LChar ldigits[] = { 'i', 'v', 'x', 'l', 'c', 'd', 'm' }; > const LChar udigits[] = { 'I', 'V', 'X', 'L', 'C', 'D', 'M' }; >- const LChar* digits = upper ? udigits : ldigits; >+ const LChar* digits = letterCase == LetterCase::Upper ? udigits : ldigits; > int d = 0; > do { > int num = number % 10; >@@ -80,22 +81,22 @@ static NEVER_INLINE void toRoman(StringBuilder& builder, int number, bool upper) > } while (number); > > ASSERT(length <= lettersSize); >- builder.append(&letters[lettersSize - length], length); >+ return String { &letters[lettersSize - length], length }; > } > >-template <typename CharacterType> >-static inline void toAlphabeticOrNumeric(StringBuilder& builder, int number, const CharacterType* sequence, unsigned sequenceSize, SequenceType type) >+template<typename CharacterType> >+static inline String toAlphabeticOrNumeric(int number, const CharacterType* sequence, unsigned sequenceSize, SequenceType type) > { > ASSERT(sequenceSize >= 2); > > // Taking sizeof(number) in the expression below doesn't work with some compilers. >- const int lettersSize = sizeof(int) * 8 + 1; // Binary is the worst case; requires one character per bit plus a minus sign. >+ constexpr unsigned lettersSize = sizeof(int) * 8 + 1; // Binary is the worst case; requires one character per bit plus a minus sign. > > CharacterType letters[lettersSize]; > > bool isNegativeNumber = false; > unsigned numberShadow = number; >- if (type == AlphabeticSequence) { >+ if (type == SequenceType::Alphabetic) { > ASSERT(number > 0); > --numberShadow; > } else if (number < 0) { >@@ -103,9 +104,9 @@ static inline void toAlphabeticOrNumeric(StringBuilder& builder, int number, con > isNegativeNumber = true; > } > letters[lettersSize - 1] = sequence[numberShadow % sequenceSize]; >- int length = 1; >+ unsigned length = 1; > >- if (type == AlphabeticSequence) { >+ if (type == SequenceType::Alphabetic) { > while ((numberShadow /= sequenceSize) > 0) { > --numberShadow; > letters[lettersSize - ++length] = sequence[numberShadow % sequenceSize]; >@@ -118,52 +119,54 @@ static inline void toAlphabeticOrNumeric(StringBuilder& builder, int number, con > letters[lettersSize - ++length] = hyphenMinus; > > ASSERT(length <= lettersSize); >- builder.append(&letters[lettersSize - length], length); >+ return String { &letters[lettersSize - length], length }; > } > >-template <typename CharacterType> >-static NEVER_INLINE void toSymbolic(StringBuilder& builder, int number, const CharacterType* symbols, unsigned symbolsSize) >+template<typename CharacterType> >+static NEVER_INLINE String toSymbolic(int number, const CharacterType* symbols, unsigned symbolsSize) > { > ASSERT(number > 0); > ASSERT(symbolsSize >= 1); >- unsigned numberShadow = number; >- --numberShadow; > >- // The asterisks list-style-type is the worst case; we show |numberShadow| asterisks. >- builder.append(symbols[numberShadow % symbolsSize]); >- unsigned numSymbols = numberShadow / symbolsSize; >- while (numSymbols--) >- builder.append(symbols[numberShadow % symbolsSize]); >+ // The asterisks list-style-type is the worst case; we show |number| asterisks. >+ CharacterType symbol = symbols[(number - 1) % symbolsSize]; >+ unsigned count = (number - 1) / symbolsSize + 1; >+ >+ CharacterType* characters; >+ String result = String::createUninitialized(count, characters); >+ for (unsigned i = 0; i < count; ++i) >+ characters[i] = symbol; >+ return result; > } > >-template <typename CharacterType> >-static NEVER_INLINE void toAlphabetic(StringBuilder& builder, int number, const CharacterType* alphabet, unsigned alphabetSize) >+template<typename CharacterType> >+static NEVER_INLINE String toAlphabetic(int number, const CharacterType* alphabet, unsigned alphabetSize) > { >- toAlphabeticOrNumeric(builder, number, alphabet, alphabetSize, AlphabeticSequence); >+ return toAlphabeticOrNumeric(number, alphabet, alphabetSize, SequenceType::Alphabetic); > } > >-template <typename CharacterType> >-static NEVER_INLINE void toNumeric(StringBuilder& builder, int number, const CharacterType* numerals, unsigned numeralsSize) >+template<typename CharacterType> >+static NEVER_INLINE String toNumeric(int number, const CharacterType* numerals, unsigned numeralsSize) > { >- toAlphabeticOrNumeric(builder, number, numerals, numeralsSize, NumericSequence); >+ return toAlphabeticOrNumeric(number, numerals, numeralsSize, SequenceType::Numeric); > } > >-template <typename CharacterType, size_t size> >-static inline void toAlphabetic(StringBuilder& builder, int number, const CharacterType(&alphabet)[size]) >+template<typename CharacterType, size_t size> >+static inline String toAlphabetic(int number, const CharacterType(&alphabet)[size]) > { >- toAlphabetic(builder, number, alphabet, size); >+ return toAlphabetic(number, alphabet, size); > } > >-template <typename CharacterType, size_t size> >-static inline void toNumeric(StringBuilder& builder, int number, const CharacterType(&alphabet)[size]) >+template<typename CharacterType, size_t size> >+static inline String toNumeric(int number, const CharacterType(&alphabet)[size]) > { >- toNumeric(builder, number, alphabet, size); >+ return toNumeric(number, alphabet, size); > } > >-template <typename CharacterType, size_t size> >-static inline void toSymbolic(StringBuilder& builder, int number, const CharacterType(&alphabet)[size]) >+template<typename CharacterType, size_t size> >+static inline String toSymbolic(int number, const CharacterType(&alphabet)[size]) > { >- toSymbolic(builder, number, alphabet, size); >+ return toSymbolic(number, alphabet, size); > } > > static NEVER_INLINE int toHebrewUnder1000(int number, UChar letters[5]) >@@ -194,21 +197,20 @@ static NEVER_INLINE int toHebrewUnder1000(int number, UChar letters[5]) > return length; > } > >-static NEVER_INLINE void toHebrew(StringBuilder& builder, int number) >+static NEVER_INLINE String toHebrew(int number) > { > // FIXME: CSS3 mentions ways to make this work for much larger numbers. > ASSERT(number >= 0 && number <= 999999); > > if (number == 0) { > static const UChar hebrewZero[3] = { 0x05D0, 0x05E4, 0x05E1 }; >- builder.append(hebrewZero, 3); >- return; >+ return String { hebrewZero, 3 }; > } > >- const int lettersSize = 11; // big enough for two 5-digit sequences plus a quote mark between >+ constexpr unsigned lettersSize = 11; // big enough for two 5-digit sequences plus a quote mark between > UChar letters[lettersSize]; > >- int length; >+ unsigned length; > if (number < 1000) > length = 0; > else { >@@ -219,15 +221,15 @@ static NEVER_INLINE void toHebrew(StringBuilder& builder, int number) > length += toHebrewUnder1000(number, letters + length); > > ASSERT(length <= lettersSize); >- builder.append(letters, length); >+ return String { letters, length }; > } > >-static NEVER_INLINE int toArmenianUnder10000(int number, bool upper, bool addCircumflex, UChar letters[9]) >+static NEVER_INLINE unsigned toArmenianUnder10000(int number, LetterCase letterCase, bool addCircumflex, UChar letters[9]) > { > ASSERT(number >= 0 && number < 10000); >- int length = 0; >+ unsigned length = 0; > >- int lowerOffset = upper ? 0 : 0x0030; >+ int lowerOffset = letterCase == LetterCase::Upper ? 0 : 0x0030; > > if (int thousands = number / 1000) { > if (thousands == 7) { >@@ -262,28 +264,28 @@ static NEVER_INLINE int toArmenianUnder10000(int number, bool upper, bool addCir > return length; > } > >-static NEVER_INLINE void toArmenian(StringBuilder& builder, int number, bool upper) >+static NEVER_INLINE String toArmenian(int number, LetterCase letterCase) > { > ASSERT(number >= 1 && number <= 99999999); > >- const int lettersSize = 18; // twice what toArmenianUnder10000 needs >+ constexpr unsigned lettersSize = 18; // twice what toArmenianUnder10000 needs > UChar letters[lettersSize]; > >- int length = toArmenianUnder10000(number / 10000, upper, true, letters); >- length += toArmenianUnder10000(number % 10000, upper, false, letters + length); >+ unsigned length = toArmenianUnder10000(number / 10000, letterCase, true, letters); >+ length += toArmenianUnder10000(number % 10000, letterCase, false, letters + length); > > ASSERT(length <= lettersSize); >- builder.append(letters, length); >+ return String { letters, length }; > } > >-static NEVER_INLINE void toGeorgian(StringBuilder& builder, int number) >+static NEVER_INLINE String toGeorgian(int number) > { > ASSERT(number >= 1 && number <= 19999); > >- const int lettersSize = 5; >+ constexpr unsigned lettersSize = 5; > UChar letters[lettersSize]; > >- int length = 0; >+ unsigned length = 0; > > if (number > 9999) > letters[length++] = 0x10F5; >@@ -317,12 +319,12 @@ static NEVER_INLINE void toGeorgian(StringBuilder& builder, int number) > } > > ASSERT(length <= lettersSize); >- builder.append(letters, length); >+ return String { letters, length }; > } > > // The table uses the order from the CSS3 specification: > // first 3 group markers, then 3 digit markers, then ten digits. >-static NEVER_INLINE void toCJKIdeographic(StringBuilder& builder, int number, const UChar table[16]) >+static NEVER_INLINE String toCJKIdeographic(int number, const UChar table[16]) > { > ASSERT(number >= 0); > >@@ -334,13 +336,11 @@ static NEVER_INLINE void toCJKIdeographic(StringBuilder& builder, int number, co > digit5, digit6, digit7, digit8, digit9 > }; > >- if (number == 0) { >- builder.append(table[digit0 - 1]); >- return; >- } >+ if (!number) >+ return String { &table[digit0 - 1] , 1 }; > >- const int groupLength = 8; // 4 digits, 3 digit markers, and a group marker >- const int bufferLength = 4 * groupLength; >+ constexpr unsigned groupLength = 8; // 4 digits, 3 digit markers, and a group marker >+ constexpr unsigned bufferLength = 4 * groupLength; > AbstractCJKChar buffer[bufferLength] = { noChar }; > > for (int i = 0; i < 4; ++i) { >@@ -381,16 +381,15 @@ static NEVER_INLINE void toCJKIdeographic(StringBuilder& builder, int number, co > group[4] = noChar; > } > >- if (number == 0) >+ if (!number) > break; > } > >- // Convert into characters, omitting consecutive runs of digit0 and >- // any trailing digit0. >- int length = 0; >+ // Convert into characters, omitting consecutive runs of digit0 and trailing digit0. >+ unsigned length = 0; > UChar characters[bufferLength]; > AbstractCJKChar last = noChar; >- for (int i = 0; i < bufferLength; ++i) { >+ for (unsigned i = 0; i < bufferLength; ++i) { > AbstractCJKChar a = buffer[i]; > if (a != noChar) { > if (a != digit0 || last != digit0) >@@ -401,7 +400,7 @@ static NEVER_INLINE void toCJKIdeographic(StringBuilder& builder, int number, co > if (last == digit0) > --length; > >- builder.append(characters, length); >+ return String { characters, length }; > } > > static ListStyleType effectiveListMarkerType(ListStyleType type, int value) >@@ -506,7 +505,7 @@ static ListStyleType effectiveListMarkerType(ListStyleType type, int value) > static UChar listMarkerSuffix(ListStyleType type, int value) > { > // If the list-style-type cannot represent |value| because it's outside its >- // ordinal range then we fall back to some list style that can represent |value|. >+ // ordinal range then we fall back to another list style that can represent |value|. > ListStyleType effectiveType = effectiveListMarkerType(type, value); > > // Note, the following switch statement has been explicitly >@@ -604,76 +603,62 @@ static UChar listMarkerSuffix(ListStyleType type, int value) > > String listMarkerText(ListStyleType type, int value) > { >- StringBuilder builder; >- >- // If the list-style-type, say hebrew, cannot represent |value| because it's outside >- // its ordinal range then we fallback to some list style that can represent |value|. >+ // If the list-style-type cannot represent |value| because it's outside its >+ // ordinal range then we fall back to another list style that can represent |value|. > switch (effectiveListMarkerType(type, value)) { > case ListStyleType::None: > return emptyString(); > > case ListStyleType::Asterisks: { > static const LChar asterisksSymbols[1] = { 0x2A }; >- toSymbolic(builder, value, asterisksSymbols); >- break; >+ return toSymbolic(value, asterisksSymbols); > } > // We use the same characters for text security. > // See RenderText::setInternalString. > case ListStyleType::Circle: >- builder.append(whiteBullet); >- break; >+ return String { &whiteBullet, 1 }; > case ListStyleType::Disc: >- builder.append(bullet); >- break; >+ return String { &bullet, 1 }; > case ListStyleType::Footnotes: { > static const UChar footnotesSymbols[4] = { 0x002A, 0x2051, 0x2020, 0x2021 }; >- toSymbolic(builder, value, footnotesSymbols); >- break; >+ return toSymbolic(value, footnotesSymbols); > } > case ListStyleType::Square: >- // The CSS 2.1 test suite uses U+25EE BLACK MEDIUM SMALL SQUARE >- // instead, but I think this looks better. >- builder.append(blackSquare); >- break; >+ // The CSS 2.1 test suite uses U+25EE BLACK MEDIUM SMALL SQUARE instead, >+ // but we used this because we thought it looked better. >+ return String { &blackSquare, 1 }; > > case ListStyleType::Decimal: >- builder.appendNumber(value); >- break; >+ return String::number(value); > > case ListStyleType::DecimalLeadingZero: >- if (value < -9 || value > 9) { >- builder.appendNumber(value); >- break; >+ if (value >= 0 && value <= 9) { >+ LChar characters[2] = { '0', static_cast<LChar>('0' + value) }; // 00 to 09 >+ return String { characters, 2 }; > } >- if (value < 0) { >- builder.appendLiteral("-0"); >- builder.appendNumber(-value); // -01 to -09 >- break; >+ if (value >= -9 && value <= -1) { >+ LChar characters[3] = { '-', '0', static_cast<LChar>('0' - value) }; // -01 to -09 >+ return String { characters, 3 }; > } >- builder.append('0'); >- builder.appendNumber(value); // 00 to 09 >- break; >+ return String::number(value); > > case ListStyleType::ArabicIndic: { > static const UChar arabicIndicNumerals[10] = { > 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669 > }; >- toNumeric(builder, value, arabicIndicNumerals); >- break; >+ return toNumeric(value, arabicIndicNumerals); > } > > case ListStyleType::Binary: { > static const LChar binaryNumerals[2] = { '0', '1' }; >- toNumeric(builder, value, binaryNumerals); >- break; >+ return toNumeric(value, binaryNumerals); > } > > case ListStyleType::Bengali: { > static const UChar bengaliNumerals[10] = { > 0x09E6, 0x09E7, 0x09E8, 0x09E9, 0x09EA, 0x09EB, 0x09EC, 0x09ED, 0x09EE, 0x09EF > }; >- toNumeric(builder, value, bengaliNumerals); >- break; >+ return toNumeric(value, bengaliNumerals); > } > > case ListStyleType::Cambodian: >@@ -681,121 +666,104 @@ String listMarkerText(ListStyleType type, int value) > static const UChar khmerNumerals[10] = { > 0x17E0, 0x17E1, 0x17E2, 0x17E3, 0x17E4, 0x17E5, 0x17E6, 0x17E7, 0x17E8, 0x17E9 > }; >- toNumeric(builder, value, khmerNumerals); >- break; >+ return toNumeric(value, khmerNumerals); > } > case ListStyleType::Devanagari: { > static const UChar devanagariNumerals[10] = { > 0x0966, 0x0967, 0x0968, 0x0969, 0x096A, 0x096B, 0x096C, 0x096D, 0x096E, 0x096F > }; >- toNumeric(builder, value, devanagariNumerals); >- break; >+ return toNumeric(value, devanagariNumerals); > } > case ListStyleType::Gujarati: { > static const UChar gujaratiNumerals[10] = { > 0x0AE6, 0x0AE7, 0x0AE8, 0x0AE9, 0x0AEA, 0x0AEB, 0x0AEC, 0x0AED, 0x0AEE, 0x0AEF > }; >- toNumeric(builder, value, gujaratiNumerals); >- break; >+ return toNumeric(value, gujaratiNumerals); > } > case ListStyleType::Gurmukhi: { > static const UChar gurmukhiNumerals[10] = { > 0x0A66, 0x0A67, 0x0A68, 0x0A69, 0x0A6A, 0x0A6B, 0x0A6C, 0x0A6D, 0x0A6E, 0x0A6F > }; >- toNumeric(builder, value, gurmukhiNumerals); >- break; >+ return toNumeric(value, gurmukhiNumerals); > } > case ListStyleType::Kannada: { > static const UChar kannadaNumerals[10] = { > 0x0CE6, 0x0CE7, 0x0CE8, 0x0CE9, 0x0CEA, 0x0CEB, 0x0CEC, 0x0CED, 0x0CEE, 0x0CEF > }; >- toNumeric(builder, value, kannadaNumerals); >- break; >+ return toNumeric(value, kannadaNumerals); > } > case ListStyleType::LowerHexadecimal: { > static const LChar lowerHexadecimalNumerals[16] = { > '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' > }; >- toNumeric(builder, value, lowerHexadecimalNumerals); >- break; >+ return toNumeric(value, lowerHexadecimalNumerals); > } > case ListStyleType::Lao: { > static const UChar laoNumerals[10] = { > 0x0ED0, 0x0ED1, 0x0ED2, 0x0ED3, 0x0ED4, 0x0ED5, 0x0ED6, 0x0ED7, 0x0ED8, 0x0ED9 > }; >- toNumeric(builder, value, laoNumerals); >- break; >+ return toNumeric(value, laoNumerals); > } > case ListStyleType::Malayalam: { > static const UChar malayalamNumerals[10] = { > 0x0D66, 0x0D67, 0x0D68, 0x0D69, 0x0D6A, 0x0D6B, 0x0D6C, 0x0D6D, 0x0D6E, 0x0D6F > }; >- toNumeric(builder, value, malayalamNumerals); >- break; >+ return toNumeric(value, malayalamNumerals); > } > case ListStyleType::Mongolian: { > static const UChar mongolianNumerals[10] = { > 0x1810, 0x1811, 0x1812, 0x1813, 0x1814, 0x1815, 0x1816, 0x1817, 0x1818, 0x1819 > }; >- toNumeric(builder, value, mongolianNumerals); >- break; >+ return toNumeric(value, mongolianNumerals); > } > case ListStyleType::Myanmar: { > static const UChar myanmarNumerals[10] = { > 0x1040, 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, 0x1048, 0x1049 > }; >- toNumeric(builder, value, myanmarNumerals); >- break; >+ return toNumeric(value, myanmarNumerals); > } > case ListStyleType::Octal: { > static const LChar octalNumerals[8] = { > '0', '1', '2', '3', '4', '5', '6', '7' > }; >- toNumeric(builder, value, octalNumerals); >- break; >+ return toNumeric(value, octalNumerals); > } > case ListStyleType::Oriya: { > static const UChar oriyaNumerals[10] = { > 0x0B66, 0x0B67, 0x0B68, 0x0B69, 0x0B6A, 0x0B6B, 0x0B6C, 0x0B6D, 0x0B6E, 0x0B6F > }; >- toNumeric(builder, value, oriyaNumerals); >- break; >+ return toNumeric(value, oriyaNumerals); > } > case ListStyleType::Persian: > case ListStyleType::Urdu: { > static const UChar urduNumerals[10] = { > 0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, 0x06F5, 0x06F6, 0x06F7, 0x06F8, 0x06F9 > }; >- toNumeric(builder, value, urduNumerals); >- break; >+ return toNumeric(value, urduNumerals); > } > case ListStyleType::Telugu: { > static const UChar teluguNumerals[10] = { > 0x0C66, 0x0C67, 0x0C68, 0x0C69, 0x0C6A, 0x0C6B, 0x0C6C, 0x0C6D, 0x0C6E, 0x0C6F > }; >- toNumeric(builder, value, teluguNumerals); >- break; >+ return toNumeric(value, teluguNumerals); > } > case ListStyleType::Tibetan: { > static const UChar tibetanNumerals[10] = { > 0x0F20, 0x0F21, 0x0F22, 0x0F23, 0x0F24, 0x0F25, 0x0F26, 0x0F27, 0x0F28, 0x0F29 > }; >- toNumeric(builder, value, tibetanNumerals); >- break; >+ return toNumeric(value, tibetanNumerals); > } > case ListStyleType::Thai: { > static const UChar thaiNumerals[10] = { > 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59 > }; >- toNumeric(builder, value, thaiNumerals); >- break; >+ return toNumeric(value, thaiNumerals); > } > case ListStyleType::UpperHexadecimal: { > static const LChar upperHexadecimalNumerals[16] = { > '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' > }; >- toNumeric(builder, value, upperHexadecimalNumerals); >- break; >+ return toNumeric(value, upperHexadecimalNumerals); > } > > case ListStyleType::LowerAlpha: >@@ -804,8 +772,7 @@ String listMarkerText(ListStyleType type, int value) > 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', > 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' > }; >- toAlphabetic(builder, value, lowerLatinAlphabet); >- break; >+ return toAlphabetic(value, lowerLatinAlphabet); > } > case ListStyleType::UpperAlpha: > case ListStyleType::UpperLatin: { >@@ -813,8 +780,7 @@ String listMarkerText(ListStyleType type, int value) > 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', > 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' > }; >- toAlphabetic(builder, value, upperLatinAlphabet); >- break; >+ return toAlphabetic(value, upperLatinAlphabet); > } > case ListStyleType::LowerGreek: { > static const UChar lowerGreekAlphabet[24] = { >@@ -822,8 +788,7 @@ String listMarkerText(ListStyleType type, int value) > 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, > 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9 > }; >- toAlphabetic(builder, value, lowerGreekAlphabet); >- break; >+ return toAlphabetic(value, lowerGreekAlphabet); > } > > case ListStyleType::Hiragana: { >@@ -837,8 +802,7 @@ String listMarkerText(ListStyleType type, int value) > 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, > 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093 > }; >- toAlphabetic(builder, value, hiraganaAlphabet); >- break; >+ return toAlphabetic(value, hiraganaAlphabet); > } > case ListStyleType::HiraganaIroha: { > // FIXME: This table comes from the CSS3 draft, and is probably >@@ -851,8 +815,7 @@ String listMarkerText(ListStyleType type, int value) > 0x3053, 0x3048, 0x3066, 0x3042, 0x3055, 0x304D, 0x3086, 0x3081, > 0x307F, 0x3057, 0x3091, 0x3072, 0x3082, 0x305B, 0x3059 > }; >- toAlphabetic(builder, value, hiraganaIrohaAlphabet); >- break; >+ return toAlphabetic(value, hiraganaIrohaAlphabet); > } > case ListStyleType::Katakana: { > // FIXME: This table comes from the CSS3 draft, and is probably >@@ -865,8 +828,7 @@ String listMarkerText(ListStyleType type, int value) > 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, > 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3 > }; >- toAlphabetic(builder, value, katakanaAlphabet); >- break; >+ return toAlphabetic(value, katakanaAlphabet); > } > case ListStyleType::KatakanaIroha: { > // FIXME: This table comes from the CSS3 draft, and is probably >@@ -879,8 +841,7 @@ String listMarkerText(ListStyleType type, int value) > 0x30B3, 0x30A8, 0x30C6, 0x30A2, 0x30B5, 0x30AD, 0x30E6, 0x30E1, > 0x30DF, 0x30B7, 0x30F1, 0x30D2, 0x30E2, 0x30BB, 0x30B9 > }; >- toAlphabetic(builder, value, katakanaIrohaAlphabet); >- break; >+ return toAlphabetic(value, katakanaIrohaAlphabet); > } > > case ListStyleType::Afar: >@@ -890,8 +851,7 @@ String listMarkerText(ListStyleType type, int value) > 0x1200, 0x1208, 0x1210, 0x1218, 0x1228, 0x1230, 0x1260, 0x1270, 0x1290, > 0x12A0, 0x12A8, 0x12C8, 0x12D0, 0x12E8, 0x12F0, 0x1308, 0x1338, 0x1348 > }; >- toAlphabetic(builder, value, ethiopicHalehameAaErAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameAaErAlphabet); > } > case ListStyleType::Amharic: > case ListStyleType::EthiopicHalehameAmEt: { >@@ -901,8 +861,7 @@ String listMarkerText(ListStyleType type, int value) > 0x12C8, 0x12D0, 0x12D8, 0x12E0, 0x12E8, 0x12F0, 0x1300, 0x1308, 0x1320, > 0x1328, 0x1330, 0x1338, 0x1340, 0x1348, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicHalehameAmEtAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameAmEtAlphabet); > } > case ListStyleType::AmharicAbegede: > case ListStyleType::EthiopicAbegedeAmEt: { >@@ -912,24 +871,21 @@ String listMarkerText(ListStyleType type, int value) > 0x1298, 0x1220, 0x12D0, 0x1348, 0x1338, 0x1240, 0x1228, 0x1230, 0x1238, > 0x1270, 0x1278, 0x1280, 0x1340, 0x1330, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicAbegedeAmEtAlphabet); >- break; >+ return toAlphabetic(value, ethiopicAbegedeAmEtAlphabet); > } > case ListStyleType::CjkEarthlyBranch: { > static const UChar cjkEarthlyBranchAlphabet[12] = { > 0x5B50, 0x4E11, 0x5BC5, 0x536F, 0x8FB0, 0x5DF3, 0x5348, 0x672A, 0x7533, > 0x9149, 0x620C, 0x4EA5 > }; >- toAlphabetic(builder, value, cjkEarthlyBranchAlphabet); >- break; >+ return toAlphabetic(value, cjkEarthlyBranchAlphabet); > } > case ListStyleType::CjkHeavenlyStem: { > static const UChar cjkHeavenlyStemAlphabet[10] = { > 0x7532, 0x4E59, 0x4E19, 0x4E01, 0x620A, 0x5DF1, 0x5E9A, 0x8F9B, 0x58EC, > 0x7678 > }; >- toAlphabetic(builder, value, cjkHeavenlyStemAlphabet); >- break; >+ return toAlphabetic(value, cjkHeavenlyStemAlphabet); > } > case ListStyleType::Ethiopic: > case ListStyleType::EthiopicHalehameGez: { >@@ -938,8 +894,7 @@ String listMarkerText(ListStyleType type, int value) > 0x1270, 0x1280, 0x1290, 0x12A0, 0x12A8, 0x12C8, 0x12D0, 0x12D8, 0x12E8, > 0x12F0, 0x1308, 0x1320, 0x1330, 0x1338, 0x1340, 0x1348, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicHalehameGezAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameGezAlphabet); > } > case ListStyleType::EthiopicAbegede: > case ListStyleType::EthiopicAbegedeGez: { >@@ -948,24 +903,21 @@ String listMarkerText(ListStyleType type, int value) > 0x12E8, 0x12A8, 0x1208, 0x1218, 0x1290, 0x1220, 0x12D0, 0x1348, 0x1338, > 0x1240, 0x1228, 0x1230, 0x1270, 0x1280, 0x1340, 0x1330, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicAbegedeGezAlphabet); >- break; >+ return toAlphabetic(value, ethiopicAbegedeGezAlphabet); > } > case ListStyleType::HangulConsonant: { > static const UChar hangulConsonantAlphabet[14] = { > 0x3131, 0x3134, 0x3137, 0x3139, 0x3141, 0x3142, 0x3145, 0x3147, 0x3148, > 0x314A, 0x314B, 0x314C, 0x314D, 0x314E > }; >- toAlphabetic(builder, value, hangulConsonantAlphabet); >- break; >+ return toAlphabetic(value, hangulConsonantAlphabet); > } > case ListStyleType::Hangul: { > static const UChar hangulAlphabet[14] = { > 0xAC00, 0xB098, 0xB2E4, 0xB77C, 0xB9C8, 0xBC14, 0xC0AC, 0xC544, 0xC790, > 0xCC28, 0xCE74, 0xD0C0, 0xD30C, 0xD558 > }; >- toAlphabetic(builder, value, hangulAlphabet); >- break; >+ return toAlphabetic(value, hangulAlphabet); > } > case ListStyleType::Oromo: > case ListStyleType::EthiopicHalehameOmEt: { >@@ -974,8 +926,7 @@ String listMarkerText(ListStyleType type, int value) > 0x1278, 0x1290, 0x1298, 0x12A0, 0x12A8, 0x12C8, 0x12E8, 0x12F0, 0x12F8, > 0x1300, 0x1308, 0x1320, 0x1328, 0x1338, 0x1330, 0x1348 > }; >- toAlphabetic(builder, value, ethiopicHalehameOmEtAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameOmEtAlphabet); > } > case ListStyleType::Sidama: > case ListStyleType::EthiopicHalehameSidEt: { >@@ -984,8 +935,7 @@ String listMarkerText(ListStyleType type, int value) > 0x1270, 0x1278, 0x1290, 0x1298, 0x12A0, 0x12A8, 0x12C8, 0x12E8, 0x12F0, > 0x12F8, 0x1300, 0x1308, 0x1320, 0x1328, 0x1338, 0x1330, 0x1348 > }; >- toAlphabetic(builder, value, ethiopicHalehameSidEtAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameSidEtAlphabet); > } > case ListStyleType::Somali: > case ListStyleType::EthiopicHalehameSoEt: { >@@ -994,8 +944,7 @@ String listMarkerText(ListStyleType type, int value) > 0x1270, 0x1290, 0x12A0, 0x12A8, 0x12B8, 0x12C8, 0x12D0, 0x12E8, 0x12F0, > 0x1300, 0x1308, 0x1338, 0x1348 > }; >- toAlphabetic(builder, value, ethiopicHalehameSoEtAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameSoEtAlphabet); > } > case ListStyleType::Tigre: > case ListStyleType::EthiopicHalehameTig: { >@@ -1004,8 +953,7 @@ String listMarkerText(ListStyleType type, int value) > 0x1270, 0x1278, 0x1290, 0x12A0, 0x12A8, 0x12C8, 0x12D0, 0x12D8, 0x12E8, > 0x12F0, 0x1300, 0x1308, 0x1320, 0x1328, 0x1338, 0x1330, 0x1348, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicHalehameTigAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameTigAlphabet); > } > case ListStyleType::TigrinyaEr: > case ListStyleType::EthiopicHalehameTiEr: { >@@ -1015,8 +963,7 @@ String listMarkerText(ListStyleType type, int value) > 0x12D0, 0x12D8, 0x12E0, 0x12E8, 0x12F0, 0x1300, 0x1308, 0x1320, 0x1328, > 0x1330, 0x1338, 0x1348, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicHalehameTiErAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameTiErAlphabet); > } > case ListStyleType::TigrinyaErAbegede: > case ListStyleType::EthiopicAbegedeTiEr: { >@@ -1026,8 +973,7 @@ String listMarkerText(ListStyleType type, int value) > 0x1298, 0x12D0, 0x1348, 0x1338, 0x1240, 0x1250, 0x1228, 0x1230, 0x1238, > 0x1270, 0x1278, 0x1330, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicAbegedeTiErAlphabet); >- break; >+ return toAlphabetic(value, ethiopicAbegedeTiErAlphabet); > } > case ListStyleType::TigrinyaEt: > case ListStyleType::EthiopicHalehameTiEt: { >@@ -1037,8 +983,7 @@ String listMarkerText(ListStyleType type, int value) > 0x12B8, 0x12C8, 0x12D0, 0x12D8, 0x12E0, 0x12E8, 0x12F0, 0x1300, 0x1308, > 0x1320, 0x1328, 0x1330, 0x1338, 0x1340, 0x1348, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicHalehameTiEtAlphabet); >- break; >+ return toAlphabetic(value, ethiopicHalehameTiEtAlphabet); > } > case ListStyleType::TigrinyaEtAbegede: > case ListStyleType::EthiopicAbegedeTiEt: { >@@ -1048,8 +993,7 @@ String listMarkerText(ListStyleType type, int value) > 0x1298, 0x1220, 0x12D0, 0x1348, 0x1338, 0x1240, 0x1250, 0x1228, 0x1230, > 0x1238, 0x1270, 0x1278, 0x1280, 0x1340, 0x1330, 0x1350 > }; >- toAlphabetic(builder, value, ethiopicAbegedeTiEtAlphabet); >- break; >+ return toAlphabetic(value, ethiopicAbegedeTiEtAlphabet); > } > case ListStyleType::UpperGreek: { > static const UChar upperGreekAlphabet[24] = { >@@ -1057,8 +1001,7 @@ String listMarkerText(ListStyleType type, int value) > 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, > 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9 > }; >- toAlphabetic(builder, value, upperGreekAlphabet); >- break; >+ return toAlphabetic(value, upperGreekAlphabet); > } > case ListStyleType::LowerNorwegian: { > static const LChar lowerNorwegianAlphabet[29] = { >@@ -1067,8 +1010,7 @@ String listMarkerText(ListStyleType type, int value) > 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xE6, > 0xF8, 0xE5 > }; >- toAlphabetic(builder, value, lowerNorwegianAlphabet); >- break; >+ return toAlphabetic(value, lowerNorwegianAlphabet); > } > case ListStyleType::UpperNorwegian: { > static const LChar upperNorwegianAlphabet[29] = { >@@ -1077,8 +1019,7 @@ String listMarkerText(ListStyleType type, int value) > 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xC6, > 0xD8, 0xC5 > }; >- toAlphabetic(builder, value, upperNorwegianAlphabet); >- break; >+ return toAlphabetic(value, upperNorwegianAlphabet); > } > case ListStyleType::CJKIdeographic: { > static const UChar traditionalChineseInformalTable[16] = { >@@ -1087,36 +1028,30 @@ String listMarkerText(ListStyleType type, int value) > 0x96F6, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, > 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D > }; >- toCJKIdeographic(builder, value, traditionalChineseInformalTable); >- break; >+ return toCJKIdeographic(value, traditionalChineseInformalTable); > } > > case ListStyleType::LowerRoman: >- toRoman(builder, value, false); >- break; >+ return toRoman(value, LetterCase::Lower); > case ListStyleType::UpperRoman: >- toRoman(builder, value, true); >- break; >+ return toRoman(value, LetterCase::Upper); > >+ // A CSS3 draft said that "armenian" means "lower-armenian". But the CSS2.1 test >+ // suite contains uppercase test results for "armenian"; our behavior matches that. > case ListStyleType::Armenian: > case ListStyleType::UpperArmenian: >- // CSS3 says "armenian" means "lower-armenian". >- // But the CSS2.1 test suite contains uppercase test results for "armenian", >- // so we'll match the test suite. >- toArmenian(builder, value, true); >- break; >+ return toArmenian(value, LetterCase::Upper); > case ListStyleType::LowerArmenian: >- toArmenian(builder, value, false); >- break; >+ return toArmenian(value, LetterCase::Lower); >+ > case ListStyleType::Georgian: >- toGeorgian(builder, value); >- break; >+ return toGeorgian(value); > case ListStyleType::Hebrew: >- toHebrew(builder, value); >- break; >+ return toHebrew(value); > } > >- return builder.toString(); >+ ASSERT_NOT_REACHED(); >+ return emptyString(); > } > > RenderListMarker::RenderListMarker(RenderListItem& listItem, RenderStyle&& style) >@@ -1350,32 +1285,35 @@ void RenderListMarker::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffse > else { > const UChar suffix = listMarkerSuffix(type, m_listItem->value()); > >- // Text is not arbitrary. We can judge whether it's RTL from the first character, >- // and we only need to handle the direction U_RIGHT_TO_LEFT for now. >- bool textNeedsReversing = u_charDirection(m_text[0]) == U_RIGHT_TO_LEFT; >- String toDraw; >- if (textNeedsReversing) { >+ // FIXME: Could use a Vector with inline capacity instead of String to avoid >+ // memory allocation here. >+ String textToDraw; >+ >+ // Since marker text is not arbitrary, we can judge its direction just by >+ // checking the first character, and only need to handle U_RIGHT_TO_LEFT. >+ // FIXME: Could check more efficiently than u_charDirection, since we know >+ // only certain characters are used and only need to check for U_RIGHT_TO_LEFT. >+ if (u_charDirection(m_text[0]) == U_RIGHT_TO_LEFT) { > unsigned length = m_text.length(); >- StringBuilder buffer; >- buffer.reserveCapacity(length + 2); >+ UChar* characters; >+ textToDraw = String::createUninitialized(length + 2, characters); > if (!style().isLeftToRightDirection()) { >- buffer.append(space); >- buffer.append(suffix); >+ *characters++ = space; >+ *characters++ = suffix; > } > for (unsigned i = 0; i < length; ++i) >- buffer.append(m_text[length - i - 1]); >+ *characters++ = m_text[length - i - 1]; > if (style().isLeftToRightDirection()) { >- buffer.append(suffix); >- buffer.append(space); >+ *characters++ = suffix; >+ *characters++ = space; > } >- toDraw = buffer.toString(); > } else { > if (style().isLeftToRightDirection()) >- toDraw = m_text + String(&suffix, 1) + String(&space, 1); >+ textToDraw = makeString(m_text, suffix, space); > else >- toDraw = String(&space, 1) + String(&suffix, 1) + m_text; >+ textToDraw = makeString(space, suffix, m_text); > } >- textRun.setText(StringView(toDraw)); >+ textRun.setText(textToDraw); > > context.drawText(font, textRun, textOrigin); > } >@@ -1568,8 +1506,8 @@ void RenderListMarker::computePreferredLogicalWidths() > case ListStyleType::Footnotes: { > TextRun run = RenderBlock::constructTextRun(m_text, style()); > logicalWidth = font.width(run); // no suffix for these types >- } > break; >+ } > case ListStyleType::Circle: > case ListStyleType::Disc: > case ListStyleType::Square: >diff --git a/Source/WebCore/svg/SVGPathUtilities.cpp b/Source/WebCore/svg/SVGPathUtilities.cpp >index 4b79c1fab02dd5851fbba0707d9dd34fcc3fbcec..db8f929ad19b5be0f7949ba5b5244180fcaa7aa8 100644 >--- a/Source/WebCore/svg/SVGPathUtilities.cpp >+++ b/Source/WebCore/svg/SVGPathUtilities.cpp >@@ -60,39 +60,39 @@ String buildStringFromPath(const Path& path) > switch (element.type) { > case PathElementMoveToPoint: > builder.append('M'); >- builder.appendShortestFormNumber(element.points[0].x()); >+ builder.appendNumber(element.points[0].x()); > builder.append(' '); >- builder.appendShortestFormNumber(element.points[0].y()); >+ builder.appendNumber(element.points[0].y()); > break; > case PathElementAddLineToPoint: > builder.append('L'); >- builder.appendShortestFormNumber(element.points[0].x()); >+ builder.appendNumber(element.points[0].x()); > builder.append(' '); >- builder.appendShortestFormNumber(element.points[0].y()); >+ builder.appendNumber(element.points[0].y()); > break; > case PathElementAddQuadCurveToPoint: > builder.append('Q'); >- builder.appendShortestFormNumber(element.points[0].x()); >+ builder.appendNumber(element.points[0].x()); > builder.append(' '); >- builder.appendShortestFormNumber(element.points[0].y()); >+ builder.appendNumber(element.points[0].y()); > builder.append(','); >- builder.appendShortestFormNumber(element.points[1].x()); >+ builder.appendNumber(element.points[1].x()); > builder.append(' '); >- builder.appendShortestFormNumber(element.points[1].y()); >+ builder.appendNumber(element.points[1].y()); > break; > case PathElementAddCurveToPoint: > builder.append('C'); >- builder.appendShortestFormNumber(element.points[0].x()); >+ builder.appendNumber(element.points[0].x()); > builder.append(' '); >- builder.appendShortestFormNumber(element.points[0].y()); >+ builder.appendNumber(element.points[0].y()); > builder.append(','); >- builder.appendShortestFormNumber(element.points[1].x()); >+ builder.appendNumber(element.points[1].x()); > builder.append(' '); >- builder.appendShortestFormNumber(element.points[1].y()); >+ builder.appendNumber(element.points[1].y()); > builder.append(','); >- builder.appendShortestFormNumber(element.points[2].x()); >+ builder.appendNumber(element.points[2].x()); > builder.append(' '); >- builder.appendShortestFormNumber(element.points[2].y()); >+ builder.appendNumber(element.points[2].y()); > break; > case PathElementCloseSubpath: > builder.append('Z'); >diff --git a/Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsTelemetry.cpp b/Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsTelemetry.cpp >index 2ab5f071f3ec88fb1353013ba6930669be6dff47..75391582b1a586355ea67ff9af24878c4095a035 100644 >--- a/Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsTelemetry.cpp >+++ b/Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsTelemetry.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2019 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -37,7 +37,7 @@ > #include <wtf/MainThread.h> > #include <wtf/NeverDestroyed.h> > #include <wtf/RunLoop.h> >-#include <wtf/text/StringBuilder.h> >+#include <wtf/text/StringConcatenateNumbers.h> > > namespace WebKit { > using namespace WebCore; >@@ -159,11 +159,8 @@ static void submitTopList(unsigned numberOfResourcesFromTheTop, const Vector<Pre > unsigned topNumberOfTimesAccessedAsFirstPartyDueToUserInteraction = median(sortedPrevalentResourcesWithoutUserInteraction, 0, numberOfResourcesFromTheTop - 1, numberOfTimesAccessedAsFirstPartyDueToUserInteractionGetter); > unsigned topNumberOfTimesAccessedAsFirstPartyDueToStorageAccessAPI = median(sortedPrevalentResourcesWithoutUserInteraction, 0, numberOfResourcesFromTheTop - 1, numberOfTimesAccessedAsFirstPartyDueToStorageAccessAPIGetter); > >- StringBuilder preambleBuilder; >- preambleBuilder.appendLiteral("top"); >- preambleBuilder.appendNumber(numberOfResourcesFromTheTop); >- String descriptionPreamble = preambleBuilder.toString(); >- >+ String descriptionPreamble = makeString("top", numberOfResourcesFromTheTop); >+ > store.sendDiagnosticMessageWithValue(DiagnosticLoggingKeys::resourceLoadStatisticsTelemetryKey(), descriptionPreamble + "PrevalentResourcesWithUserInteraction", > topPrevalentResourcesWithUserInteraction, significantFiguresForLoggedValues, ShouldSample::No); > store.sendDiagnosticMessageWithValue(DiagnosticLoggingKeys::resourceLoadStatisticsTelemetryKey(), descriptionPreamble + "SubframeUnderTopFrameOrigins", >diff --git a/Source/WebKit/UIProcess/API/APIUserScript.cpp b/Source/WebKit/UIProcess/API/APIUserScript.cpp >index 4022efdcb97a509f6e0ef895dcb673866aa9f56f..e7cec44643e481409801b43f41f80fc73cd643a7 100644 >--- a/Source/WebKit/UIProcess/API/APIUserScript.cpp >+++ b/Source/WebKit/UIProcess/API/APIUserScript.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2015 Apple Inc. All rights reserved. >+ * Copyright (C) 2015-2019 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -26,18 +26,14 @@ > #include "config.h" > #include "APIUserScript.h" > >-#include <wtf/text/StringBuilder.h> >+#include <wtf/text/StringConcatenateNumbers.h> > > namespace API { > > WTF::URL UserScript::generateUniqueURL() > { > static uint64_t identifier; >- >- StringBuilder urlStringBuilder; >- urlStringBuilder.appendLiteral("user-script:"); >- urlStringBuilder.appendNumber(++identifier); >- return { { }, urlStringBuilder.toString() }; >+ return { { }, makeString("user-script:", ++identifier) }; > } > > UserScript::UserScript(WebCore::UserScript userScript, API::UserContentWorld& world) >diff --git a/Source/WebKit/UIProcess/API/APIUserStyleSheet.cpp b/Source/WebKit/UIProcess/API/APIUserStyleSheet.cpp >index 3ea461fe1a156c6a9d589584037fe387c2907f08..fd69b832095ff9942289b799f99a4854eb3e7f46 100644 >--- a/Source/WebKit/UIProcess/API/APIUserStyleSheet.cpp >+++ b/Source/WebKit/UIProcess/API/APIUserStyleSheet.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2015 Apple Inc. All rights reserved. >+ * Copyright (C) 2015-2019 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -26,18 +26,14 @@ > #include "config.h" > #include "APIUserStyleSheet.h" > >-#include <wtf/text/StringBuilder.h> >+#include <wtf/text/StringConcatenateNumbers.h> > > namespace API { > > WTF::URL UserStyleSheet::generateUniqueURL() > { > static uint64_t identifier; >- >- StringBuilder urlStringBuilder; >- urlStringBuilder.appendLiteral("user-style-sheet:"); >- urlStringBuilder.appendNumber(++identifier); >- return { { }, urlStringBuilder.toString() }; >+ return { { }, makeString("user-style-sheet:", ++identifier) }; > } > > UserStyleSheet::UserStyleSheet(WebCore::UserStyleSheet userStyleSheet, API::UserContentWorld& world) >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 288349033ceec728bdcd2b28d92272549e0c674c..814b0de5bf71829e3afcf9de74153d8147c705da 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,18 @@ >+2019-06-02 Darin Adler <darin@apple.com> >+ >+ Finish cleanup of String::number for floating point >+ https://bugs.webkit.org/show_bug.cgi?id=198471 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * TestWebKitAPI/Tests/WTF/WTFString.cpp: >+ (TestWebKitAPI::testStringNumber): Go back to calling String::number instead of >+ String::numberToStringECMAScript. >+ >+ * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: >+ (WTR::dumpFrameScrollPosition): Use appendNumber instead of appendECMAScriptNumber >+ since that is now the default. >+ > 2019-05-31 Sihui Liu <sihui_liu@apple.com> > > TestWebKitAPI.WKWebView.LocalStorageProcessSuspends is flaky >diff --git a/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp b/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp >index 7a057dcafda6664fade608d69f2efc6a412f6826..7ad2028f71a6aaa084385054b9ae03d8e204655b 100644 >--- a/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp >+++ b/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp >@@ -172,7 +172,7 @@ TEST(WTF, StringNumberFixedWidth) > static inline const char* testStringNumber(double number) > { > static char testBuffer[100] = { }; >- std::strncpy(testBuffer, String::numberToStringECMAScript(number).utf8().data(), 99); >+ std::strncpy(testBuffer, String::number(number).utf8().data(), 99); > return testBuffer; > } > >diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp >index 4001f862b9c3156f33ca5388311c8908e4ddf312..dc9de166372dd0406445788a8c3c3ab80760162b 100644 >--- a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp >+++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp >@@ -782,9 +782,9 @@ static void dumpFrameScrollPosition(WKBundleFrameRef frame, StringBuilder& strin > stringBuilder.appendLiteral("' "); > } > stringBuilder.appendLiteral("scrolled to "); >- stringBuilder.appendECMAScriptNumber(x); >+ stringBuilder.appendNumber(x); > stringBuilder.append(','); >- stringBuilder.appendECMAScriptNumber(y); >+ stringBuilder.appendNumber(y); > stringBuilder.append('\n'); > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198471
:
371172
| 371173