Explorar o código

AK+Userland: Introduce ByteString::create_and_overwrite

And replace two users of raw StringImpl with it.
Dan Klishch hai 1 ano
pai
achega
061f902f95
Modificáronse 3 ficheiros con 28 adicións e 12 borrados
  1. 17 0
      AK/ByteString.h
  2. 7 5
      Userland/Libraries/LibC/netdb.cpp
  3. 4 7
      Userland/Libraries/LibIPC/Decoder.cpp

+ 17 - 0
AK/ByteString.h

@@ -93,6 +93,23 @@ public:
     static ByteString must_from_utf8(StringView string) { return MUST(from_utf8(string)); }
     static ByteString from_utf8_without_validation(StringView string) { return ByteString { string }; }
 
+    template<
+        typename F,
+        typename PossiblyErrorOr = decltype(declval<F>()(declval<Bytes>())),
+        bool is_error_or = IsSpecializationOf<PossiblyErrorOr, ErrorOr>,
+        typename ReturnType = Conditional<is_error_or, ErrorOr<ByteString>, ByteString>>
+    static ReturnType create_and_overwrite(size_t length, F&& fill_function)
+    {
+        char* buffer;
+        auto impl = StringImpl::create_uninitialized(length, buffer);
+
+        if constexpr (is_error_or)
+            TRY(fill_function(Bytes { buffer, length }));
+        else
+            fill_function(Bytes { buffer, length });
+        return impl;
+    }
+
     [[nodiscard]] static ByteString repeated(char, size_t count);
     [[nodiscard]] static ByteString repeated(StringView, size_t count);
 

+ 7 - 5
Userland/Libraries/LibC/netdb.cpp

@@ -394,10 +394,13 @@ hostent* gethostbyaddr(void const* addr, socklen_t addr_size, int type)
         return nullptr;
     }
 
-    char* buffer;
-    auto string_impl = StringImpl::create_uninitialized(response_header.name_length, buffer);
+    ssize_t nreceived;
 
-    if (auto nreceived = read(fd, buffer, response_header.name_length); nreceived < 0) {
+    gethostbyaddr_name_buffer = ByteString::create_and_overwrite(response_header.name_length, [&](Bytes bytes) {
+        nreceived = read(fd, bytes.data(), bytes.size());
+    });
+
+    if (nreceived < 0) {
         h_errno = TRY_AGAIN;
         return nullptr;
     } else if (static_cast<u32>(nreceived) != response_header.name_length) {
@@ -405,8 +408,7 @@ hostent* gethostbyaddr(void const* addr, socklen_t addr_size, int type)
         return nullptr;
     }
 
-    gethostbyaddr_name_buffer = move(string_impl);
-    __gethostbyaddr_buffer.h_name = buffer;
+    __gethostbyaddr_buffer.h_name = const_cast<char*>(gethostbyaddr_name_buffer.characters());
     __gethostbyaddr_alias_list_buffer[0] = nullptr;
     __gethostbyaddr_buffer.h_aliases = __gethostbyaddr_alias_list_buffer;
     __gethostbyaddr_buffer.h_addrtype = AF_INET;

+ 4 - 7
Userland/Libraries/LibIPC/Decoder.cpp

@@ -39,13 +39,10 @@ ErrorOr<ByteString> decode(Decoder& decoder)
     if (length == 0)
         return ByteString::empty();
 
-    char* text_buffer = nullptr;
-    auto text_impl = StringImpl::create_uninitialized(length, text_buffer);
-
-    Bytes bytes { text_buffer, length };
-    TRY(decoder.decode_into(bytes));
-
-    return ByteString { *text_impl };
+    return ByteString::create_and_overwrite(length, [&](Bytes bytes) -> ErrorOr<void> {
+        TRY(decoder.decode_into(bytes));
+        return {};
+    });
 }
 
 template<>