LibJS: Don't "copy construct" temporary value in ThrowCompletionOr ctor

It was possible for the generic ThrowCompletionOr constructor to
"copy-construct" a JS Object when instantiating a ThrowCompletionOr
via e.g `return *object;`.

This happened because it chose the Object(Object& prototype) constructor
which will be removed in a subsequent commit. It was not easy to debug.

As a first step towards avoiding this in the future, the generic
ThrowCompletionOr constructor now takes the value as a const reference.
This commit is contained in:
Andreas Kling 2022-12-14 12:10:40 +01:00
parent 3ea1584f2e
commit 42b5c896e8
Notes: sideshowbarker 2024-07-17 03:15:37 +09:00

View File

@ -268,9 +268,9 @@ public:
// Most commonly: Value from Object* or similar, so we can omit the curly braces from "return { TRY(...) };".
// Disabled for POD types to avoid weird conversion shenanigans.
template<typename WrappedValueType>
ThrowCompletionOr(WrappedValueType value)
ThrowCompletionOr(WrappedValueType const& value)
requires(!IsPOD<ValueType>)
: m_value(move(value))
: m_value(value)
{
}