Everywhere: Slap some [[clang::lifetimebound]] where appropriate

This first pass only applies to the following two cases:
- Public functions returning a view type into an object they own
- Public ctors storing a view type

This catches a grand total of one (1) issue, which is fixed in
the previous commit.
This commit is contained in:
Ali Mohammad Pur 2025-08-30 08:18:47 +02:00 committed by Jelle Raaijmakers
commit 4462348916
Notes: github-actions[bot] 2025-09-01 09:12:52 +00:00
45 changed files with 92 additions and 83 deletions

View file

@ -147,14 +147,14 @@ public:
# pragma GCC diagnostic pop # pragma GCC diagnostic pop
#endif #endif
[[nodiscard]] Bytes bytes() [[nodiscard]] Bytes bytes() LIFETIME_BOUND
{ {
return { data(), size() }; return { data(), size() };
} }
[[nodiscard]] ReadonlyBytes bytes() const { return { data(), size() }; } [[nodiscard]] ReadonlyBytes bytes() const LIFETIME_BOUND { return { data(), size() }; }
[[nodiscard]] AK::Bytes span() { return { data(), size() }; } [[nodiscard]] AK::Bytes span() LIFETIME_BOUND { return { data(), size() }; }
[[nodiscard]] AK::ReadonlyBytes span() const { return { data(), size() }; } [[nodiscard]] AK::ReadonlyBytes span() const LIFETIME_BOUND { return { data(), size() }; }
[[nodiscard]] u8* offset_pointer(size_t offset) { return data() + offset; } [[nodiscard]] u8* offset_pointer(size_t offset) { return data() + offset; }
[[nodiscard]] u8 const* offset_pointer(size_t offset) const { return data() + offset; } [[nodiscard]] u8 const* offset_pointer(size_t offset) const { return data() + offset; }
@ -243,7 +243,7 @@ public:
} }
/// Like get_bytes_for_writing, but crashes if allocation fails. /// Like get_bytes_for_writing, but crashes if allocation fails.
Bytes must_get_bytes_for_writing(size_t length) Bytes must_get_bytes_for_writing(size_t length) LIFETIME_BOUND
{ {
return MUST(get_bytes_for_writing(length)); return MUST(get_bytes_for_writing(length));
} }
@ -306,8 +306,8 @@ public:
__builtin_memset(data(), 0, m_size); __builtin_memset(data(), 0, m_size);
} }
operator Bytes() { return bytes(); } operator Bytes() LIFETIME_BOUND { return bytes(); }
operator ReadonlyBytes() const { return bytes(); } operator ReadonlyBytes() const LIFETIME_BOUND { return bytes(); }
ALWAYS_INLINE size_t capacity() const { return m_inline ? inline_capacity : m_outline_capacity; } ALWAYS_INLINE size_t capacity() const { return m_inline ? inline_capacity : m_outline_capacity; }
ALWAYS_INLINE bool is_inline() const { return m_inline; } ALWAYS_INLINE bool is_inline() const { return m_inline; }

View file

@ -175,7 +175,7 @@ public:
using SearchDirection = StringUtils::SearchDirection; using SearchDirection = StringUtils::SearchDirection;
[[nodiscard]] Optional<size_t> find_any_of(StringView needles, SearchDirection direction = SearchDirection::Forward) const { return StringUtils::find_any_of(*this, needles, direction); } [[nodiscard]] Optional<size_t> find_any_of(StringView needles, SearchDirection direction = SearchDirection::Forward) const { return StringUtils::find_any_of(*this, needles, direction); }
[[nodiscard]] StringView find_last_split_view(char separator) const& { return view().find_last_split_view(separator); } [[nodiscard]] StringView find_last_split_view(char separator) const& LIFETIME_BOUND { return view().find_last_split_view(separator); }
[[nodiscard]] StringView find_last_split_view(char separator) const&& = delete; [[nodiscard]] StringView find_last_split_view(char separator) const&& = delete;
[[nodiscard]] ByteString substring(size_t start, size_t length) const; [[nodiscard]] ByteString substring(size_t start, size_t length) const;
@ -194,7 +194,7 @@ public:
[[nodiscard]] bool copy_characters_to_buffer(char* buffer, size_t buffer_size) const; [[nodiscard]] bool copy_characters_to_buffer(char* buffer, size_t buffer_size) const;
[[nodiscard]] ALWAYS_INLINE ReadonlyBytes bytes() const& { return m_impl->bytes(); } [[nodiscard]] ALWAYS_INLINE ReadonlyBytes bytes() const& LIFETIME_BOUND { return m_impl->bytes(); }
[[nodiscard]] ALWAYS_INLINE ReadonlyBytes bytes() const&& = delete; [[nodiscard]] ALWAYS_INLINE ReadonlyBytes bytes() const&& = delete;
[[nodiscard]] ALWAYS_INLINE char const& operator[](size_t i) const [[nodiscard]] ALWAYS_INLINE char const& operator[](size_t i) const
@ -283,7 +283,7 @@ public:
return vformatted(fmtstr.view(), variadic_format_parameters); return vformatted(fmtstr.view(), variadic_format_parameters);
} }
[[nodiscard]] StringView view() const& { return { characters(), length() }; } [[nodiscard]] StringView view() const& LIFETIME_BOUND { return { characters(), length() }; }
[[nodiscard]] StringView view() const&& = delete; [[nodiscard]] StringView view() const&& = delete;
[[nodiscard]] ByteString replace(StringView needle, StringView replacement, ReplaceMode replace_mode = ReplaceMode::All) const { return StringUtils::replace(*this, needle, replacement, replace_mode); } [[nodiscard]] ByteString replace(StringView needle, StringView replacement, ReplaceMode replace_mode = ReplaceMode::All) const { return StringUtils::replace(*this, needle, replacement, replace_mode); }

