Title: [248903] trunk
Revision
248903
Author
da...@apple.com
Date
2019-08-20 10:14:37 -0700 (Tue, 20 Aug 2019)

Log Message

Variadic StringBuilder::append does not handle upconverting from 8-bit to 16-bit correctly
https://bugs.webkit.org/show_bug.cgi?id=200921

Reviewed by Saam Barati.

Source/WTF:

* wtf/text/StringBuilder.cpp:
(WTF::StringBuilder::appendUninitialized8): Renamed from
appendUninitializedWithoutOverflowCheckForLChar and moved the length overflow
check in here to cut down on unnecessary inlining and code size.
(WTF::StringBuilder::appendUninitialized16): Renamed from
appendUninitializedWithoutOverflowCheckForUChar, moved the length overflow check
in here, and moved the necessary upconversion code from the const UChar* overload of
the appendCharacters function.
(WTF::StringBuilder::appendCharacters): Removed unneeded "length has already overflowed"
check at the start of the function since the code in the function already handles that
case correctly. Refactored the const UChar* overload to use the new appendCharacters16
function so it can share more code with StringBuilder::appendFromAdapters.

* wtf/text/StringBuilder.h:
(WTF::StringBuilder::appendFromAdapters): Updated the function names for the
two appendUninitialized functions, which now do a bit more than before. Removed the
overflow check since the appendUninitialized8/16 functions now handle that; better to
not make the inlined code larger to handle a failure case.

Tools:

* TestWebKitAPI/Tests/WTF/StringBuilder.cpp:
Changed tests to use EXPECT macros instead of ASSERT macros since we don't
need to abort after the first failure. Added three new tests to the VariadicAppend
test to cover various cases of upconverting from 8-bit to 16-bit strings.

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (248902 => 248903)


--- trunk/Source/WTF/ChangeLog	2019-08-20 16:53:21 UTC (rev 248902)
+++ trunk/Source/WTF/ChangeLog	2019-08-20 17:14:37 UTC (rev 248903)
@@ -1,3 +1,29 @@
+2019-08-20  Darin Adler  <da...@apple.com>
+
+        Variadic StringBuilder::append does not handle upconverting from 8-bit to 16-bit correctly
+        https://bugs.webkit.org/show_bug.cgi?id=200921
+
+        Reviewed by Saam Barati.
+
+        * wtf/text/StringBuilder.cpp:
+        (WTF::StringBuilder::appendUninitialized8): Renamed from
+        appendUninitializedWithoutOverflowCheckForLChar and moved the length overflow
+        check in here to cut down on unnecessary inlining and code size.
+        (WTF::StringBuilder::appendUninitialized16): Renamed from
+        appendUninitializedWithoutOverflowCheckForUChar, moved the length overflow check
+        in here, and moved the necessary upconversion code from the const UChar* overload of
+        the appendCharacters function.
+        (WTF::StringBuilder::appendCharacters): Removed unneeded "length has already overflowed"
+        check at the start of the function since the code in the function already handles that
+        case correctly. Refactored the const UChar* overload to use the new appendCharacters16
+        function so it can share more code with StringBuilder::appendFromAdapters.
+
+        * wtf/text/StringBuilder.h:
+        (WTF::StringBuilder::appendFromAdapters): Updated the function names for the
+        two appendUninitialized functions, which now do a bit more than before. Removed the
+        overflow check since the appendUninitialized8/16 functions now handle that; better to
+        not make the inlined code larger to handle a failure case.
+
 2019-08-19  Sam Weinig  <wei...@apple.com>
 
         [WHLSL] Make generated Metal code should be indented properly to ease reading while debugging

Modified: trunk/Source/WTF/wtf/text/StringBuilder.cpp (248902 => 248903)


--- trunk/Source/WTF/wtf/text/StringBuilder.cpp	2019-08-20 16:53:21 UTC (rev 248902)
+++ trunk/Source/WTF/wtf/text/StringBuilder.cpp	2019-08-20 17:14:37 UTC (rev 248903)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2018 Apple Inc. All rights reserved.
+ * Copyright (C) 2010-2019 Apple Inc. All rights reserved.
  * Copyright (C) 2012 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -259,18 +259,42 @@
         m_length = requiredLength;
         return getBufferCharacters<CharacterType>() + currentLength;
     }
