From 11fad1b7370bbe1564e6f799c512f85bdffd16c6 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 23:41:12 -0500 Subject: [PATCH] refactor: make a variadic `gin_helper::internal::InvokeFactory()` (#46028) refactor: make a variadic gin_helper::internal::InvokeFactory() Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Charles Kerr --- shell/common/gin_helper/constructor.h | 157 ++++++-------------------- 1 file changed, 34 insertions(+), 123 deletions(-) diff --git a/shell/common/gin_helper/constructor.h b/shell/common/gin_helper/constructor.h index 728ee0f2ebc1..7ae5e096c15b 100644 --- a/shell/common/gin_helper/constructor.h +++ b/shell/common/gin_helper/constructor.h @@ -5,6 +5,8 @@ #ifndef ELECTRON_SHELL_COMMON_GIN_HELPER_CONSTRUCTOR_H_ #define ELECTRON_SHELL_COMMON_GIN_HELPER_CONSTRUCTOR_H_ +#include + #include "shell/common/gin_helper/function_template.h" #include "shell/common/gin_helper/wrappable_base.h" @@ -12,131 +14,40 @@ namespace gin_helper { namespace internal { -// This set of templates invokes a base::RepeatingCallback by converting the -// Arguments into native types. It relies on the function_template.h to provide -// helper templates. -inline WrappableBase* InvokeFactory( - gin::Arguments* args, - const base::RepeatingCallback& callback) { - return callback.Run(); -} +// Convert a `gin::Argument`'s arguments into a tuple of native types +// by iteratively calling gin_helper::GetNextArgument(). +template +class GinArgumentsToTuple { + public: + [[nodiscard]] static std::pair> GetArgs( + gin::Arguments* args) { + bool ok = true; + InvokerOptions opts{.holder_is_first_argument = true}; + auto tup = std::make_tuple(GetNextArg(args, opts, ok)...); + return {ok, std::move(tup)}; + } -template -inline WrappableBase* InvokeFactory( - gin::Arguments* args, - const base::RepeatingCallback& callback) { - typename CallbackParamTraits::LocalType a1; - if (!gin_helper::GetNextArgument(args, {.holder_is_first_argument = true}, 0, - &a1)) - return nullptr; - return callback.Run(a1); -} + private: + template + static T GetNextArg(gin::Arguments* args, InvokerOptions& opts, bool& ok) { + auto val = T{}; + ok = ok && gin_helper::GetNextArgument(args, opts, 0, &val); + opts.holder_is_first_argument = false; + return val; + } +}; -template -inline WrappableBase* InvokeFactory( +// Invoke a callback with arguments extracted from `args`. +template +WrappableBase* InvokeFactory( gin::Arguments* args, - const base::RepeatingCallback& callback) { - typename CallbackParamTraits::LocalType a1; - typename CallbackParamTraits::LocalType a2; - if (!gin_helper::GetNextArgument(args, {.holder_is_first_argument = true}, 0, - &a1) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a2)) - return nullptr; - return callback.Run(a1, a2); -} - -template -inline WrappableBase* InvokeFactory( - gin::Arguments* args, - const base::RepeatingCallback& callback) { - typename CallbackParamTraits::LocalType a1; - typename CallbackParamTraits::LocalType a2; - typename CallbackParamTraits::LocalType a3; - if (!gin_helper::GetNextArgument(args, {.holder_is_first_argument = true}, 0, - &a1) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a2) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a3)) - return nullptr; - return callback.Run(a1, a2, a3); -} - -template -inline WrappableBase* InvokeFactory( - gin::Arguments* args, - const base::RepeatingCallback& callback) { - typename CallbackParamTraits::LocalType a1; - typename CallbackParamTraits::LocalType a2; - typename CallbackParamTraits::LocalType a3; - typename CallbackParamTraits::LocalType a4; - if (!gin_helper::GetNextArgument(args, {.holder_is_first_argument = true}, 0, - &a1) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a2) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a3) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a4)) - return nullptr; - return callback.Run(a1, a2, a3, a4); -} - -template -inline WrappableBase* InvokeFactory( - gin::Arguments* args, - const base::RepeatingCallback& - callback) { - typename CallbackParamTraits::LocalType a1; - typename CallbackParamTraits::LocalType a2; - typename CallbackParamTraits::LocalType a3; - typename CallbackParamTraits::LocalType a4; - typename CallbackParamTraits::LocalType a5; - if (!gin_helper::GetNextArgument(args, {.holder_is_first_argument = true}, 0, - &a1) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a2) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a3) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a4) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a5)) - return nullptr; - return callback.Run(a1, a2, a3, a4, a5); -} - -template -inline WrappableBase* InvokeFactory( - gin::Arguments* args, - const base::RepeatingCallback& - callback) { - typename CallbackParamTraits::LocalType a1; - typename CallbackParamTraits::LocalType a2; - typename CallbackParamTraits::LocalType a3; - typename CallbackParamTraits::LocalType a4; - typename CallbackParamTraits::LocalType a5; - typename CallbackParamTraits::LocalType a6; - if (!gin_helper::GetNextArgument(args, {.holder_is_first_argument = true}, 0, - &a1) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a2) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a3) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a4) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a5) || - !gin_helper::GetNextArgument(args, {.holder_is_first_argument = false}, 0, - &a6)) - return nullptr; - return callback.Run(a1, a2, a3, a4, a5, a6); + const base::RepeatingCallback& callback) { + auto [ok, tup] = GinArgumentsToTuple::GetArgs(args); + if (!ok) + return {}; + return std::apply( + [&callback](Types... args) { return callback.Run(std::move(args)...); }, + std::move(tup)); } template @@ -151,7 +62,7 @@ void InvokeNew(const base::RepeatingCallback& factory, WrappableBase* object; { // Don't continue if the constructor throws an exception. - v8::TryCatch try_catch(isolate); + v8::TryCatch try_catch{isolate}; object = internal::InvokeFactory(args, factory); if (try_catch.HasCaught()) { try_catch.ReThrow();