summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authordearblue <[email protected]>2021-10-24 23:11:52 +0900
committerdearblue <[email protected]>2021-10-24 23:11:52 +0900
commitb774832ee1a97c44cabbbaac004a3b784ed02a83 (patch)
tree28e1cf6551e42b933d6a2fbeff1dce4970106e34
parent7850549a5edf2952056234203d2c72cf264f08eb (diff)
downloadmruby-b774832ee1a97c44cabbbaac004a3b784ed02a83.tar.gz
mruby-b774832ee1a97c44cabbbaac004a3b784ed02a83.zip
Make `mrb_static_assert()` a variable argument
`mrb_static_assert()` extends the macro function to take one or two arguments. If the argument is other than that, an error will occur. References: - static_assert のメッセージ省略を許可 - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/lang/cpp17/extending_static_assert.html - c - Overloading Macro on Number of Arguments - Stack Overflow https://stackoverflow.com/a/11763277
-rw-r--r--include/mruby.h28
-rw-r--r--include/mruby/boxing_nan.h2
-rw-r--r--include/mruby/boxing_word.h2
-rw-r--r--mrbgems/mruby-random/src/random.c2
-rw-r--r--src/gc.c2
-rw-r--r--src/hash.c6
-rw-r--r--src/load.c2
7 files changed, 31 insertions, 13 deletions
diff --git a/include/mruby.h b/include/mruby.h
index f80971543..99cd5fa2f 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -69,14 +69,18 @@
#define mrb_assert_int_fit(t1,n,t2,max) ((void)0)
#endif
-#if (defined __cplusplus && __cplusplus >= 201103L) || \
+#if (defined __cplusplus && __cplusplus >= 201703L)
+# define mrb_static_assert(...) static_assert(__VA_ARGS__)
+# define mrb_static_assert1(exp) static_assert(exp)
+# define mrb_static_assert2(exp, str) static_assert(exp, str)
+#elif (defined __cplusplus && __cplusplus >= 201103L) || \
(defined _MSC_VER) || \
(defined __GXX_EXPERIMENTAL_CXX0X__) /* for old G++/Clang++ */
-# define mrb_static_assert(exp, str) static_assert(exp, str)
+# define mrb_static_assert2(exp, str) static_assert(exp, str)
#elif defined __STDC_VERSION__ && \
((__STDC_VERSION__ >= 201112L) || \
(defined __GNUC__ && __GNUC__ * 100 + __GNUC_MINOR__ >= 406))
-# define mrb_static_assert(exp, str) _Static_assert(exp, str)
+# define mrb_static_assert2(exp, str) _Static_assert(exp, str)
#else
# /* alternative implementation of static_assert() */
# define _mrb_static_assert_cat0(a, b) a##b
@@ -86,10 +90,24 @@
# else
# define _mrb_static_assert_id(prefix) _mrb_static_assert_cat(prefix, __LINE__)
# endif
-# define mrb_static_assert(exp, str) \
+# define mrb_static_assert2(exp, str) \
struct _mrb_static_assert_id(_mrb_static_assert_) { char x[(exp) ? 1 : -1]; }
#endif
-#define mrb_static_assert1(exp) mrb_static_assert(exp, #exp)
+
+#ifndef mrb_static_assert
+# define mrb_static_assert1(exp) mrb_static_assert2(exp, #exp)
+# define mrb_static_assert_expand(...) __VA_ARGS__ /* for MSVC behaviour - https://stackoverflow.com/q/5530505 */
+# define mrb_static_assert_selector(a, b, name, ...) name
+/**
+ * The `mrb_static_assert()` macro function takes one or two arguments.
+ *
+ * !!!c
+ * mrb_static_assert(expect_condition);
+ * mrb_static_assert(expect_condition, error_message);
+ */
+# define mrb_static_assert(...) \
+ mrb_static_assert_expand(mrb_static_assert_selector(__VA_ARGS__, mrb_static_assert2, mrb_static_assert1)(__VA_ARGS__))
+#endif
#include "mrbconf.h"
diff --git a/include/mruby/boxing_nan.h b/include/mruby/boxing_nan.h
index cbf7953ed..c4700f28a 100644
--- a/include/mruby/boxing_nan.h
+++ b/include/mruby/boxing_nan.h
@@ -54,7 +54,7 @@ union mrb_value_ {
mrb_value value;
};
-mrb_static_assert1(sizeof(mrb_value) == sizeof(union mrb_value_));
+mrb_static_assert(sizeof(mrb_value) == sizeof(union mrb_value_));
static inline union mrb_value_
mrb_val_union(mrb_value v)
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h
index 89c6f6f2d..0a3db4fc2 100644
--- a/include/mruby/boxing_word.h
+++ b/include/mruby/boxing_word.h
@@ -130,7 +130,7 @@ union mrb_value_ {
mrb_value value;
};
-mrb_static_assert1(sizeof(mrb_value) == sizeof(union mrb_value_));
+mrb_static_assert(sizeof(mrb_value) == sizeof(union mrb_value_));
static inline union mrb_value_
mrb_val_union(mrb_value v)
diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c
index 027e7ce0b..0728e6bf2 100644
--- a/mrbgems/mruby-random/src/random.c
+++ b/mrbgems/mruby-random/src/random.c
@@ -355,7 +355,7 @@ void mrb_mruby_random_gem_init(mrb_state *mrb)
struct RClass *random;
struct RClass *array = mrb->array_class;
- mrb_static_assert1(sizeof(rand_state) <= ISTRUCT_DATA_SIZE);
+ mrb_static_assert(sizeof(rand_state) <= ISTRUCT_DATA_SIZE);
mrb_define_method(mrb, mrb->kernel_module, "rand", random_f_rand, MRB_ARGS_OPT(1));
mrb_define_method(mrb, mrb->kernel_module, "srand", random_f_srand, MRB_ARGS_OPT(1));
diff --git a/src/gc.c b/src/gc.c
index fce2c3150..a6ff0c588 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -200,7 +200,7 @@ gettimeofday_time(void)
#define GC_RED MRB_GC_RED
#define GC_WHITES (GC_WHITE_A | GC_WHITE_B)
#define GC_COLOR_MASK 7
-mrb_static_assert1(MRB_GC_RED <= GC_COLOR_MASK);
+mrb_static_assert(MRB_GC_RED <= GC_COLOR_MASK);
#define paint_gray(o) ((o)->color = GC_GRAY)
#define paint_black(o) ((o)->color = GC_BLACK)
diff --git a/src/hash.c b/src/hash.c
index a12e45bd7..c0d3d712f 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -69,8 +69,8 @@
#define AR_MAX_SIZE 16
#define H_MAX_SIZE EA_MAX_CAPA
-mrb_static_assert1(offsetof(struct RHash, iv) == offsetof(struct RObject, iv));
-mrb_static_assert1(AR_MAX_SIZE < (1 << MRB_HASH_AR_EA_CAPA_BIT));
+mrb_static_assert(offsetof(struct RHash, iv) == offsetof(struct RObject, iv));
+mrb_static_assert(AR_MAX_SIZE < (1 << MRB_HASH_AR_EA_CAPA_BIT));
typedef struct hash_entry {
mrb_value key;
@@ -243,7 +243,7 @@ DEFINE_SWITCHER(ht, HT)
* assumptions.
*/
# define HT_ASSERT_SAFE_READ(attr_name) \
- mrb_static_assert1( \
+ mrb_static_assert( \
offsetof(hash_table, attr_name) + sizeof(((hash_table*)0)->attr_name) <= \
sizeof(hash_entry))
HT_ASSERT_SAFE_READ(ea);
diff --git a/src/load.c b/src/load.c
index 256dd58fd..2d1ec507e 100644
--- a/src/load.c
+++ b/src/load.c
@@ -98,7 +98,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
if (irep->ilen > 0) {
size_t data_len = sizeof(mrb_code) * irep->ilen +
sizeof(struct mrb_irep_catch_handler) * irep->clen;
- mrb_static_assert1(sizeof(struct mrb_irep_catch_handler) == 13);
+ mrb_static_assert(sizeof(struct mrb_irep_catch_handler) == 13);
if (SIZE_ERROR_MUL(irep->ilen, sizeof(mrb_code))) {
return FALSE;
}