-    
+
     return appendUninitializedSlow<CharacterType>(requiredLength.unsafeGet());
 }
 
-UChar* StringBuilder::appendUninitializedWithoutOverflowCheckForUChar(CheckedInt32 requiredLength)
+LChar* StringBuilder::appendUninitialized8(CheckedInt32 requiredLength)
 {
-    return appendUninitializedWithoutOverflowCheck<UChar>(requiredLength);
+    if (UNLIKELY(requiredLength.hasOverflowed())) {
+        didOverflow();
+        return nullptr;
+    }
+    return appendUninitializedWithoutOverflowCheck<LChar>(requiredLength);
 }
 
-LChar* StringBuilder::appendUninitializedWithoutOverflowCheckForLChar(CheckedInt32 requiredLength)
+UChar* StringBuilder::appendUninitialized16(CheckedInt32 requiredLength)
 {
-    return appendUninitializedWithoutOverflowCheck<LChar>(requiredLength);
+    if (UNLIKELY(requiredLength.hasOverflowed())) {
+        didOverflow();
+        return nullptr;
+    }
+    if (m_is8Bit) {
+        const LChar* characters;
+        if (m_buffer) {
+            ASSERT(m_buffer->length() >= m_length.unsafeGet<unsigned>());
+            characters = m_buffer->characters8();
+        } else {
+            ASSERT(m_string.length() == m_length.unsafeGet<unsigned>());
+            characters = m_string.isNull() ? nullptr : m_string.characters8();
+        }
+        allocateBufferUpConvert(characters, expandedCapacity(capacity(), requiredLength.unsafeGet()));
+        if (UNLIKELY(hasOverflowed()))
+            return nullptr;
+        unsigned oldLength = m_length.unsafeGet();
+        m_length = requiredLength.unsafeGet();
+        return m_bufferCharacters16 + oldLength;
+    }
+    return appendUninitializedWithoutOverflowCheck<UChar>(requiredLength);
 }
 
 // Make 'requiredLength' capacity be available in m_buffer, update m_string & m_length,
@@ -301,43 +325,22 @@
 
 void StringBuilder::appendCharacters(const UChar* characters, unsigned length)
 {
-    if (!length || hasOverflowed())
+    if (!length)
         return;
 
     ASSERT(characters);
 
-    if (m_is8Bit) {
-        if (length == 1 && isLatin1(characters[0])) {
-            append(static_cast<LChar>(characters[0]));
-            return;
-        }
+    if (m_is8Bit && length == 1 && isLatin1(characters[0])) {
+        append(static_cast<LChar>(characters[0]));
+        return;
+    }
 
-        // FIXME: Should we optimize memory by keeping the string 8-bit when all the characters are Latin-1?
+    // FIXME: Should we optimize memory by keeping the string 8-bit when all the characters are Latin-1?
 
-        // Calculate the new size of the builder after appending.
-        CheckedInt32 requiredLength = m_length + length;
-        if (requiredLength.hasOverflowed())
-            return didOverflow();
-        
-        if (m_buffer) {
-            // If the buffer is valid it must be at least as long as the current builder contents!
-            ASSERT(m_buffer->length() >= m_length.unsafeGet<unsigned>());
-            allocateBufferUpConvert(m_buffer->characters8(), expandedCapacity(capacity(), requiredLength.unsafeGet()));
-        } else {
-            ASSERT(m_string.length() == m_length.unsafeGet<unsigned>());
-            allocateBufferUpConvert(m_string.isNull() ? nullptr : m_string.characters8(), expandedCapacity(capacity(), requiredLength.unsafeGet()));
-        }
-        if (UNLIKELY(hasOverflowed()))
-            return;
-
-        memcpy(m_bufferCharacters16 + m_length.unsafeGet<unsigned>(), characters, static_cast<size_t>(length) * sizeof(UChar));
-        m_length = requiredLength;
-    } else {
-        UChar* dest = appendUninitialized<UChar>(length);
-        if (!dest)
-            return;
-        memcpy(dest, characters, static_cast<size_t>(length) * sizeof(UChar));
-    }
+    UChar* destination = appendUninitialized16(m_length + length);
+    if (UNLIKELY(!destination))
+        return;
+    std::memcpy(destination, characters, static_cast<size_t>(length) * sizeof(UChar));
     ASSERT(!hasOverflowed());
     ASSERT(m_buffer->length() >= m_length.unsafeGet<unsigned>());
 }
