Browse Source

Everywhere: Remove DeprecatedFlyString + any remaining references to it

This reverts commit 7c32d1e8a58fa689e4d661266a7589f01f632e89.
Kenneth Myhra 1 week ago
parent
commit
82a2ae99c8

+ 3 - 8
AK/ByteString.cpp

@@ -6,7 +6,7 @@
 
 #include <AK/ByteBuffer.h>
 #include <AK/ByteString.h>
-#include <AK/DeprecatedFlyString.h>
+#include <AK/FlyString.h>
 #include <AK/Format.h>
 #include <AK/Function.h>
 #include <AK/StdLibExtras.h>
@@ -16,11 +16,6 @@
 
 namespace AK {
 
-bool ByteString::operator==(DeprecatedFlyString const& fly_string) const
-{
-    return m_impl == fly_string.impl() || view() == fly_string.view();
-}
-
 bool ByteString::operator==(ByteString const& other) const
 {
     return m_impl == other.impl() || view() == other.view();
@@ -337,8 +332,8 @@ ByteString escape_html_entities(StringView html)
     return builder.to_byte_string();
 }
 
-ByteString::ByteString(DeprecatedFlyString const& string)
-    : m_impl(string.impl())
+ByteString::ByteString(FlyString const& string)
+    : m_impl(*StringImpl::create(string.bytes()))
 {
 }
 

+ 1 - 3
AK/ByteString.h

@@ -86,7 +86,7 @@ public:
     {
     }
 
-    ByteString(DeprecatedFlyString const&);
+    ByteString(FlyString const&);
 
     static ErrorOr<ByteString> from_utf8(ReadonlyBytes);
     static ErrorOr<ByteString> from_utf8(StringView string) { return from_utf8(string.bytes()); }
@@ -228,8 +228,6 @@ public:
 
     bool operator==(StringView) const;
 
-    bool operator==(DeprecatedFlyString const&) const;
-
     bool operator<(ByteString const&) const;
     bool operator>=(ByteString const& other) const { return !(*this < other); }
     bool operator>=(char const* other) const { return !(*this < other); }

+ 0 - 1
AK/CMakeLists.txt

@@ -5,7 +5,6 @@ set(SOURCES
     ConstrainedStream.cpp
     CountingStream.cpp
     DOSPackedTime.cpp
-    DeprecatedFlyString.cpp
     ByteString.cpp
     Error.cpp
     FloatingPointStringConversions.cpp

+ 0 - 108
AK/DeprecatedFlyString.cpp

@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <andreas@ladybird.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
-
-#include <AK/ByteString.h>
-#include <AK/DeprecatedFlyString.h>
-#include <AK/HashTable.h>
-#include <AK/Optional.h>
-#include <AK/Singleton.h>
-#include <AK/StringUtils.h>
-#include <AK/StringView.h>
-
-namespace AK {
-
-struct DeprecatedFlyStringImplTraits : public Traits<StringImpl const*> {
-    static unsigned hash(StringImpl const* s) { return s->hash(); }
-    static bool equals(StringImpl const* a, StringImpl const* b)
-    {
-        return *a == *b;
-    }
-};
-
-static Singleton<HashTable<StringImpl const*, DeprecatedFlyStringImplTraits>> s_table;
-
-static HashTable<StringImpl const*, DeprecatedFlyStringImplTraits>& fly_impls()
-{
-    return *s_table;
-}
-
-void DeprecatedFlyString::did_destroy_impl(Badge<StringImpl>, StringImpl& impl)
-{
-    fly_impls().remove(&impl);
-}
-
-DeprecatedFlyString::DeprecatedFlyString(ByteString const& string)
-    : m_impl(string.impl())
-{
-    if (string.impl()->is_fly())
-        return;
-
-    auto it = fly_impls().find(string.impl());
-    if (it == fly_impls().end()) {
-        fly_impls().set(string.impl());
-        string.impl()->set_fly({}, true);
-        m_impl = string.impl();
-    } else {
-        VERIFY((*it)->is_fly());
-        m_impl = **it;
-    }
-}
-
-DeprecatedFlyString::DeprecatedFlyString(StringView string)
-    : m_impl(StringImpl::the_empty_stringimpl())
-{
-    if (string.is_null())
-        return;
-    auto it = fly_impls().find(string.hash(), [&](auto& candidate) {
-        return string == *candidate;
-    });
-    if (it == fly_impls().end()) {
-        auto new_string = string.to_byte_string();
-        fly_impls().set(new_string.impl());
-        new_string.impl()->set_fly({}, true);
-        m_impl = new_string.impl();
-    } else {
-        VERIFY((*it)->is_fly());
-        m_impl = **it;
-    }
-}
-
-bool DeprecatedFlyString::equals_ignoring_ascii_case(StringView other) const
-{
-    return StringUtils::equals_ignoring_ascii_case(view(), other);
-}
-
-bool DeprecatedFlyString::starts_with(StringView str, CaseSensitivity case_sensitivity) const
-{
-    return StringUtils::starts_with(view(), str, case_sensitivity);
-}
-
-bool DeprecatedFlyString::ends_with(StringView str, CaseSensitivity case_sensitivity) const
-{
-    return StringUtils::ends_with(view(), str, case_sensitivity);
-}
-
-DeprecatedFlyString DeprecatedFlyString::to_lowercase() const
-{
-    return ByteString(*m_impl).to_lowercase();
-}
-
-bool DeprecatedFlyString::operator==(ByteString const& other) const
-{
-    return m_impl == other.impl() || view() == other.view();
-}
-
-bool DeprecatedFlyString::operator==(StringView string) const
-{
-    return view() == string;
-}
-
-bool DeprecatedFlyString::operator==(char const* string) const
-{
-    return view() == string;
-}
-
-}

+ 0 - 105
AK/DeprecatedFlyString.h

@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <andreas@ladybird.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
-
-#pragma once
-
-#include <AK/ByteString.h>
-#include <AK/StringUtils.h>
-
-namespace AK {
-
-class DeprecatedFlyString {
-public:
-    DeprecatedFlyString()
-        : m_impl(StringImpl::the_empty_stringimpl())
-    {
-    }
-    DeprecatedFlyString(DeprecatedFlyString const& other)
-        : m_impl(other.impl())
-    {
-    }
-    DeprecatedFlyString(DeprecatedFlyString&& other)
-        : m_impl(move(other.m_impl))
-    {
-    }
-    DeprecatedFlyString(ByteString const&);
-    DeprecatedFlyString(StringView);
-    DeprecatedFlyString(char const* string)
-        : DeprecatedFlyString(static_cast<ByteString>(string))
-    {
-    }
-
-    static DeprecatedFlyString from_fly_impl(NonnullRefPtr<StringImpl const> impl)
-    {
-        VERIFY(impl->is_fly());
-        DeprecatedFlyString string;
-        string.m_impl = move(impl);
-        return string;
-    }
-
-    DeprecatedFlyString& operator=(DeprecatedFlyString const& other)
-    {
-        m_impl = other.m_impl;
-        return *this;
-    }
-
-    DeprecatedFlyString& operator=(DeprecatedFlyString&& other)
-    {
-        m_impl = move(other.m_impl);
-        return *this;
-    }
-
-    bool is_empty() const { return !m_impl->length(); }
-
-    bool operator==(DeprecatedFlyString const& other) const { return m_impl == other.m_impl; }
-
-    bool operator==(ByteString const&) const;
-
-    bool operator==(StringView) const;
-
-    bool operator==(char const*) const;
-
-    NonnullRefPtr<StringImpl const> impl() const { return m_impl; }
-    char const* characters() const { return m_impl->characters(); }
-    size_t length() const { return m_impl->length(); }
-
-    ALWAYS_INLINE u32 hash() const { return m_impl->existing_hash(); }
-    ALWAYS_INLINE StringView view() const { return m_impl->view(); }
-
-    DeprecatedFlyString to_lowercase() const;
-
-    template<Arithmetic T>
-    Optional<T> to_number(TrimWhitespace trim_whitespace = TrimWhitespace::Yes) const
-    {
-        return view().to_number<T>(trim_whitespace);
-    }
-
-    bool equals_ignoring_ascii_case(StringView) const;
-    bool starts_with(StringView, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
-    bool ends_with(StringView, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
-
-    static void did_destroy_impl(Badge<StringImpl>, StringImpl&);
-
-    template<typename... Ts>
-    [[nodiscard]] ALWAYS_INLINE constexpr bool is_one_of(Ts&&... strings) const
-    {
-        return (... || this->operator==(forward<Ts>(strings)));
-    }
-
-private:
-    NonnullRefPtr<StringImpl const> m_impl;
-};
-
-template<>
-struct Traits<DeprecatedFlyString> : public DefaultTraits<DeprecatedFlyString> {
-    static unsigned hash(DeprecatedFlyString const& s) { return s.hash(); }
-};
-
-}
-
-#if USING_AK_GLOBALLY
-using AK::DeprecatedFlyString;
-#endif

+ 1 - 1
AK/Error.h

@@ -40,7 +40,7 @@ public:
     }
     static Error from_string_view(StringView string_literal) { return Error(string_literal); }
 
-    template<OneOf<ByteString, DeprecatedFlyString, String, FlyString> T>
+    template<OneOf<ByteString, String, FlyString> T>
     static Error from_string_view(T)
     {
         // `Error::from_string_view(ByteString::formatted(...))` is a somewhat common mistake, which leads to a UAF situation.

+ 0 - 11
AK/FlyString.cpp

@@ -4,7 +4,6 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#include <AK/DeprecatedFlyString.h>
 #include <AK/FlyString.h>
 #include <AK/HashTable.h>
 #include <AK/Singleton.h>
@@ -120,16 +119,6 @@ size_t FlyString::number_of_fly_strings()
     return all_fly_strings().size();
 }
 
-DeprecatedFlyString FlyString::to_deprecated_fly_string() const
-{
-    return DeprecatedFlyString(bytes_as_string_view());
-}
-
-ErrorOr<FlyString> FlyString::from_deprecated_fly_string(DeprecatedFlyString const& deprecated_fly_string)
-{
-    return FlyString::from_utf8(deprecated_fly_string.view());
-}
-
 unsigned Traits<FlyString>::hash(FlyString const& fly_string)
 {
     return fly_string.hash();

+ 1 - 4
AK/FlyString.h

@@ -26,7 +26,7 @@ public:
     static ErrorOr<FlyString> from_utf8(StringView);
     static FlyString from_utf8_without_validation(ReadonlyBytes);
     template<typename T>
-    requires(IsOneOf<RemoveCVReference<T>, ByteString, DeprecatedFlyString, FlyString, String>)
+    requires(IsOneOf<RemoveCVReference<T>, ByteString, FlyString, String>)
     static ErrorOr<String> from_utf8(T&&) = delete;
 
     FlyString(String const&);
@@ -55,9 +55,6 @@ public:
     // This is primarily interesting to unit tests.
     [[nodiscard]] static size_t number_of_fly_strings();
 
-    // FIXME: Remove these once all code has been ported to FlyString
-    [[nodiscard]] DeprecatedFlyString to_deprecated_fly_string() const;
-    static ErrorOr<FlyString> from_deprecated_fly_string(DeprecatedFlyString const&);
     template<typename T>
     requires(IsSame<RemoveCVReference<T>, StringView>)
     static ErrorOr<String> from_deprecated_fly_string(T&&) = delete;

+ 0 - 3
AK/Format.h

@@ -496,9 +496,6 @@ struct Formatter<unsigned char[Size]> : Formatter<StringView> {
 template<>
 struct Formatter<ByteString> : Formatter<StringView> {
 };
-template<>
-struct Formatter<DeprecatedFlyString> : Formatter<StringView> {
-};
 
 template<typename T>
 struct Formatter<T*> : StandardFormatter {

+ 0 - 2
AK/Forward.h

@@ -29,7 +29,6 @@ using ByteBuffer = Detail::ByteBuffer<32>;
 class CircularBuffer;
 class ConstrainedStream;
 class CountingStream;
-class DeprecatedFlyString;
 class ByteString;
 class Duration;
 class Error;
@@ -161,7 +160,6 @@ using AK::CircularBuffer;
 using AK::CircularQueue;
 using AK::ConstrainedStream;
 using AK::CountingStream;
-using AK::DeprecatedFlyString;
 using AK::DoublyLinkedList;
 using AK::Error;
 using AK::ErrorOr;

+ 1 - 1
AK/String.h

@@ -60,7 +60,7 @@ public:
     [[nodiscard]] static String from_utf8_with_replacement_character(StringView, WithBOMHandling = WithBOMHandling::Yes);
 
     template<typename T>
-    requires(IsOneOf<RemoveCVReference<T>, ByteString, DeprecatedFlyString, FlyString, String>)
+    requires(IsOneOf<RemoveCVReference<T>, ByteString, FlyString, String>)
     static ErrorOr<String> from_utf8(T&&) = delete;
 
     [[nodiscard]] static String from_utf8_without_validation(ReadonlyBytes);

+ 1 - 6
AK/StringImpl.cpp

@@ -5,7 +5,6 @@
  */
 
 #include <AK/CharacterTypes.h>
-#include <AK/DeprecatedFlyString.h>
 #include <AK/StringHash.h>
 #include <AK/StringImpl.h>
 #include <AK/kmalloc.h>
@@ -28,11 +27,7 @@ StringImpl::StringImpl(ConstructWithInlineBufferTag, size_t length)
 {
 }
 
-StringImpl::~StringImpl()
-{
-    if (m_fly)
-        DeprecatedFlyString::did_destroy_impl({}, *this);
-}
+StringImpl::~StringImpl() = default;
 
 NonnullRefPtr<StringImpl const> StringImpl::create_uninitialized(size_t length, char*& buffer)
 {

+ 0 - 3
AK/StringImpl.h

@@ -77,9 +77,6 @@ public:
 
     unsigned case_insensitive_hash() const;
 
-    bool is_fly() const { return m_fly; }
-    void set_fly(Badge<DeprecatedFlyString>, bool fly) const { m_fly = fly; }
-
 private:
     enum ConstructTheEmptyStringImplTag {
         ConstructTheEmptyStringImpl

+ 0 - 7
AK/StringView.cpp

@@ -7,7 +7,6 @@
 #include <AK/AnyOf.h>
 #include <AK/ByteBuffer.h>
 #include <AK/ByteString.h>
-#include <AK/DeprecatedFlyString.h>
 #include <AK/Find.h>
 #include <AK/FlyString.h>
 #include <AK/Function.h>
@@ -36,12 +35,6 @@ StringView::StringView(ByteString const& string)
 {
 }
 
-StringView::StringView(DeprecatedFlyString const& string)
-    : m_characters(string.characters())
-    , m_length(string.length())
-{
-}
-
 StringView::StringView(ByteBuffer const& buffer)
     : m_characters((char const*)buffer.data())
     , m_length(buffer.size())

+ 1 - 3
AK/StringView.h

@@ -51,15 +51,13 @@ public:
     StringView(String const&);
     StringView(FlyString const&);
     StringView(ByteString const&);
-    StringView(DeprecatedFlyString const&);
 
     explicit StringView(ByteBuffer&&) = delete;
     explicit StringView(String&&) = delete;
     explicit StringView(FlyString&&) = delete;
     explicit StringView(ByteString&&) = delete;
-    explicit StringView(DeprecatedFlyString&&) = delete;
 
-    template<OneOf<String, FlyString, ByteString, DeprecatedFlyString, ByteBuffer> StringType>
+    template<OneOf<String, FlyString, ByteString, ByteBuffer> StringType>
     StringView& operator=(StringType&&) = delete;
 
     [[nodiscard]] constexpr bool is_null() const

+ 1 - 1
Libraries/LibJS/Runtime/VM.cpp

@@ -659,7 +659,7 @@ void VM::load_imported_module(ImportedModuleReferrer referrer, ModuleRequest con
         });
 
     LexicalPath base_path { base_filename };
-    auto filename = LexicalPath::absolute_path(base_path.dirname(), module_request.module_specifier.to_deprecated_fly_string());
+    auto filename = LexicalPath::absolute_path(base_path.dirname(), module_request.module_specifier);
 
     dbgln_if(JS_MODULE_DEBUG, "[JS MODULE] base path: '{}'", base_path);
     dbgln_if(JS_MODULE_DEBUG, "[JS MODULE] initial filename: '{}'", filename);

+ 1 - 1
Libraries/LibWeb/DOM/Document.cpp

@@ -2100,7 +2100,7 @@ WebIDL::ExceptionOr<GC::Ref<Element>> Document::create_element(String const& a_l
         namespace_ = Namespace::HTML;
 
     // 6. Return the result of creating an element given this, localName, namespace, null, is, and with the synchronous custom elements flag set.
-    return TRY(DOM::create_element(*this, MUST(FlyString::from_deprecated_fly_string(local_name)), move(namespace_), {}, move(is_value), true));
+    return TRY(DOM::create_element(*this, FlyString::from_utf8_without_validation(local_name.bytes()), move(namespace_), {}, move(is_value), true));
 }
 
 // https://dom.spec.whatwg.org/#dom-document-createelementns

+ 1 - 1
Libraries/LibWeb/DOM/Node.cpp

@@ -2206,7 +2206,7 @@ GC::Ref<Node> Node::get_root_node(GetRootNodeOptions const& options)
 String Node::debug_description() const
 {
     StringBuilder builder;
-    builder.append(node_name().to_deprecated_fly_string().to_lowercase());
+    builder.append(node_name().to_ascii_lowercase());
     if (is_element()) {
         auto const& element = static_cast<DOM::Element const&>(*this);
         if (element.id().has_value())

+ 0 - 2
Meta/gn/secondary/AK/BUILD.gn

@@ -61,8 +61,6 @@ shared_library("AK") {
     "DateConstants.h",
     "DefaultDelete.h",
     "Demangle.h",
-    "DeprecatedFlyString.cpp",
-    "DeprecatedFlyString.h",
     "Diagnostics.h",
     "DisjointChunks.h",
     "DistinctNumeric.h",

+ 0 - 21
Tests/AK/TestByteString.cpp

@@ -7,7 +7,6 @@
 #include <LibTest/TestCase.h>
 
 #include <AK/ByteString.h>
-#include <AK/DeprecatedFlyString.h>
 #include <AK/StringBuilder.h>
 #include <AK/Vector.h>
 #include <cstring>
@@ -139,26 +138,6 @@ TEST_CASE(to_uppercase)
     EXPECT(ByteString("AbC").to_uppercase() == "ABC");
 }
 
-TEST_CASE(flystring)
-{
-    {
-        DeprecatedFlyString a("foo");
-        DeprecatedFlyString b("foo");
-        EXPECT_EQ(a.impl(), b.impl());
-    }
-
-    {
-        ByteString a = "foo";
-        DeprecatedFlyString b = a;
-        StringBuilder builder;
-        builder.append('f');
-        builder.append("oo"sv);
-        DeprecatedFlyString c = builder.to_byte_string();
-        EXPECT_EQ(a.impl(), b.impl());
-        EXPECT_EQ(a.impl(), c.impl());
-    }
-}
-
 TEST_CASE(replace)
 {
     ByteString test_string = "Well, hello Friends!";

+ 0 - 4
Tests/AK/TestStringUtils.cpp

@@ -23,11 +23,7 @@ TEST_CASE(hash_compatible)
     static_assert(AK::Concepts::HashCompatible<FlyString, StringView>);
 
     static_assert(AK::Concepts::HashCompatible<ByteString, StringView>);
-    static_assert(AK::Concepts::HashCompatible<ByteString, DeprecatedFlyString>);
     static_assert(AK::Concepts::HashCompatible<StringView, ByteString>);
-    static_assert(AK::Concepts::HashCompatible<StringView, DeprecatedFlyString>);
-    static_assert(AK::Concepts::HashCompatible<DeprecatedFlyString, ByteString>);
-    static_assert(AK::Concepts::HashCompatible<DeprecatedFlyString, StringView>);
 
     static_assert(AK::Concepts::HashCompatible<StringView, ByteBuffer>);
     static_assert(AK::Concepts::HashCompatible<ByteBuffer, StringView>);

+ 1 - 1
Utilities/js.cpp

@@ -795,7 +795,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
 
                 for (auto const& name : global_environment.declarative_record().bindings()) {
                     if (name.bytes_as_string_view().starts_with(variable_name)) {
-                        results.empend(name.to_deprecated_fly_string());
+                        results.empend(name);
                         results.last().invariant_offset = variable_name.bytes().size();
                     }
                 }