mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
LibWeb: Store all members of WebIDL::ExceptionOr<T> in a single Variant
This reduces the size of WebIDL::ExceptionOr<T> as follows for a few different Ts: WebIDL::ExceptionOr<void>: 48 bytes to 40 bytes WebIDL::ExceptionOr<JS::Value>: 48 bytes to 40 bytes WebIDL::ExceptionOr<String>: 56 bytes to 40 bytes
This commit is contained in:
parent
8f1d13e73b
commit
7f717b8414
Notes:
sideshowbarker
2024-07-17 05:01:20 +09:00
Author: https://github.com/trflynn89 Commit: https://github.com/SerenityOS/serenity/commit/7f717b8414 Pull-request: https://github.com/SerenityOS/serenity/pull/17688 Reviewed-by: https://github.com/linusg ✅
1 changed files with 15 additions and 17 deletions
|
@ -37,17 +37,17 @@ class [[nodiscard]] ExceptionOr {
|
||||||
public:
|
public:
|
||||||
ExceptionOr()
|
ExceptionOr()
|
||||||
requires(IsSame<ValueType, Empty>)
|
requires(IsSame<ValueType, Empty>)
|
||||||
: m_result(Empty {})
|
: m_result_or_exception(Empty {})
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ExceptionOr(ValueType const& result)
|
ExceptionOr(ValueType const& result)
|
||||||
: m_result(result)
|
: m_result_or_exception(result)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ExceptionOr(ValueType&& result)
|
ExceptionOr(ValueType&& result)
|
||||||
: m_result(move(result))
|
: m_result_or_exception(move(result))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,31 +57,31 @@ public:
|
||||||
template<typename WrappedValueType>
|
template<typename WrappedValueType>
|
||||||
ExceptionOr(WrappedValueType result)
|
ExceptionOr(WrappedValueType result)
|
||||||
requires(!IsPOD<ValueType>)
|
requires(!IsPOD<ValueType>)
|
||||||
: m_result(move(result))
|
: m_result_or_exception(ValueType { move(result) })
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ExceptionOr(JS::NonnullGCPtr<DOMException> exception)
|
ExceptionOr(JS::NonnullGCPtr<DOMException> exception)
|
||||||
: m_exception(move(exception))
|
: m_result_or_exception(exception)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ExceptionOr(SimpleException exception)
|
ExceptionOr(SimpleException exception)
|
||||||
: m_exception(move(exception))
|
: m_result_or_exception(move(exception))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ExceptionOr(JS::Completion exception)
|
ExceptionOr(JS::Completion exception)
|
||||||
: m_exception(move(exception))
|
: m_result_or_exception(move(exception))
|
||||||
{
|
{
|
||||||
auto const& completion = m_exception.get<JS::Completion>();
|
auto const& completion = m_result_or_exception.template get<JS::Completion>();
|
||||||
VERIFY(completion.is_error());
|
VERIFY(completion.is_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
ExceptionOr(Variant<SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion> exception)
|
ExceptionOr(Variant<SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion> exception)
|
||||||
: m_exception(move(exception).template downcast<Empty, SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion>())
|
: m_result_or_exception(move(exception))
|
||||||
{
|
{
|
||||||
if (auto* completion = m_exception.template get_pointer<JS::Completion>())
|
if (auto* completion = m_result_or_exception.template get_pointer<JS::Completion>())
|
||||||
VERIFY(completion->is_error());
|
VERIFY(completion->is_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,22 +92,22 @@ public:
|
||||||
ValueType& value()
|
ValueType& value()
|
||||||
requires(!IsSame<ValueType, Empty>)
|
requires(!IsSame<ValueType, Empty>)
|
||||||
{
|
{
|
||||||
return m_result.value();
|
return m_result_or_exception.template get<ValueType>();
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueType release_value()
|
ValueType release_value()
|
||||||
{
|
{
|
||||||
return m_result.release_value();
|
return move(m_result_or_exception.template get<ValueType>());
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant<SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion> exception() const
|
Variant<SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion> exception() const
|
||||||
{
|
{
|
||||||
return m_exception.template downcast<SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion>();
|
return m_result_or_exception.template downcast<SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion>();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_exception() const
|
bool is_exception() const
|
||||||
{
|
{
|
||||||
return !m_exception.template has<Empty>();
|
return !m_result_or_exception.template has<ValueType>();
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueType release_value_but_fixme_should_propagate_errors()
|
ValueType release_value_but_fixme_should_propagate_errors()
|
||||||
|
@ -121,10 +121,8 @@ public:
|
||||||
Variant<SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion> release_error() { return exception(); }
|
Variant<SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion> release_error() { return exception(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Optional<ValueType> m_result;
|
|
||||||
|
|
||||||
// https://webidl.spec.whatwg.org/#idl-exceptions
|
// https://webidl.spec.whatwg.org/#idl-exceptions
|
||||||
Variant<Empty, SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion> m_exception {};
|
Variant<ValueType, SimpleException, JS::NonnullGCPtr<DOMException>, JS::Completion> m_result_or_exception;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
Loading…
Reference in a new issue