@@ -344,7 +347,7 @@
 
 void StringBuilder::appendCharacters(const LChar* characters, unsigned length)
 {
-    if (!length || hasOverflowed())
+    if (!length)
         return;
 
     ASSERT(characters);

Modified: trunk/Source/WTF/wtf/text/StringBuilder.h (248902 => 248903)


--- trunk/Source/WTF/wtf/text/StringBuilder.h	2019-08-20 16:53:21 UTC (rev 248902)
+++ trunk/Source/WTF/wtf/text/StringBuilder.h	2019-08-20 17:14:37 UTC (rev 248903)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2018 Apple Inc. All rights reserved.
+ * Copyright (C) 2009-2019 Apple Inc. All rights reserved.
  * Copyright (C) 2012 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -360,10 +360,9 @@
     template<typename CharacterType> ALWAYS_INLINE CharacterType* appendUninitialized(unsigned additionalLength);
     template<typename CharacterType> ALWAYS_INLINE CharacterType* appendUninitializedWithoutOverflowCheck(CheckedInt32 requiredLength);
     template<typename CharacterType> CharacterType* appendUninitializedSlow(unsigned requiredLength);
-    
-    WTF_EXPORT_PRIVATE UChar* appendUninitializedWithoutOverflowCheckForUChar(CheckedInt32 requiredLength);
-    WTF_EXPORT_PRIVATE LChar* appendUninitializedWithoutOverflowCheckForLChar(CheckedInt32 requiredLength);
-    
+    WTF_EXPORT_PRIVATE LChar* appendUninitialized8(CheckedInt32 requiredLength);
+    WTF_EXPORT_PRIVATE UChar* appendUninitialized16(CheckedInt32 requiredLength);
+
     template<typename CharacterType> ALWAYS_INLINE CharacterType* getBufferCharacters();
     WTF_EXPORT_PRIVATE void reifyString() const;
 
@@ -401,25 +400,20 @@
 void StringBuilder::appendFromAdapters(StringTypeAdapters... adapters)
 {
     auto requiredLength = checkedSum<int32_t>(m_length, adapters.length()...);
-    if (requiredLength.hasOverflowed()) {
-        didOverflow();
-        return;
-    }
-
     if (m_is8Bit && are8Bit(adapters...)) {
-        LChar* dest = appendUninitializedWithoutOverflowCheckForLChar(requiredLength);
-        if (!dest) {
+        LChar* destination = appendUninitialized8(requiredLength);
+        if (!destination) {
             ASSERT(hasOverflowed());
             return;
         }
-        stringTypeAdapterAccumulator(dest, adapters...);
+        stringTypeAdapterAccumulator(destination, adapters...);
     } else {
-        UChar* dest = appendUninitializedWithoutOverflowCheckForUChar(requiredLength);
-        if (!dest) {
+        UChar* destination = appendUninitialized16(requiredLength);
+        if (!destination) {
             ASSERT(hasOverflowed());
             return;
         }
-        stringTypeAdapterAccumulator(dest, adapters...);
+        stringTypeAdapterAccumulator(destination, adapters...);
     }
 }
 

Modified: trunk/Tools/ChangeLog (248902 => 248903)


--- trunk/Tools/ChangeLog	2019-08-20 16:53:21 UTC (rev 248902)
+++ trunk/Tools/ChangeLog	2019-08-20 17:14:37 UTC (rev 248903)
@@ -1,3 +1,15 @@
+2019-08-20  Darin Adler  <da...@apple.com>
+
+        Variadic StringBuilder::append does not handle upconverting from 8-bit to 16-bit correctly
+        https://bugs.webkit.org/show_bug.cgi?id=200921
+
+        Reviewed by Saam Barati.
+
+        * TestWebKitAPI/Tests/WTF/StringBuilder.cpp:
+        Changed tests to use EXPECT macros instead of ASSERT macros since we don't
+        need to abort after the first failure. Added three new tests to the VariadicAppend
+        test to cover various cases of upconverting from 8-bit to 16-bit strings.
+
 2019-08-20  Dean Jackson  <d...@apple.com>
 
         REGRESSION: Open in New Tab is missing from context menu

Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp (248902 => 248903)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp	2019-08-20 16:53:21 UTC (rev 248902)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp	2019-08-20 17:14:37 UTC (rev 248903)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2011 Google Inc. All rights reserved.
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-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 are
@@ -32,6 +32,8 @@
 #include "config.h"
 #include "WTFStringUtilities.h"
 
+#include <wtf/unicode/CharacterNames.h>
+
 namespace TestWebKitAPI {
 
 static void expectBuilderContent(const String& expected, const StringBuilder& builder)
@@ -85,18 +87,18 @@
     builder2.append("xyz");
     const LChar* characters = builder2.characters8();
     builder2.append("0123456789");
-    ASSERT_EQ(characters, builder2.characters8());
+    EXPECT_EQ(characters, builder2.characters8());
     builder2.toStringPreserveCapacity(); // Test after reifyString with buffer preserved.
     builder2.append("abcd");
-    ASSERT_EQ(characters, builder2.characters8());
+    EXPECT_EQ(characters, builder2.characters8());
 
     // Test appending UChar32 characters to StringBuilder.
     StringBuilder builderForUChar32Append;
     UChar32 frakturAChar = 0x1D504;
     builderForUChar32Append.appendCharacter(frakturAChar); // The fraktur A is not in the BMP, so it's two UTF-16 code units long.
-    ASSERT_EQ(2U, builderForUChar32Append.length());
+    EXPECT_EQ(2U, builderForUChar32Append.length());
     builderForUChar32Append.appendCharacter(static_cast<UChar32>('A'));
-    ASSERT_EQ(3U, builderForUChar32Append.length());
+    EXPECT_EQ(3U, builderForUChar32Append.length());
     const UChar resultArray[] = { U16_LEAD(frakturAChar), U16_TRAIL(frakturAChar), 'A' };
     expectBuilderContent(String(resultArray, WTF_ARRAY_LENGTH(resultArray)), builderForUChar32Append);
     {
@@ -105,12 +107,12 @@
         UChar32 frakturAChar = 0x1D504;
         const UChar data[] = { U16_LEAD(frakturAChar), U16_TRAIL(frakturAChar) };
         builder2.appendCharacters(data, 2);
-        ASSERT_EQ(2U, builder2.length());
+        EXPECT_EQ(2U, builder2.length());
         String result2 = builder2.toString();
-        ASSERT_EQ(2U, result2.length());
+        EXPECT_EQ(2U, result2.length());
         builder.append(builder2);
         builder.appendCharacters(data, 2);
-        ASSERT_EQ(4U, builder.length());
+        EXPECT_EQ(4U, builder.length());
         const UChar resultArray[] = { U16_LEAD(frakturAChar), U16_TRAIL(frakturAChar), U16_LEAD(frakturAChar), U16_TRAIL(frakturAChar) };
         expectBuilderContent(String(resultArray, WTF_ARRAY_LENGTH(resultArray)), builder);
     }
@@ -137,6 +139,37 @@
         builder.append(String("A"), "B", 'C', "");
         expectBuilderContent("0123456789abcdeABC", builder);
     }
+
+    {
+        StringBuilder builder;
+        builder.append(String("0123456789"), "abcd", bullseye, "");
+        expectBuilderContent("0123456789abcd" + String(&bullseye, 1), builder);
+        builder.append(String("A"), "B", 'C', "");
+        expectBuilderContent("0123456789abcd" + String(&bullseye, 1) + "ABC", builder);
+    }
+
+    {
+        // Test where we upconvert the StringBuilder from 8-bit to 16-bit, and don't fit in the existing capacity.
+        StringBuilder builder;
+        builder.append(String("0123456789"), "abcd", 'e', "");
+        expectBuilderContent("0123456789abcde", builder);
+        EXPECT_TRUE(builder.is8Bit());
+        EXPECT_LT(builder.capacity(), builder.length() + 3);
+        builder.append(String("A"), "B", bullseye, "");
+        expectBuilderContent("0123456789abcdeAB" + String(&bullseye, 1), builder);
+    }
+
+    {
+        // Test where we upconvert the StringBuilder from 8-bit to 16-bit, but would have fit in the capacity if the upconvert wasn't necessary.
+        StringBuilder builder;
+        builder.append(String("0123456789"), "abcd", 'e', "");
+        expectBuilderContent("0123456789abcde", builder);
+        builder.reserveCapacity(32);
+        EXPECT_TRUE(builder.is8Bit());
+        EXPECT_GE(builder.capacity(), builder.length() + 3);
+        builder.append(String("A"), "B", bullseye, "");
+        expectBuilderContent("0123456789abcdeAB" + String(&bullseye, 1), builder);
+    }
 }
 
 TEST(StringBuilderTest, ToString)
@@ -144,32 +177,32 @@
     StringBuilder builder;
     builder.append("0123456789");
     String string = builder.toString();
-    ASSERT_EQ(String("0123456789"), string);
-    ASSERT_EQ(string.impl(), builder.toString().impl());
+    EXPECT_EQ(String("0123456789"), string);
+    EXPECT_EQ(string.impl(), builder.toString().impl());
 
     // Changing the StringBuilder should not affect the original result of toString().
     builder.append("abcdefghijklmnopqrstuvwxyz");
-    ASSERT_EQ(String("0123456789"), string);
+    EXPECT_EQ(String("0123456789"), string);
 
     // Changing the StringBuilder should not affect the original result of toString() in case the capacity is not changed.
     builder.reserveCapacity(200);
     string = builder.toString();
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyz"), string);
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyz"), string);
     builder.append("ABC");
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyz"), string);
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyz"), string);
 
     // Changing the original result of toString() should not affect the content of the StringBuilder.
     String string1 = builder.toString();
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), string1);
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), string1);
     string1.append("DEF");
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), builder.toString());
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABCDEF"), string1);
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), builder.toString());
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABCDEF"), string1);
 
     // Resizing the StringBuilder should not affect the original result of toString().
     string1 = builder.toString();
     builder.resize(10);
     builder.append("###");
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), string1);
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), string1);
 }
 
 TEST(StringBuilderTest, ToStringPreserveCapacity)
