Selaa lähdekoodia

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.
Andreas Kling 2 vuotta sitten
vanhempi
commit
42b5c896e8
1 muutettua tiedostoa jossa 2 lisäystä ja 2 poistoa
  1. 2 2
      Userland/Libraries/LibJS/Runtime/Completion.h

+ 2 - 2
Userland/Libraries/LibJS/Runtime/Completion.h

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