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; diff --git a/ruby.c b/ruby.c index 0a3248f95f..03aeb9b75b 100644 --- a/ruby.c +++ b/ruby.c @@ -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