@@ -178,43 +211,43 @@
     builder.append("0123456789");
     unsigned capacity = builder.capacity();
     String string = builder.toStringPreserveCapacity();
-    ASSERT_EQ(capacity, builder.capacity());
-    ASSERT_EQ(String("0123456789"), string);
-    ASSERT_EQ(string.impl(), builder.toStringPreserveCapacity().impl());
-    ASSERT_EQ(string.characters8(), builder.characters8());
+    EXPECT_EQ(capacity, builder.capacity());
+    EXPECT_EQ(String("0123456789"), string);
+    EXPECT_EQ(string.impl(), builder.toStringPreserveCapacity().impl());
+    EXPECT_EQ(string.characters8(), builder.characters8());
 
     // Changing the StringBuilder should not affect the original result of toStringPreserveCapacity().
     builder.append("abcdefghijklmnopqrstuvwxyz");
-    ASSERT_EQ(String("0123456789"), string);
+    EXPECT_EQ(String("0123456789"), string);
 
     // Changing the StringBuilder should not affect the original result of toStringPreserveCapacity() in case the capacity is not changed.
     builder.reserveCapacity(200);
     capacity = builder.capacity();
     string = builder.toStringPreserveCapacity();
-    ASSERT_EQ(capacity, builder.capacity());
-    ASSERT_EQ(string.characters8(), builder.characters8());
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyz"), string);
+    EXPECT_EQ(capacity, builder.capacity());
+    EXPECT_EQ(string.characters8(), builder.characters8());
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyz"), string);
     builder.append("ABC");
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyz"), string);
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyz"), string);
 
     // Changing the original result of toStringPreserveCapacity() should not affect the content of the StringBuilder.
     capacity = builder.capacity();
     String string1 = builder.toStringPreserveCapacity();
