From 42b5c896e86b0d77d62ecae0ec78802aaff285a1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 14 Dec 2022 12:10:40 +0100 Subject: [PATCH] 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. --- Userland/Libraries/LibJS/Runtime/Completion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/Completion.h b/Userland/Libraries/LibJS/Runtime/Completion.h index cae9f8b8ff..0367d25727 100644 --- a/Userland/Libraries/LibJS/Runtime/Completion.h +++ b/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(...) };". // Disabled for POD types to avoid weird conversion shenanigans. template - ThrowCompletionOr(WrappedValueType value) + ThrowCompletionOr(WrappedValueType const& value) requires(!IsPOD) - : m_value(move(value)) + : m_value(value) { }