summaryrefslogtreecommitdiff
path: root/gi
diff options
context:
space:
mode:
authorPhilip Chimento <philip.chimento@gmail.com>2022-07-03 23:13:45 +0000
committerPhilip Chimento <philip.chimento@gmail.com>2022-07-03 23:13:45 +0000
commitd30acd5bbf6ac8917724bb4380acd02b9d223a75 (patch)
tree441d7b1b604980e4d20885d4c4eb140548f8969b /gi
parentd961f9cd8f2ccfd199950f229d5d83bc38a451b7 (diff)
parent1c31d66b4e21d377e390ef8d2638e20c35cce890 (diff)
downloadgjs-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.cpp35
-rw-r--r--gi/arg-cache.h4
-rw-r--r--gi/arg-inl.h54
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();
+ }
+}