-    ASSERT_EQ(capacity, builder.capacity());
-    ASSERT_EQ(string1.characters8(), builder.characters8());
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), string1);
+    EXPECT_EQ(capacity, builder.capacity());
+    EXPECT_EQ(string1.characters8(), builder.characters8());
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), string1);
     string1.append("DEF");
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), builder.toStringPreserveCapacity());
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABCDEF"), string1);
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), builder.toStringPreserveCapacity());
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABCDEF"), string1);
 
     // Resizing the StringBuilder should not affect the original result of toStringPreserveCapacity().
     capacity = builder.capacity();
     string1 = builder.toStringPreserveCapacity();
-    ASSERT_EQ(capacity, builder.capacity());
-    ASSERT_EQ(string.characters8(), builder.characters8());
+    EXPECT_EQ(capacity, builder.capacity());
+    EXPECT_EQ(string.characters8(), builder.characters8());
     builder.resize(10);
     builder.append("###");
-    ASSERT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), string1);
+    EXPECT_EQ(String("0123456789abcdefghijklmnopqrstuvwxyzABC"), string1);
 }
 
 TEST(StringBuilderTest, Clear)
@@ -259,33 +292,33 @@
 {
     StringBuilder builder1;
     StringBuilder builder2;
-    ASSERT_TRUE(builder1 == builder2);
-    ASSERT_TRUE(equal(builder1, static_cast<LChar*>(0), 0));
-    ASSERT_TRUE(builder1 == String());
-    ASSERT_TRUE(String() == builder1);
-    ASSERT_TRUE(builder1 != String("abc"));
+    EXPECT_TRUE(builder1 == builder2);
+    EXPECT_TRUE(equal(builder1, static_cast<LChar*>(0), 0));
+    EXPECT_TRUE(builder1 == String());
+    EXPECT_TRUE(String() == builder1);
+    EXPECT_TRUE(builder1 != String("abc"));
 
     builder1.append("123");
     builder1.reserveCapacity(32);
     builder2.append("123");
     builder1.reserveCapacity(64);
-    ASSERT_TRUE(builder1 == builder2);
-    ASSERT_TRUE(builder1 == String("123"));
-    ASSERT_TRUE(String("123") == builder1);
+    EXPECT_TRUE(builder1 == builder2);
+    EXPECT_TRUE(builder1 == String("123"));
+    EXPECT_TRUE(String("123") == builder1);
 
     builder2.append("456");
-    ASSERT_TRUE(builder1 != builder2);
-    ASSERT_TRUE(builder2 != builder1);
-    ASSERT_TRUE(String("123") != builder2);
-    ASSERT_TRUE(builder2 != String("123"));
+    EXPECT_TRUE(builder1 != builder2);
+    EXPECT_TRUE(builder2 != builder1);
+    EXPECT_TRUE(String("123") != builder2);
+    EXPECT_TRUE(builder2 != String("123"));
     builder2.toString(); // Test after reifyString().
-    ASSERT_TRUE(builder1 != builder2);
+    EXPECT_TRUE(builder1 != builder2);
 
     builder2.resize(3);
-    ASSERT_TRUE(builder1 == builder2);
+    EXPECT_TRUE(builder1 == builder2);
 
     builder1.toString(); // Test after reifyString().
-    ASSERT_TRUE(builder1 == builder2);
+    EXPECT_TRUE(builder1 == builder2);
 }
 
 TEST(StringBuilderTest, CanShrink)
