diff options
author | Philip Chimento <philip.chimento@gmail.com> | 2022-07-03 23:13:45 +0000 |
---|---|---|
committer | Philip Chimento <philip.chimento@gmail.com> | 2022-07-03 23:13:45 +0000 |
commit | d30acd5bbf6ac8917724bb4380acd02b9d223a75 (patch) | |
tree | 441d7b1b604980e4d20885d4c4eb140548f8969b /gi | |
parent | d961f9cd8f2ccfd199950f229d5d83bc38a451b7 (diff) | |
parent | 1c31d66b4e21d377e390ef8d2638e20c35cce890 (diff) | |
download | gjs-d30acd5bbf6ac8917724bb4380acd02b9d223a75.tar.gz |
Merge branch 'more-constexpr-args' into 'master'
gi/arg-inl: Mark the arg functions as constexpr
See merge request GNOME/gjs!752
Diffstat (limited to 'gi')
-rw-r--r-- | gi/arg-cache.cpp | 35 | ||||
-rw-r--r-- | gi/arg-cache.h | 4 | ||||
-rw-r--r-- | gi/arg-inl.h | 54 |
3 files changed, 46 insertions, 47 deletions
diff --git a/gi/arg-cache.cpp b/gi/arg-cache.cpp index d5125fd7..ff0e59a2 100644 --- a/gi/arg-cache.cpp +++ b/gi/arg-cache.cpp @@ -6,6 +6,7 @@ #include <config.h> #include <inttypes.h> +#include <stddef.h> // for size_t #include <stdint.h> #include <string.h> @@ -61,34 +62,9 @@ static const char* expected_type_names[] = {"object", "function", "string"}; static_assert(G_N_ELEMENTS(expected_type_names) == ExpectedType::LAST, "Names must match the values in ExpectedType"); -// A helper function to retrieve array lengths from a GIArgument (letting the -// compiler generate good instructions in case of big endian machines) -[[nodiscard]] size_t gjs_g_argument_get_array_length(GITypeTag tag, - GIArgument* arg) { - switch (tag) { - case GI_TYPE_TAG_INT8: - return gjs_arg_get<int8_t>(arg); - case GI_TYPE_TAG_UINT8: - return gjs_arg_get<uint8_t>(arg); - case GI_TYPE_TAG_INT16: - return gjs_arg_get<int16_t>(arg); - case GI_TYPE_TAG_UINT16: - return gjs_arg_get<uint16_t>(arg); - case GI_TYPE_TAG_INT32: - return gjs_arg_get<int32_t>(arg); - case GI_TYPE_TAG_UINT32: - return gjs_arg_get<uint32_t>(arg); - case GI_TYPE_TAG_INT64: - return gjs_arg_get<int64_t>(arg); - case GI_TYPE_TAG_UINT64: - return gjs_arg_get<uint64_t>(arg); - default: - g_assert_not_reached(); - } -} - -static void gjs_g_argument_set_array_length(GITypeTag tag, GIArgument* arg, - size_t value) { +static constexpr void gjs_g_argument_set_array_length(GITypeTag tag, + GIArgument* arg, + size_t value) { switch (tag) { case GI_TYPE_TAG_INT8: gjs_arg_set<int8_t>(arg, value); @@ -208,7 +184,8 @@ struct Positioned { m_arg_pos = pos; } - bool set_out_parameter(GjsFunctionCallState* state, GIArgument* arg) { + constexpr bool set_out_parameter(GjsFunctionCallState* state, + GIArgument* arg) { gjs_arg_unset<void*>(&state->out_cvalue(m_arg_pos)); gjs_arg_set(arg, &gjs_arg_member<void*>(&state->out_cvalue(m_arg_pos))); return true; diff --git a/gi/arg-cache.h b/gi/arg-cache.h index 2a02869b..ae73971d 100644 --- a/gi/arg-cache.h +++ b/gi/arg-cache.h @@ -8,7 +8,6 @@ #include <config.h> -#include <stddef.h> #include <stdint.h> #include <limits> @@ -231,7 +230,4 @@ struct ArgsCache { } // namespace Gjs -[[nodiscard]] size_t gjs_g_argument_get_array_length(GITypeTag tag, - GIArgument* arg); - #endif // GI_ARG_CACHE_H_ diff --git a/gi/arg-inl.h b/gi/arg-inl.h index 5fb19e3b..5b2408e1 100644 --- a/gi/arg-inl.h +++ b/gi/arg-inl.h @@ -39,7 +39,7 @@ // appropriate union member for type T and returns the replaced value. template <auto GIArgument::*member> -[[nodiscard]] inline decltype(auto) gjs_arg_member(GIArgument* arg) { +[[nodiscard]] constexpr inline decltype(auto) gjs_arg_member(GIArgument* arg) { return (arg->*member); } @@ -47,7 +47,7 @@ template <auto GIArgument::*member> * which are in fact typedef's of other generic types. * Setting a tag for a type allows to perform proper specialization. */ template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> -[[nodiscard]] inline decltype(auto) gjs_arg_member(GIArgument* arg) { +[[nodiscard]] constexpr inline decltype(auto) gjs_arg_member(GIArgument* arg) { if constexpr (TAG == GI_TYPE_TAG_VOID) { if constexpr (std::is_same_v<T, bool>) return gjs_arg_member<&GIArgument::v_boolean>(arg); @@ -115,7 +115,7 @@ template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> } template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> -inline void gjs_arg_set(GIArgument* arg, T v) { +constexpr inline void gjs_arg_set(GIArgument* arg, T v) { if constexpr (std::is_pointer_v<T>) { using NonconstPtrT = std::add_pointer_t<std::remove_const_t<std::remove_pointer_t<T>>>; @@ -132,18 +132,18 @@ inline void gjs_arg_set(GIArgument* arg, T v) { // Store function pointers as void*. It is a requirement of GLib that your // compiler can do this template <typename ReturnT, typename... Args> -inline void gjs_arg_set(GIArgument* arg, ReturnT (*v)(Args...)) { +constexpr inline void gjs_arg_set(GIArgument* arg, ReturnT (*v)(Args...)) { gjs_arg_member<void*>(arg) = reinterpret_cast<void*>(v); } template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> -inline std::enable_if_t<std::is_integral_v<T>> gjs_arg_set(GIArgument* arg, - void *v) { +constexpr inline std::enable_if_t<std::is_integral_v<T>> gjs_arg_set( + GIArgument* arg, void* v) { gjs_arg_set<T, TAG>(arg, gjs_pointer_to_int<T>(v)); } template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> -[[nodiscard]] inline T gjs_arg_get(GIArgument* arg) { +[[nodiscard]] constexpr inline T gjs_arg_get(GIArgument* arg) { if constexpr (std::is_same_v<T, bool> || (std::is_same_v<T, gboolean> && TAG == GI_TYPE_TAG_BOOLEAN)) return T(!!gjs_arg_member<T, TAG>(arg)); @@ -152,12 +152,12 @@ template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> } template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> -[[nodiscard]] inline void* gjs_arg_get_as_pointer(GIArgument* arg) { +[[nodiscard]] constexpr inline void* gjs_arg_get_as_pointer(GIArgument* arg) { return gjs_int_to_pointer(gjs_arg_get<T, TAG>(arg)); } template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> -inline void gjs_arg_unset(GIArgument* arg) { +constexpr inline void gjs_arg_unset(GIArgument* arg) { if constexpr (std::is_pointer_v<T>) gjs_arg_set<T, TAG>(arg, nullptr); else @@ -165,7 +165,7 @@ inline void gjs_arg_unset(GIArgument* arg) { } template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> -[[nodiscard]] inline T gjs_arg_steal(GIArgument* arg) { +[[nodiscard]] constexpr inline T gjs_arg_steal(GIArgument* arg) { auto val = gjs_arg_get<T, TAG>(arg); gjs_arg_unset<T, TAG>(arg); return val; @@ -174,10 +174,10 @@ template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID> // Implementation to store rounded (u)int64_t numbers into double template <typename BigT> -[[nodiscard]] inline std::enable_if_t<std::is_integral_v<BigT> && - (std::numeric_limits<BigT>::max() > - std::numeric_limits<int32_t>::max()), - double> +[[nodiscard]] inline constexpr std::enable_if_t< + std::is_integral_v<BigT> && (std::numeric_limits<BigT>::max() > + std::numeric_limits<int32_t>::max()), + double> gjs_arg_get_maybe_rounded(GIArgument* arg) { BigT val = gjs_arg_get<BigT>(arg); @@ -211,3 +211,29 @@ GJS_JSAPI_RETURN_CONVENTION inline bool gjs_arg_set_from_js_value( return true; } + +// A helper function to retrieve array lengths from a GIArgument (letting the +// compiler generate good instructions in case of big endian machines) +[[nodiscard]] constexpr size_t gjs_g_argument_get_array_length( + GITypeTag tag, GIArgument* arg) { + switch (tag) { + case GI_TYPE_TAG_INT8: + return gjs_arg_get<int8_t>(arg); + case GI_TYPE_TAG_UINT8: + return gjs_arg_get<uint8_t>(arg); + case GI_TYPE_TAG_INT16: + return gjs_arg_get<int16_t>(arg); + case GI_TYPE_TAG_UINT16: + return gjs_arg_get<uint16_t>(arg); + case GI_TYPE_TAG_INT32: + return gjs_arg_get<int32_t>(arg); + case GI_TYPE_TAG_UINT32: + return gjs_arg_get<uint32_t>(arg); + case GI_TYPE_TAG_INT64: + return gjs_arg_get<int64_t>(arg); + case GI_TYPE_TAG_UINT64: + return gjs_arg_get<uint64_t>(arg); + default: + g_assert_not_reached(); + } +} |