Diff
Modified: trunk/Source/WTF/ChangeLog (278403 => 278404)
--- trunk/Source/WTF/ChangeLog 2021-06-03 13:02:37 UTC (rev 278403)
+++ trunk/Source/WTF/ChangeLog 2021-06-03 13:10:38 UTC (rev 278404)
@@ -1,3 +1,35 @@
+2021-06-03 Michael Catanzaro <[email protected]>
+
+ REGRESSION(r277744): Broke build on s390x mainframes
+ https://bugs.webkit.org/show_bug.cgi?id=226497
+
+ Reviewed by Darin Adler.
+
+ The problem is we have a template defined in a C++ source file, used by multiple source
+ files. This is not valid C++, so let's split the templates defined in StringBuilder.cpp out
+ into a new StringBuilderInternals.h that we can #include in both StringBuilder.cpp and
+ StringBuilderJSON.cpp.
+
+ Ideally we would move the template defined in StringBuilderJSON.cpp as well, and then
+ eliminate StringBuilderJSON.cpp since there would only be one function left. But that file
+ has an MPL license. It's easier to leave it be to keep the license situation simpler.
+
+ * WTF.xcodeproj/project.pbxproj:
+ * wtf/CMakeLists.txt:
+ * wtf/text/StringBuilder.cpp:
+ (WTF::StringBuilder::expandedCapacity):
+ (WTF::expandedCapacity): Deleted.
+ (WTF::StringBuilder::allocateBuffer): Deleted.
+ (WTF::StringBuilder::extendBufferForAppending): Deleted.
+ (WTF::StringBuilder::extendBufferForAppendingSlowCase): Deleted.
+ * wtf/text/StringBuilder.h:
+ * wtf/text/StringBuilderInternals.h: Added.
+ (WTF::StringBuilder::allocateBuffer):
+ (WTF::StringBuilder::reallocateBuffer):
+ (WTF::StringBuilder::extendBufferForAppending):
+ (WTF::StringBuilder::extendBufferForAppendingSlowCase):
+ * wtf/text/StringBuilderJSON.cpp:
+
2021-06-02 Chris Dumez <[email protected]>
Drop WTF::Vector overloads taking index as Checked<size_t>
Modified: trunk/Source/WTF/WTF.xcodeproj/project.pbxproj (278403 => 278404)
--- trunk/Source/WTF/WTF.xcodeproj/project.pbxproj 2021-06-03 13:02:37 UTC (rev 278403)
+++ trunk/Source/WTF/WTF.xcodeproj/project.pbxproj 2021-06-03 13:10:38 UTC (rev 278404)
@@ -654,6 +654,7 @@
A8A47323151A825B004123FF /* StringBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringBuffer.h; sourceTree = "<group>"; };
A8A47324151A825B004123FF /* StringBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringBuilder.cpp; sourceTree = "<group>"; };
A8A47325151A825B004123FF /* StringBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringBuilder.h; sourceTree = "<group>"; };
+ A8A47325151A825B004123EE /* StringBuilderInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringBuilderInternals.h; sourceTree = "<group>"; };
A8A47326151A825B004123FF /* StringConcatenate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringConcatenate.h; sourceTree = "<group>"; };
A8A47327151A825B004123FF /* StringHash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringHash.h; sourceTree = "<group>"; };
A8A47328151A825B004123FF /* StringImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringImpl.cpp; sourceTree = "<group>"; };
@@ -1424,6 +1425,7 @@
A8A47323151A825B004123FF /* StringBuffer.h */,
A8A47324151A825B004123FF /* StringBuilder.cpp */,
A8A47325151A825B004123FF /* StringBuilder.h */,
+ A8A47325151A825B004123EE /* StringBuilderInternals.h */,
E38D6E261F5522E300A75CC4 /* StringBuilderJSON.cpp */,
430B47871AAAAC1A001223DA /* StringCommon.h */,
A8A47326151A825B004123FF /* StringConcatenate.h */,
Modified: trunk/Source/WTF/wtf/CMakeLists.txt (278403 => 278404)
--- trunk/Source/WTF/wtf/CMakeLists.txt 2021-06-03 13:02:37 UTC (rev 278403)
+++ trunk/Source/WTF/wtf/CMakeLists.txt 2021-06-03 13:10:38 UTC (rev 278404)
@@ -346,6 +346,7 @@
text/OrdinalNumber.h
text/StringBuffer.h
text/StringBuilder.h
+ text/StringBuilderInternals.h
text/StringCommon.h
text/StringConcatenate.h
text/StringConcatenateNumbers.h
Modified: trunk/Source/WTF/wtf/text/StringBuilder.cpp (278403 => 278404)
--- trunk/Source/WTF/wtf/text/StringBuilder.cpp 2021-06-03 13:02:37 UTC (rev 278403)
+++ trunk/Source/WTF/wtf/text/StringBuilder.cpp 2021-06-03 13:10:38 UTC (rev 278404)
@@ -28,12 +28,13 @@
#include <wtf/text/StringBuilder.h>
#include <wtf/dtoa.h>
+#include <wtf/text/StringBuilderInternals.h>
namespace WTF {
static constexpr unsigned maxCapacity = String::MaxLength;
-static unsigned expandedCapacity(unsigned capacity, unsigned requiredCapacity)
+unsigned StringBuilder::expandedCapacity(unsigned capacity, unsigned requiredCapacity)
{
static constexpr unsigned minimumCapacity = 16;
return std::max(requiredCapacity, std::max(minimumCapacity, std::min(capacity * 2, maxCapacity)));
@@ -102,43 +103,6 @@
m_string = StringImpl::createSubstringSharingImpl(*m_string.impl(), 0, newLength);
}
-// Allocate a new buffer, copying in currentCharacters (these may come from either m_string or m_buffer.
-template<typename AllocationCharacterType, typename CurrentCharacterType> void StringBuilder::allocateBuffer(const CurrentCharacterType* currentCharacters, unsigned requiredCapacity)
-{
- AllocationCharacterType* bufferCharacters;
- auto buffer = StringImpl::tryCreateUninitialized(requiredCapacity, bufferCharacters);
- if (UNLIKELY(!buffer)) {
- didOverflow();
- return;
- }
-
- ASSERT(!hasOverflowed());
- StringImpl::copyCharacters(bufferCharacters, currentCharacters, m_length);
-
- m_buffer = WTFMove(buffer);
- m_string = { };
-}
-
-template<typename CharacterType> void StringBuilder::reallocateBuffer(unsigned requiredCapacity)
-{
- // If the buffer has only one ref (by this StringBuilder), reallocate it.
- if (m_buffer) {
- m_string = { }; // Clear the string to remove the reference to m_buffer if any before checking the reference count of m_buffer.
- if (m_buffer->hasOneRef()) {
- CharacterType* bufferCharacters;
- auto buffer = StringImpl::tryReallocate(m_buffer.releaseNonNull(), requiredCapacity, bufferCharacters);
- if (UNLIKELY(!buffer)) {
- didOverflow();
- return;
- }
- m_buffer = WTFMove(*buffer);
- return;
- }
- }
-
- allocateBuffer<CharacterType>(characters<CharacterType>(), requiredCapacity);
-}
-
void StringBuilder::reallocateBuffer(unsigned requiredCapacity)
{
if (is8Bit())
@@ -168,31 +132,6 @@
ASSERT(hasOverflowed() || !newCapacity || m_buffer->length() >= newCapacity);
}
-// Make 'additionalLength' additional capacity be available in m_buffer, update m_string & m_length to use,
-// that capacity and return a pointer to the newly allocated storage so the caller can write characters there.
-// Returns nullptr if allocation fails, length overflows, or if total capacity is 0 so no buffer is needed.
-// The caller has the responsibility for checking that CharacterType is the type of the existing buffer.
-template<typename CharacterType> CharacterType* StringBuilder::extendBufferForAppending(unsigned requiredLength)
-{
- if (m_buffer && requiredLength <= m_buffer->length()) {
- m_string = { };
- return const_cast<CharacterType*>(m_buffer->characters<CharacterType>()) + std::exchange(m_length, requiredLength);
- }
- return extendBufferForAppendingSlowCase<CharacterType>(requiredLength);
-}
-
-// Shared by the other extendBuffer functions.
-template<typename CharacterType> CharacterType* StringBuilder::extendBufferForAppendingSlowCase(unsigned requiredLength)
-{
- ASSERT(!hasOverflowed());
- if (!requiredLength)
- return nullptr;
- reallocateBuffer(expandedCapacity(capacity(), requiredLength));
- if (UNLIKELY(hasOverflowed()))
- return nullptr;
- return const_cast<CharacterType*>(m_buffer->characters<CharacterType>()) + std::exchange(m_length, requiredLength);
-}
-
// Alterative extendBufferForAppending that can be called from the header without inlining.
LChar* StringBuilder::extendBufferForAppendingLChar(unsigned requiredLength)
{
Modified: trunk/Source/WTF/wtf/text/StringBuilder.h (278403 => 278404)
--- trunk/Source/WTF/wtf/text/StringBuilder.h 2021-06-03 13:02:37 UTC (rev 278403)
+++ trunk/Source/WTF/wtf/text/StringBuilder.h 2021-06-03 13:10:38 UTC (rev 278404)
@@ -103,6 +103,8 @@
WTF_EXPORT_PRIVATE bool isAllASCII() const;
private:
+ static unsigned expandedCapacity(unsigned capacity, unsigned requiredCapacity);
+
template<typename AllocationCharacterType, typename CurrentCharacterType> void allocateBuffer(const CurrentCharacterType* currentCharacters, unsigned requiredCapacity);
template<typename CharacterType> void reallocateBuffer(unsigned requiredCapacity);
void reallocateBuffer(unsigned requiredCapacity);
Added: trunk/Source/WTF/wtf/text/StringBuilderInternals.h (0 => 278404)
--- trunk/Source/WTF/wtf/text/StringBuilderInternals.h (rev 0)
+++ trunk/Source/WTF/wtf/text/StringBuilderInternals.h 2021-06-03 13:10:38 UTC (rev 278404)
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2010-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <wtf/text/StringBuilder.h>
+
+namespace WTF {
+
+// Allocate a new buffer, copying in currentCharacters (these may come from either m_string or m_buffer.
+template<typename AllocationCharacterType, typename CurrentCharacterType> void StringBuilder::allocateBuffer(const CurrentCharacterType* currentCharacters, unsigned requiredCapacity)
+{
+ AllocationCharacterType* bufferCharacters;
+ auto buffer = StringImpl::tryCreateUninitialized(requiredCapacity, bufferCharacters);
+ if (UNLIKELY(!buffer)) {
+ didOverflow();
+ return;
+ }
+
+ ASSERT(!hasOverflowed());
+ StringImpl::copyCharacters(bufferCharacters, currentCharacters, m_length);
+
+ m_buffer = WTFMove(buffer);
+ m_string = { };
+}
+
+template<typename CharacterType> void StringBuilder::reallocateBuffer(unsigned requiredCapacity)
+{
+ // If the buffer has only one ref (by this StringBuilder), reallocate it.
+ if (m_buffer) {
+ m_string = { }; // Clear the string to remove the reference to m_buffer if any before checking the reference count of m_buffer.
+ if (m_buffer->hasOneRef()) {
+ CharacterType* bufferCharacters;
+ auto buffer = StringImpl::tryReallocate(m_buffer.releaseNonNull(), requiredCapacity, bufferCharacters);
+ if (UNLIKELY(!buffer)) {
+ didOverflow();
+ return;
+ }
+ m_buffer = WTFMove(*buffer);
+ return;
+ }
+ }
+
+ allocateBuffer<CharacterType>(characters<CharacterType>(), requiredCapacity);
+}
+
+// Make 'additionalLength' additional capacity be available in m_buffer, update m_string & m_length to use,
+// that capacity and return a pointer to the newly allocated storage so the caller can write characters there.
+// Returns nullptr if allocation fails, length overflows, or if total capacity is 0 so no buffer is needed.
+// The caller has the responsibility for checking that CharacterType is the type of the existing buffer.
+template<typename CharacterType> CharacterType* StringBuilder::extendBufferForAppending(unsigned requiredLength)
+{
+ if (m_buffer && requiredLength <= m_buffer->length()) {
+ m_string = { };
+ return const_cast<CharacterType*>(m_buffer->characters<CharacterType>()) + std::exchange(m_length, requiredLength);
+ }
+ return extendBufferForAppendingSlowCase<CharacterType>(requiredLength);
+}
+
+// Shared by the other extendBuffer functions.
+template<typename CharacterType> CharacterType* StringBuilder::extendBufferForAppendingSlowCase(unsigned requiredLength)
+{
+ ASSERT(!hasOverflowed());
+ if (!requiredLength)
+ return nullptr;
+ reallocateBuffer(expandedCapacity(capacity(), requiredLength));
+ if (UNLIKELY(hasOverflowed()))
+ return nullptr;
+ return const_cast<CharacterType*>(m_buffer->characters<CharacterType>()) + std::exchange(m_length, requiredLength);
+}
+
+} // namespace WTF
Modified: trunk/Source/WTF/wtf/text/StringBuilderJSON.cpp (278403 => 278404)
--- trunk/Source/WTF/wtf/text/StringBuilderJSON.cpp 2021-06-03 13:02:37 UTC (rev 278403)
+++ trunk/Source/WTF/wtf/text/StringBuilderJSON.cpp 2021-06-03 13:10:38 UTC (rev 278404)
@@ -12,6 +12,7 @@
#include "config.h"
#include <wtf/text/StringBuilder.h>
+#include <wtf/text/StringBuilderInternals.h>
#include <wtf/text/WTFString.h>
namespace WTF {