@@ -292,11 +325,11 @@
 {
     StringBuilder builder;
     builder.reserveCapacity(256);
-    ASSERT_TRUE(builder.canShrink());
+    EXPECT_TRUE(builder.canShrink());
     for (int i = 0; i < 256; i++)
         builder.append('x');
-    ASSERT_EQ(builder.length(), builder.capacity());
-    ASSERT_FALSE(builder.canShrink());
+    EXPECT_EQ(builder.length(), builder.capacity());
+    EXPECT_FALSE(builder.canShrink());
 }
 
 TEST(StringBuilderTest, ToAtomString)
@@ -304,26 +337,26 @@
     StringBuilder builder;
     builder.append("123");
     AtomString atomString = builder.toAtomString();
-    ASSERT_EQ(String("123"), atomString);
+    EXPECT_EQ(String("123"), atomString);
 
     builder.reserveCapacity(256);
-    ASSERT_TRUE(builder.canShrink());
+    EXPECT_TRUE(builder.canShrink());
     for (int i = builder.length(); i < 128; i++)
         builder.append('x');
     AtomString atomString1 = builder.toAtomString();
-    ASSERT_EQ(128u, atomString1.length());
-    ASSERT_EQ('x', atomString1[127]);
+    EXPECT_EQ(128u, atomString1.length());
+    EXPECT_EQ('x', atomString1[127]);
 
     // Later change of builder should not affect the atomic string.
     for (int i = builder.length(); i < 256; i++)
         builder.append('x');