View file

@ -42,8 +42,8 @@ public:
// Includes NUL-terminator. // Includes NUL-terminator.
char const* characters() const { return &m_inline_buffer[0]; } char const* characters() const { return &m_inline_buffer[0]; }
ALWAYS_INLINE ReadonlyBytes bytes() const { return { characters(), length() }; } ALWAYS_INLINE ReadonlyBytes bytes() const LIFETIME_BOUND { return { characters(), length() }; }
ALWAYS_INLINE StringView view() const { return { characters(), length() }; } ALWAYS_INLINE StringView view() const LIFETIME_BOUND { return { characters(), length() }; }
char const& operator[](size_t i) const char const& operator[](size_t i) const
{ {

View file

@ -40,8 +40,8 @@ public:
String to_string() const; String to_string() const;
[[nodiscard]] Utf8View code_points() const; [[nodiscard]] Utf8View code_points() const;
[[nodiscard]] ReadonlyBytes bytes() const { return m_data.bytes(); } [[nodiscard]] ReadonlyBytes bytes() const LIFETIME_BOUND { return m_data.bytes(); }
[[nodiscard]] StringView bytes_as_string_view() const { return m_data.bytes(); } [[nodiscard]] StringView bytes_as_string_view() const LIFETIME_BOUND { return m_data.bytes(); }
[[nodiscard]] ALWAYS_INLINE bool operator==(FlyString const& other) const { return m_data.raw(Badge<FlyString> {}) == other.m_data.raw(Badge<FlyString> {}); } [[nodiscard]] ALWAYS_INLINE bool operator==(FlyString const& other) const { return m_data.raw(Badge<FlyString> {}) == other.m_data.raw(Badge<FlyString> {}); }
[[nodiscard]] bool operator==(String const& other) const { return m_data == other; } [[nodiscard]] bool operator==(String const& other) const { return m_data == other; }

View file

@ -100,7 +100,7 @@ public:
clear(false); clear(false);
} }
[[nodiscard]] ReadonlyBytes raw_capture_range() const [[nodiscard]] ReadonlyBytes raw_capture_range() const LIFETIME_BOUND
{ {
if (!m_size) if (!m_size)
return {}; return {};

View file

@ -32,10 +32,10 @@ public:
ByteString const& string() const { return m_string; } ByteString const& string() const { return m_string; }
StringView dirname() const { return m_dirname; } StringView dirname() const LIFETIME_BOUND { return m_dirname; }
StringView basename(StripExtension s = StripExtension::No) const { return s == StripExtension::No ? m_basename : m_title; } StringView basename(StripExtension s = StripExtension::No) const LIFETIME_BOUND { return s == StripExtension::No ? m_basename : m_title; }
StringView title() const { return m_title; } StringView title() const LIFETIME_BOUND { return m_title; }
StringView extension() const { return m_extension; } StringView extension() const LIFETIME_BOUND { return m_extension; }
Vector<StringView> const& parts_view() const { return m_parts; } Vector<StringView> const& parts_view() const { return m_parts; }
[[nodiscard]] Vector<ByteString> parts() const; [[nodiscard]] Vector<ByteString> parts() const;

View file

@ -256,6 +256,15 @@
# define AK_COMPACT_EMPTY_BASES # define AK_COMPACT_EMPTY_BASES
#endif #endif
#if defined(LIFETIME_BOUND)
# undef LIFETIME_BOUND
#endif
#if defined(AK_COMPILER_CLANG)
# define LIFETIME_BOUND [[clang::lifetimebound]]
#else
# define LIFETIME_BOUND
#endif
// GCC doesn't have __has_feature but clang does // GCC doesn't have __has_feature but clang does
#ifndef __has_feature #ifndef __has_feature
# define __has_feature(...) 0 # define __has_feature(...) 0

View file

@ -68,7 +68,7 @@ public:
[[nodiscard]] MappingType clone_mapping() const { return MUST(m_mapping.clone()); } [[nodiscard]] MappingType clone_mapping() const { return MUST(m_mapping.clone()); }
StringView as_string_view() const { return m_builder.string_view(); } StringView as_string_view() const LIFETIME_BOUND { return m_builder.string_view(); }
void append(StringView pattern) void append(StringView pattern)
{ {

View file

@ -144,7 +144,7 @@ public:
[[nodiscard]] bool is_empty() const { return byte_count() == 0; } [[nodiscard]] bool is_empty() const { return byte_count() == 0; }
// Returns a StringView covering the full length of the string. Note that iterating this will go byte-at-a-time, not code-point-at-a-time. // Returns a StringView covering the full length of the string. Note that iterating this will go byte-at-a-time, not code-point-at-a-time.
[[nodiscard]] StringView bytes_as_string_view() const& { return StringView(bytes()); } [[nodiscard]] StringView bytes_as_string_view() const& LIFETIME_BOUND { return StringView(bytes()); }
[[nodiscard]] StringView bytes_as_string_view() const&& = delete; [[nodiscard]] StringView bytes_as_string_view() const&& = delete;
[[nodiscard]] size_t count(StringView needle) const { return StringUtils::count(bytes_as_string_view(), needle); } [[nodiscard]] size_t count(StringView needle) const { return StringUtils::count(bytes_as_string_view(), needle); }

View file

@ -17,7 +17,7 @@ struct ShortString {
static constexpr ShortString create_empty(); static constexpr ShortString create_empty();
static constexpr ShortString create_with_byte_count(size_t byte_count); static constexpr ShortString create_with_byte_count(size_t byte_count);
ReadonlyBytes bytes() const; ReadonlyBytes bytes() const LIFETIME_BOUND;
size_t byte_count() const; size_t byte_count() const;
// NOTE: This is the byte count shifted left 1 step and or'ed with a 1 (the SHORT_STRING_FLAG) // NOTE: This is the byte count shifted left 1 step and or'ed with a 1 (the SHORT_STRING_FLAG)
@ -71,7 +71,7 @@ public:
// Returns the underlying UTF-8 encoded bytes. // Returns the underlying UTF-8 encoded bytes.
// NOTE: There is no guarantee about null-termination. // NOTE: There is no guarantee about null-termination.
[[nodiscard]] ReadonlyBytes bytes() const; [[nodiscard]] ReadonlyBytes bytes() const LIFETIME_BOUND;
[[nodiscard]] u32 hash() const; [[nodiscard]] u32 hash() const;
[[nodiscard]] size_t byte_count() const; [[nodiscard]] size_t byte_count() const;
[[nodiscard]] ALWAYS_INLINE size_t length_in_code_units() const { return byte_count(); } [[nodiscard]] ALWAYS_INLINE size_t length_in_code_units() const { return byte_count(); }

View file

@ -83,7 +83,7 @@ public:
} }
// NOTE: There is no guarantee about null-termination. // NOTE: There is no guarantee about null-termination.
ReadonlyBytes bytes() const ReadonlyBytes bytes() const LIFETIME_BOUND
{ {
if (m_substring) { if (m_substring) {
auto const& data = substring_data(); auto const& data = substring_data();
@ -92,7 +92,7 @@ public:
return { &m_bytes_or_substring_data[0], m_byte_count }; return { &m_bytes_or_substring_data[0], m_byte_count };
} }
StringView bytes_as_string_view() const { return { bytes() }; } StringView bytes_as_string_view() const LIFETIME_BOUND { return { bytes() }; }
bool operator==(StringData const& other) const bool operator==(StringData const& other) const
{ {

View file

@ -45,10 +45,10 @@ public:
{ {
} }
StringView(ByteBuffer const&); StringView(LIFETIME_BOUND ByteBuffer const&);
StringView(String const&); StringView(LIFETIME_BOUND String const&);
StringView(FlyString const&); StringView(LIFETIME_BOUND FlyString const&);
StringView(ByteString const&); StringView(LIFETIME_BOUND ByteString const&);
explicit StringView(ByteBuffer&&) = delete; explicit StringView(ByteBuffer&&) = delete;
explicit StringView(String&&) = delete; explicit StringView(String&&) = delete;

View file

@ -181,12 +181,12 @@ public:
} }
} }
Bytes bytes() Bytes bytes() LIFETIME_BOUND
{ {
return Bytes(reinterpret_cast<u8*>(this), sizeof(Storage)); return Bytes(reinterpret_cast<u8*>(this), sizeof(Storage));
} }
ReadonlyBytes bytes() const ReadonlyBytes bytes() const LIFETIME_BOUND
{ {
return ReadonlyBytes(reinterpret_cast<u8 const*>(this), sizeof(Storage)); return ReadonlyBytes(reinterpret_cast<u8 const*>(this), sizeof(Storage));
} }

View file

@ -34,11 +34,11 @@ public:
Utf16FlyString(Utf16String const&); Utf16FlyString(Utf16String const&);
[[nodiscard]] ALWAYS_INLINE Utf16View view() const { return m_data.utf16_view(); } [[nodiscard]] ALWAYS_INLINE Utf16View view() const LIFETIME_BOUND { return m_data.utf16_view(); }
ALWAYS_INLINE explicit operator Utf16String() const { return to_utf16_string(); } ALWAYS_INLINE explicit operator Utf16String() const { return to_utf16_string(); }
ALWAYS_INLINE operator Utf16View() const& { return view(); } ALWAYS_INLINE operator Utf16View() const& LIFETIME_BOUND { return view(); }
explicit operator Utf16View() const&& = delete; explicit operator Utf16View() const&& = delete;
ALWAYS_INLINE Utf16String to_utf16_string() const ALWAYS_INLINE Utf16String to_utf16_string() const

View file

@ -53,7 +53,7 @@ public:
destroy_string(); destroy_string();
} }
ALWAYS_INLINE operator Utf16View() const& { return utf16_view(); } ALWAYS_INLINE operator Utf16View() const& LIFETIME_BOUND { return utf16_view(); }
explicit operator Utf16View() const&& = delete; explicit operator Utf16View() const&& = delete;
[[nodiscard]] ALWAYS_INLINE String to_utf8(AllowLonelySurrogates allow_lonely_surrogates = AllowLonelySurrogates::Yes) const [[nodiscard]] ALWAYS_INLINE String to_utf8(AllowLonelySurrogates allow_lonely_surrogates = AllowLonelySurrogates::Yes) const
@ -71,7 +71,7 @@ public:
return MUST(utf16_view().to_byte_string(allow_lonely_surrogates)); return MUST(utf16_view().to_byte_string(allow_lonely_surrogates));
} }
[[nodiscard]] ALWAYS_INLINE StringView ascii_view() const& [[nodiscard]] ALWAYS_INLINE StringView ascii_view() const& LIFETIME_BOUND
{ {
if (has_short_ascii_storage()) if (has_short_ascii_storage())
return short_ascii_string_without_union_member_assertion().bytes(); return short_ascii_string_without_union_member_assertion().bytes();
@ -81,7 +81,7 @@ public:
return {}; return {};
} }
[[nodiscard]] ALWAYS_INLINE Utf16View utf16_view() const& [[nodiscard]] ALWAYS_INLINE Utf16View utf16_view() const& LIFETIME_BOUND
{ {
if (has_short_ascii_storage()) if (has_short_ascii_storage())
return Utf16View { ascii_view().characters_without_null_termination(), length_in_code_units() }; return Utf16View { ascii_view().characters_without_null_termination(), length_in_code_units() };
@ -223,12 +223,12 @@ public:
[[nodiscard]] ALWAYS_INLINE Utf16CodePointIterator begin() const { return utf16_view().begin(); } [[nodiscard]] ALWAYS_INLINE Utf16CodePointIterator begin() const { return utf16_view().begin(); }
[[nodiscard]] ALWAYS_INLINE Utf16CodePointIterator end() const { return utf16_view().end(); } [[nodiscard]] ALWAYS_INLINE Utf16CodePointIterator end() const { return utf16_view().end(); }
[[nodiscard]] ALWAYS_INLINE Utf16View substring_view(size_t code_unit_offset, size_t code_unit_length) const [[nodiscard]] ALWAYS_INLINE Utf16View substring_view(size_t code_unit_offset, size_t code_unit_length) const LIFETIME_BOUND
{ {
return utf16_view().substring_view(code_unit_offset, code_unit_length); return utf16_view().substring_view(code_unit_offset, code_unit_length);
} }
[[nodiscard]] ALWAYS_INLINE Utf16View substring_view(size_t code_unit_offset) const [[nodiscard]] ALWAYS_INLINE Utf16View substring_view(size_t code_unit_offset) const LIFETIME_BOUND
{ {
return utf16_view().substring_view(code_unit_offset); return utf16_view().substring_view(code_unit_offset);
} }

View file

@ -96,13 +96,13 @@ public:
return m_length_in_code_points; return m_length_in_code_points;
} }
[[nodiscard]] ALWAYS_INLINE StringView ascii_view() const [[nodiscard]] ALWAYS_INLINE StringView ascii_view() const LIFETIME_BOUND
{ {
ASSERT(has_ascii_storage()); ASSERT(has_ascii_storage());
return { m_ascii_data, length_in_code_units() }; return { m_ascii_data, length_in_code_units() };
} }
[[nodiscard]] ALWAYS_INLINE Utf16View utf16_view() const [[nodiscard]] ALWAYS_INLINE Utf16View utf16_view() const LIFETIME_BOUND
{ {
if (has_ascii_storage()) if (has_ascii_storage())
return { m_ascii_data, length_in_code_units() }; return { m_ascii_data, length_in_code_units() };

View file

@ -30,7 +30,7 @@ public:
// Non-stream APIs for using MappedFile as a simple POSIX API wrapper. // Non-stream APIs for using MappedFile as a simple POSIX API wrapper.
void* data() { return m_data; } void* data() { return m_data; }
void const* data() const { return m_data; } void const* data() const { return m_data; }
ReadonlyBytes bytes() const { return { m_data, m_size }; } ReadonlyBytes bytes() const LIFETIME_BOUND { return { m_data, m_size }; }
private: private:
explicit MappedFile(void*, size_t, Mode); explicit MappedFile(void*, size_t, Mode);

View file

@ -317,7 +317,7 @@ public:
m_buffer_stack.empend(); m_buffer_stack.empend();
} }
ReadonlyBytes active_bytes() const { return m_buffer_stack.last().bytes(); } ReadonlyBytes active_bytes() const LIFETIME_BOUND { return m_buffer_stack.last().bytes(); }
ByteBuffer finish() ByteBuffer finish()
{ {
VERIFY(m_buffer_stack.size() == 1); VERIFY(m_buffer_stack.size() == 1);

View file

@ -22,7 +22,7 @@ struct Digest {
[[nodiscard]] ALWAYS_INLINE u8 const* immutable_data() const { return data; } [[nodiscard]] ALWAYS_INLINE u8 const* immutable_data() const { return data; }
[[nodiscard]] ALWAYS_INLINE size_t data_length() const { return Size; } [[nodiscard]] ALWAYS_INLINE size_t data_length() const { return Size; }
[[nodiscard]] ALWAYS_INLINE ReadonlyBytes bytes() const { return { immutable_data(), data_length() }; } [[nodiscard]] ALWAYS_INLINE ReadonlyBytes bytes() const LIFETIME_BOUND { return { immutable_data(), data_length() }; }
[[nodiscard]] bool operator==(Digest const& other) const = default; [[nodiscard]] bool operator==(Digest const& other) const = default;
[[nodiscard]] bool operator!=(Digest const& other) const = default; [[nodiscard]] bool operator!=(Digest const& other) const = default;

View file

@ -75,7 +75,7 @@ struct MultiHashDigestVariant {
[&](auto const& value) { return value.data_length(); }); [&](auto const& value) { return value.data_length(); });
} }
[[nodiscard]] ReadonlyBytes bytes() const [[nodiscard]] ReadonlyBytes bytes() const LIFETIME_BOUND
{ {
return m_digest.visit( return m_digest.visit(
[&](Empty const&) -> ReadonlyBytes { VERIFY_NOT_REACHED(); }, [&](Empty const&) -> ReadonlyBytes { VERIFY_NOT_REACHED(); },

View file

@ -471,8 +471,8 @@ struct DNSKEY {
return public_key[0]; return public_key[0];
return static_cast<u16>(public_key[1]) | static_cast<u16>(public_key[2]) << 8; return static_cast<u16>(public_key[1]) | static_cast<u16>(public_key[2]) << 8;
} }
ReadonlyBytes public_key_rsa_exponent() const { return public_key.bytes().slice(1, public_key_rsa_exponent_length()); } ReadonlyBytes public_key_rsa_exponent() const LIFETIME_BOUND { return public_key.bytes().slice(1, public_key_rsa_exponent_length()); }
ReadonlyBytes public_key_rsa_modulus() const { return public_key.bytes().slice(1 + public_key_rsa_exponent_length()); } ReadonlyBytes public_key_rsa_modulus() const LIFETIME_BOUND { return public_key.bytes().slice(1 + public_key_rsa_exponent_length()); }
constexpr static inline u16 FlagSecureEntryPoint = 0b1000000000000000; constexpr static inline u16 FlagSecureEntryPoint = 0b1000000000000000;
constexpr static inline u16 FlagZoneKey = 0b0100000000000000; constexpr static inline u16 FlagZoneKey = 0b0100000000000000;

View file

@ -28,7 +28,7 @@ public:
virtual RefPtr<Gfx::Font> get_font(FlyString const& family, float point_size, unsigned weight, unsigned width, unsigned slope) override; virtual RefPtr<Gfx::Font> get_font(FlyString const& family, float point_size, unsigned weight, unsigned width, unsigned slope) override;
virtual void for_each_typeface_with_family_name(FlyString const& family_name, Function<void(Typeface const&)>) override; virtual void for_each_typeface_with_family_name(FlyString const& family_name, Function<void(Typeface const&)>) override;
virtual StringView name() const override { return m_name.bytes_as_string_view(); } virtual StringView name() const LIFETIME_BOUND override { return m_name.bytes_as_string_view(); }
private: private:
HashMap<FlyString, Vector<NonnullRefPtr<Typeface>>, AK::ASCIICaseInsensitiveFlyStringTraits> m_typeface_by_family; HashMap<FlyString, Vector<NonnullRefPtr<Typeface>>, AK::ASCIICaseInsensitiveFlyStringTraits> m_typeface_by_family;

View file

@ -24,7 +24,7 @@ public:
virtual u16 width() const override; virtual u16 width() const override;
virtual u8 slope() const override; virtual u8 slope() const override;
virtual ReadonlyBytes buffer() const override { return m_buffer; } virtual ReadonlyBytes buffer() const LIFETIME_BOUND override { return m_buffer; }
virtual unsigned ttc_index() const override { return m_ttc_index; } virtual unsigned ttc_index() const override { return m_ttc_index; }
SkTypeface const* sk_typeface() const; SkTypeface const* sk_typeface() const;

View file

@ -31,7 +31,7 @@ public:
u32 index() const { return m_index; } u32 index() const { return m_index; }
ReadonlyBytes instruction_stream() const { return m_buffer.span(); } ReadonlyBytes instruction_stream() const LIFETIME_BOUND { return m_buffer.span(); }
u8* data() { return m_buffer.data(); } u8* data() { return m_buffer.data(); }
u8 const* data() const { return m_buffer.data(); } u8 const* data() const { return m_buffer.data(); }
size_t size() const { return m_buffer.size(); } size_t size() const { return m_buffer.size(); }

View file

@ -99,7 +99,7 @@ public:
Realm& realm() { return *m_realm; } Realm& realm() { return *m_realm; }
Realm const& realm() const { return *m_realm; } Realm const& realm() const { return *m_realm; }
StringView filename() const { return m_filename; } StringView filename() const LIFETIME_BOUND { return m_filename; }
GC::Ptr<ModuleEnvironment> environment() { return m_environment; } GC::Ptr<ModuleEnvironment> environment() { return m_environment; }

View file

@ -29,15 +29,15 @@ public:
Unicode::Usage usage() const { return m_usage; } Unicode::Usage usage() const { return m_usage; }
void set_usage(StringView usage) { m_usage = Unicode::usage_from_string(usage); } void set_usage(StringView usage) { m_usage = Unicode::usage_from_string(usage); }
StringView usage_string() const { return Unicode::usage_to_string(m_usage); } StringView usage_string() const LIFETIME_BOUND { return Unicode::usage_to_string(m_usage); }
Unicode::Sensitivity sensitivity() const { return m_sensitivity; } Unicode::Sensitivity sensitivity() const { return m_sensitivity; }
void set_sensitivity(Unicode::Sensitivity sensitivity) { m_sensitivity = sensitivity; } void set_sensitivity(Unicode::Sensitivity sensitivity) { m_sensitivity = sensitivity; }
StringView sensitivity_string() const { return Unicode::sensitivity_to_string(m_sensitivity); } StringView sensitivity_string() const LIFETIME_BOUND { return Unicode::sensitivity_to_string(m_sensitivity); }
Unicode::CaseFirst case_first() const { return m_case_first; } Unicode::CaseFirst case_first() const { return m_case_first; }
void set_case_first(StringView case_first) { m_case_first = Unicode::case_first_from_string(case_first); } void set_case_first(StringView case_first) { m_case_first = Unicode::case_first_from_string(case_first); }
StringView case_first_string() const { return Unicode::case_first_to_string(m_case_first); } StringView case_first_string() const LIFETIME_BOUND { return Unicode::case_first_to_string(m_case_first); }
String const& collation() const { return m_collation; } String const& collation() const { return m_collation; }
void set_collation(String collation) { m_collation = move(collation); } void set_collation(String collation) { m_collation = move(collation); }

View file

@ -44,7 +44,7 @@ public:
Vector<ModuleWithSpecifier> const& loaded_modules() const { return m_loaded_modules; } Vector<ModuleWithSpecifier> const& loaded_modules() const { return m_loaded_modules; }
HostDefined* host_defined() const { return m_host_defined; } HostDefined* host_defined() const { return m_host_defined; }
StringView filename() const { return m_filename; } StringView filename() const LIFETIME_BOUND { return m_filename; }
private: private:
Script(Realm&, StringView filename, NonnullRefPtr<Program>, HostDefined* = nullptr); Script(Realm&, StringView filename, NonnullRefPtr<Program>, HostDefined* = nullptr);

View file

@ -249,7 +249,7 @@ public:
bool is_editing() const { return m_is_editing; } bool is_editing() const { return m_is_editing; }
Utf32View const buffer_view() const { return { m_buffer.data(), m_buffer.size() }; } Utf32View const buffer_view() const LIFETIME_BOUND { return { m_buffer.data(), m_buffer.size() }; }
auto prohibit_input() auto prohibit_input()
{ {

View file

@ -56,11 +56,11 @@ public:
size_t invariant_offset { 0 }; size_t invariant_offset { 0 };
bool allow_commit_without_listing { true }; bool allow_commit_without_listing { true };
Utf8View text_view() const { return text.code_points(); } Utf8View text_view() const LIFETIME_BOUND { return text.code_points(); }
Utf8View trivia_view() const { return trailing_trivia.code_points(); } Utf8View trivia_view() const LIFETIME_BOUND { return trailing_trivia.code_points(); }
Utf8View display_trivia_view() const { return display_trivia.code_points(); } Utf8View display_trivia_view() const LIFETIME_BOUND { return display_trivia.code_points(); }
StringView text_string() const { return text.bytes_as_string_view(); } StringView text_string() const LIFETIME_BOUND { return text.bytes_as_string_view(); }
StringView display_trivia_string() const { return display_trivia.bytes_as_string_view(); } StringView display_trivia_string() const LIFETIME_BOUND { return display_trivia.bytes_as_string_view(); }
bool is_valid { false }; bool is_valid { false };
}; };

View file

@ -27,9 +27,9 @@ class SegmentInformation {
public: public:
u64 timestamp_scale() const { return m_timestamp_scale; } u64 timestamp_scale() const { return m_timestamp_scale; }
void set_timestamp_scale(u64 timestamp_scale) { m_timestamp_scale = timestamp_scale; } void set_timestamp_scale(u64 timestamp_scale) { m_timestamp_scale = timestamp_scale; }
Utf8View muxing_app() const { return Utf8View(m_muxing_app); } Utf8View muxing_app() const LIFETIME_BOUND { return Utf8View(m_muxing_app); }
void set_muxing_app(ByteString muxing_app) { m_muxing_app = move(muxing_app); } void set_muxing_app(ByteString muxing_app) { m_muxing_app = move(muxing_app); }
Utf8View writing_app() const { return Utf8View(m_writing_app); } Utf8View writing_app() const LIFETIME_BOUND { return Utf8View(m_writing_app); }
void set_writing_app(ByteString writing_app) { m_writing_app = move(writing_app); } void set_writing_app(ByteString writing_app) { m_writing_app = move(writing_app); }
Optional<double> duration_unscaled() const { return m_duration_unscaled; } Optional<double> duration_unscaled() const { return m_duration_unscaled; }
void set_duration_unscaled(double duration) { m_duration_unscaled.emplace(duration); } void set_duration_unscaled(double duration) { m_duration_unscaled.emplace(duration); }
@ -120,7 +120,7 @@ public:
void set_language(FlyString const& language) { m_language = language; } void set_language(FlyString const& language) { m_language = language; }
FlyString codec_id() const { return m_codec_id; } FlyString codec_id() const { return m_codec_id; }
void set_codec_id(FlyString const& codec_id) { m_codec_id = codec_id; } void set_codec_id(FlyString const& codec_id) { m_codec_id = codec_id; }
ReadonlyBytes codec_private_data() const { return m_codec_private_data.span(); } ReadonlyBytes codec_private_data() const LIFETIME_BOUND { return m_codec_private_data.span(); }
ErrorOr<void> set_codec_private_data(ReadonlyBytes codec_private_data) ErrorOr<void> set_codec_private_data(ReadonlyBytes codec_private_data)
{ {
m_codec_private_data = TRY(FixedArray<u8>::create(codec_private_data)); m_codec_private_data = TRY(FixedArray<u8>::create(codec_private_data));

View file

@ -63,12 +63,12 @@ public:
} }
DecoderErrorCategory category() const { return m_category; } DecoderErrorCategory category() const { return m_category; }
StringView description() const StringView description() const LIFETIME_BOUND
{ {
return m_description.visit([](StringView x) { return x; }, [](ByteString const& x) { return x.view(); }); return m_description.visit([](StringView x) { return x; }, [](ByteString const& x) { return x.view(); });
} }
// For compatibility with AK::Error // For compatibility with AK::Error
StringView string_literal() const { return description(); } StringView string_literal() const LIFETIME_BOUND { return description(); }
private: private:
template<OneOf<StringView, ByteString> T> template<OneOf<StringView, ByteString> T>

View file

@ -35,7 +35,7 @@ public:
ByteString to_utf8() const; ByteString to_utf8() const;
Utf32View view() const { return { code_points(), length() }; } Utf32View view() const LIFETIME_BOUND { return { code_points(), length() }; }
u32 const* code_points() const { return m_text.data(); } u32 const* code_points() const { return m_text.data(); }
size_t length() const { return m_text.size(); } size_t length() const { return m_text.size(); }
bool set_text(Document&, StringView); bool set_text(Document&, StringView);

View file

@ -1084,7 +1084,7 @@ public:
void set_validation_status(ValidationStatus status, Badge<Validator>) { set_validation_status(status); } void set_validation_status(ValidationStatus status, Badge<Validator>) { set_validation_status(status); }
ValidationStatus validation_status() const { return m_validation_status; } ValidationStatus validation_status() const { return m_validation_status; }
StringView validation_error() const { return *m_validation_error; } StringView validation_error() const LIFETIME_BOUND { return *m_validation_error; }
void set_validation_error(ByteString error) { m_validation_error = move(error); } void set_validation_error(ByteString error) { m_validation_error = move(error); }
static ParseResult<NonnullRefPtr<Module>> parse(Stream& stream); static ParseResult<NonnullRefPtr<Module>> parse(Stream& stream);

View file

@ -84,8 +84,8 @@ public:
} }
// This returns the internal representation. In this case, that is the value stored in little endian format. // This returns the internal representation. In this case, that is the value stored in little endian format.
constexpr Bytes bytes() { return Bytes { &m_value, sizeof(m_value) }; } constexpr Bytes bytes() LIFETIME_BOUND { return Bytes { &m_value, sizeof(m_value) }; }
constexpr ReadonlyBytes bytes() const { return ReadonlyBytes { &m_value, sizeof(m_value) }; } constexpr ReadonlyBytes bytes() const LIFETIME_BOUND { return ReadonlyBytes { &m_value, sizeof(m_value) }; }
void serialize_into(Array<Bytes, 1> bytes) const; void serialize_into(Array<Bytes, 1> bytes) const;
static LittleEndian read_from(Array<ReadonlyBytes, 1> const& bytes); static LittleEndian read_from(Array<ReadonlyBytes, 1> const& bytes);

View file

@ -24,7 +24,7 @@ public:
Angle const& angle() const { return m_angle; } Angle const& angle() const { return m_angle; }
virtual double raw_value() const override { return m_angle.raw_value(); } virtual double raw_value() const override { return m_angle.raw_value(); }
virtual StringView unit_name() const override { return m_angle.unit_name(); } virtual StringView unit_name() const LIFETIME_BOUND override { return m_angle.unit_name(); }
virtual String to_string(SerializationMode) const override; virtual String to_string(SerializationMode) const override;

View file

@ -21,7 +21,7 @@ public:
Flex const& flex() const { return m_flex; } Flex const& flex() const { return m_flex; }
virtual double raw_value() const override { return m_flex.raw_value(); } virtual double raw_value() const override { return m_flex.raw_value(); }
virtual StringView unit_name() const override { return m_flex.unit_name(); } virtual StringView unit_name() const LIFETIME_BOUND override { return m_flex.unit_name(); }
virtual String to_string(SerializationMode serialization_mode) const override { return m_flex.to_string(serialization_mode); } virtual String to_string(SerializationMode serialization_mode) const override { return m_flex.to_string(serialization_mode); }

View file

@ -24,7 +24,7 @@ public:
Frequency const& frequency() const { return m_frequency; } Frequency const& frequency() const { return m_frequency; }
virtual double raw_value() const override { return m_frequency.raw_value(); } virtual double raw_value() const override { return m_frequency.raw_value(); }
virtual StringView unit_name() const override { return m_frequency.unit_name(); } virtual StringView unit_name() const LIFETIME_BOUND override { return m_frequency.unit_name(); }
virtual String to_string(SerializationMode serialization_mode) const override { return m_frequency.to_string(serialization_mode); } virtual String to_string(SerializationMode serialization_mode) const override { return m_frequency.to_string(serialization_mode); }

View file

@ -22,7 +22,7 @@ public:
Length const& length() const { return m_length; } Length const& length() const { return m_length; }
virtual double raw_value() const override { return m_length.raw_value(); } virtual double raw_value() const override { return m_length.raw_value(); }
virtual StringView unit_name() const override { return m_length.unit_name(); } virtual StringView unit_name() const LIFETIME_BOUND override { return m_length.unit_name(); }
virtual String to_string(SerializationMode serialization_mode) const override { return m_length.to_string(serialization_mode); } virtual String to_string(SerializationMode serialization_mode) const override { return m_length.to_string(serialization_mode); }
virtual ValueComparingNonnullRefPtr<StyleValue const> absolutized(CSSPixelRect const& viewport_rect, Length::FontMetrics const& font_metrics, Length::FontMetrics const& root_font_metrics) const override; virtual ValueComparingNonnullRefPtr<StyleValue const> absolutized(CSSPixelRect const& viewport_rect, Length::FontMetrics const& font_metrics, Length::FontMetrics const& root_font_metrics) const override;

View file

@ -21,7 +21,7 @@ public:
Resolution const& resolution() const { return m_resolution; } Resolution const& resolution() const { return m_resolution; }
virtual double raw_value() const override { return m_resolution.raw_value(); } virtual double raw_value() const override { return m_resolution.raw_value(); }
virtual StringView unit_name() const override { return m_resolution.unit_name(); } virtual StringView unit_name() const LIFETIME_BOUND override { return m_resolution.unit_name(); }
virtual String to_string(SerializationMode serialization_mode) const override { return m_resolution.to_string(serialization_mode); } virtual String to_string(SerializationMode serialization_mode) const override { return m_resolution.to_string(serialization_mode); }

View file

@ -24,7 +24,7 @@ public:
Time const& time() const { return m_time; } Time const& time() const { return m_time; }
virtual double raw_value() const override { return m_time.raw_value(); } virtual double raw_value() const override { return m_time.raw_value(); }
virtual StringView unit_name() const override { return m_time.unit_name(); } virtual StringView unit_name() const LIFETIME_BOUND override { return m_time.unit_name(); }
virtual String to_string(SerializationMode serialization_mode) const override { return m_time.to_string(serialization_mode); } virtual String to_string(SerializationMode serialization_mode) const override { return m_time.to_string(serialization_mode); }

View file

@ -178,7 +178,7 @@ public:
[[nodiscard]] static GC::Ref<Request> create(JS::VM&); [[nodiscard]] static GC::Ref<Request> create(JS::VM&);
[[nodiscard]] ReadonlyBytes method() const { return m_method; } [[nodiscard]] ReadonlyBytes method() const LIFETIME_BOUND { return m_method; }
void set_method(ByteBuffer method) { m_method = move(method); } void set_method(ByteBuffer method) { m_method = move(method); }
[[nodiscard]] bool local_urls_only() const { return m_local_urls_only; } [[nodiscard]] bool local_urls_only() const { return m_local_urls_only; }

View file

@ -78,7 +78,7 @@ public:
[[nodiscard]] virtual Status status() const { return m_status; } [[nodiscard]] virtual Status status() const { return m_status; }
virtual void set_status(Status status) { m_status = status; } virtual void set_status(Status status) { m_status = status; }
[[nodiscard]] virtual ReadonlyBytes status_message() const { return m_status_message; } [[nodiscard]] virtual ReadonlyBytes status_message() const LIFETIME_BOUND { return m_status_message; }
virtual void set_status_message(ByteBuffer status_message) { m_status_message = move(status_message); } virtual void set_status_message(ByteBuffer status_message) { m_status_message = move(status_message); }
[[nodiscard]] virtual GC::Ref<HeaderList> header_list() const { return m_header_list; } [[nodiscard]] virtual GC::Ref<HeaderList> header_list() const { return m_header_list; }
@ -230,7 +230,7 @@ public:
[[nodiscard]] virtual Status status() const override { return m_internal_response->status(); } [[nodiscard]] virtual Status status() const override { return m_internal_response->status(); }
virtual void set_status(Status status) override { m_internal_response->set_status(status); } virtual void set_status(Status status) override { m_internal_response->set_status(status); }
[[nodiscard]] virtual ReadonlyBytes status_message() const override { return m_internal_response->status_message(); } [[nodiscard]] virtual ReadonlyBytes status_message() const LIFETIME_BOUND override { return m_internal_response->status_message(); }
virtual void set_status_message(ByteBuffer status_message) override { m_internal_response->set_status_message(move(status_message)); } virtual void set_status_message(ByteBuffer status_message) override { m_internal_response->set_status_message(move(status_message)); }
[[nodiscard]] virtual GC::Ref<HeaderList> header_list() const override { return m_internal_response->header_list(); } [[nodiscard]] virtual GC::Ref<HeaderList> header_list() const override { return m_internal_response->header_list(); }
@ -317,7 +317,7 @@ public:
[[nodiscard]] virtual Vector<URL::URL> const& url_list() const override { return m_url_list; } [[nodiscard]] virtual Vector<URL::URL> const& url_list() const override { return m_url_list; }
[[nodiscard]] virtual Vector<URL::URL>& url_list() override { return m_url_list; } [[nodiscard]] virtual Vector<URL::URL>& url_list() override { return m_url_list; }
[[nodiscard]] virtual Status status() const override { return 0; } [[nodiscard]] virtual Status status() const override { return 0; }
[[nodiscard]] virtual ReadonlyBytes status_message() const override { return {}; } [[nodiscard]] virtual ReadonlyBytes status_message() const LIFETIME_BOUND override { return {}; }
[[nodiscard]] virtual GC::Ref<HeaderList> header_list() const override { return m_header_list; } [[nodiscard]] virtual GC::Ref<HeaderList> header_list() const override { return m_header_list; }
[[nodiscard]] virtual GC::Ptr<Body> body() const override { return nullptr; } [[nodiscard]] virtual GC::Ptr<Body> body() const override { return nullptr; }
@ -340,7 +340,7 @@ public:
[[nodiscard]] virtual Type type() const override { return Type::OpaqueRedirect; } [[nodiscard]] virtual Type type() const override { return Type::OpaqueRedirect; }
[[nodiscard]] virtual Status status() const override { return 0; } [[nodiscard]] virtual Status status() const override { return 0; }
[[nodiscard]] virtual ReadonlyBytes status_message() const override { return {}; } [[nodiscard]] virtual ReadonlyBytes status_message() const LIFETIME_BOUND override { return {}; }
[[nodiscard]] virtual GC::Ref<HeaderList> header_list() const override { return m_header_list; } [[nodiscard]] virtual GC::Ref<HeaderList> header_list() const override { return m_header_list; }
[[nodiscard]] virtual GC::Ptr<Body> body() const override { return nullptr; } [[nodiscard]] virtual GC::Ptr<Body> body() const override { return nullptr; }

View file

@ -53,7 +53,7 @@ public:
GC::Ref<WebIDL::Promise> array_buffer(); GC::Ref<WebIDL::Promise> array_buffer();
GC::Ref<WebIDL::Promise> bytes(); GC::Ref<WebIDL::Promise> bytes();
ReadonlyBytes raw_bytes() const { return m_byte_buffer.bytes(); } ReadonlyBytes raw_bytes() const LIFETIME_BOUND { return m_byte_buffer.bytes(); }
GC::Ref<Streams::ReadableStream> get_stream(); GC::Ref<Streams::ReadableStream> get_stream();

View file

@ -39,7 +39,7 @@ public:
~Resource(); ~Resource();
MimeType const& computed_mime_type() const { return m_computed_mime_type; } MimeType const& computed_mime_type() const { return m_computed_mime_type; }
ReadonlyBytes resource_header() const { return m_resource_header; } ReadonlyBytes resource_header() const LIFETIME_BOUND { return m_resource_header; }
private: private:
Resource(ReadonlyBytes data, bool no_sniff, MimeType&& default_computed_mime_type); Resource(ReadonlyBytes data, bool no_sniff, MimeType&& default_computed_mime_type);

View file

@ -31,7 +31,7 @@ public:
} }
virtual ~SourceDocument() = default; virtual ~SourceDocument() = default;
StringView text() const { return m_source; } StringView text() const LIFETIME_BOUND { return m_source; }
size_t line_count() const { return m_lines.size(); } size_t line_count() const { return m_lines.size(); }
// ^ Syntax::Document // ^ Syntax::Document