Title: [278404] trunk/Source/WTF
Revision
278404
Author
[email protected]
Date
2021-06-03 06:10:38 -0700 (Thu, 03 Jun 2021)

Log Message

REGRESSION(r277744): Broke build on s390x mainframes
https://bugs.webkit.org/show_bug.cgi?id=226497

Patch by Michael Catanzaro <[email protected]> on 2021-06-03
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:

Modified Paths

Added Paths

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 {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to