-    ASSERT_EQ(128u, atomString1.length());
+    EXPECT_EQ(128u, atomString1.length());
 
-    ASSERT_FALSE(builder.canShrink());
+    EXPECT_FALSE(builder.canShrink());
     String string = builder.toString();
     AtomString atomString2 = builder.toAtomString();
     // They should share the same StringImpl.
-    ASSERT_EQ(atomString2.impl(), string.impl());
+    EXPECT_EQ(atomString2.impl(), string.impl());
 }
 
 TEST(StringBuilderTest, ToAtomStringOnEmpty)
@@ -331,25 +364,25 @@
     { // Default constructed.
         StringBuilder builder;
         AtomString atomString = builder.toAtomString();
-        ASSERT_EQ(emptyAtom(), atomString);
+        EXPECT_EQ(emptyAtom(), atomString);
     }
     { // With capacity.
         StringBuilder builder;
         builder.reserveCapacity(64);
         AtomString atomString = builder.toAtomString();
-        ASSERT_EQ(emptyAtom(), atomString);
+        EXPECT_EQ(emptyAtom(), atomString);
     }
     { // AtomString constructed from a null string.
         StringBuilder builder;
         builder.append(String());
         AtomString atomString = builder.toAtomString();
-        ASSERT_EQ(emptyAtom(), atomString);
+        EXPECT_EQ(emptyAtom(), atomString);
     }
     { // AtomString constructed from an empty string.
         StringBuilder builder;
         builder.append(emptyString());
         AtomString atomString = builder.toAtomString();
-        ASSERT_EQ(emptyAtom(), atomString);
+        EXPECT_EQ(emptyAtom(), atomString);
     }
     { // AtomString constructed from an empty StringBuilder.
         StringBuilder builder;
@@ -356,13 +389,13 @@
         StringBuilder emptyBuilder;
         builder.append(emptyBuilder);
         AtomString atomString = builder.toAtomString();
-        ASSERT_EQ(emptyAtom(), atomString);
+        EXPECT_EQ(emptyAtom(), atomString);
     }
     { // AtomString constructed from an empty char* string.
         StringBuilder builder;
         builder.appendCharacters("", 0);
         AtomString atomString = builder.toAtomString();
-        ASSERT_EQ(emptyAtom(), atomString);
+        EXPECT_EQ(emptyAtom(), atomString);
     }
     { // Cleared StringBuilder.
         StringBuilder builder;
@@ -369,7 +402,7 @@
         builder.appendLiteral("WebKit");
         builder.clear();
         AtomString atomString = builder.toAtomString();
-        ASSERT_EQ(emptyAtom(), atomString);
+        EXPECT_EQ(emptyAtom(), atomString);
     }
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to