diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-10-19 18:45:26 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-10-19 22:55:42 +0900 |
commit | 412e3c7a8db275567eaceece6c48dde3aedf2ae6 (patch) | |
tree | c67ba76d040fb1b7a312165b99f5b95300d797b5 | |
parent | 86096a91d55f72620e0f8ca8634da5fa342dc35b (diff) |
Assert for RTEST that Qnil and Qfalse differ just 1 bit
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6589
-rw-r--r-- | include/ruby/internal/special_consts.h | 9 | ||||
-rw-r--r-- | ruby.c | 3 |
2 files changed, 12 insertions, 0 deletions
diff --git a/include/ruby/internal/special_consts.h b/include/ruby/internal/special_consts.h index 38934e4da3..70276278eb 100644 --- a/include/ruby/internal/special_consts.h +++ b/include/ruby/internal/special_consts.h @@ -136,6 +136,7 @@ static inline bool RB_TEST(VALUE obj) { /* + * if USE_FLONUM * Qfalse: ....0000 0000 * Qnil: ....0000 1000 * ~Qnil: ....1111 0111 @@ -143,6 +144,14 @@ RB_TEST(VALUE obj) * ---------------------------- * RTEST(v) ....xxxx 0xxx * + * if ! USE_FLONUM + * Qfalse: ....0000 0000 + * Qnil: ....0000 0100 + * ~Qnil: ....1111 1011 + * v ....xxxx xxxx + * ---------------------------- + * RTEST(v) ....xxxx x0xx + * * RTEST(v) can be 0 if and only if (v == Qfalse || v == Qnil). */ return obj & ~RUBY_Qnil; @@ -62,6 +62,9 @@ #include "ruby/version.h" #include "ruby/internal/error.h" +#define singlebit_only_p(x) !((x) & ((x)-1)) +STATIC_ASSERT(Qnil_1bit_from_Qfalse, singlebit_only_p(Qnil^Qfalse)); + #ifndef MAXPATHLEN # define MAXPATHLEN 1024 #endif |