1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Assert for RTEST that Qnil and Qfalse differ just 1 bit

This commit is contained in:
Nobuyoshi Nakada 2022-10-19 18:45:26 +09:00
parent 86096a91d5
commit 412e3c7a8d
Notes: git 2022-10-19 13:56:02 +00:00
2 changed files with 12 additions and 0 deletions

View file

@ -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;

3
ruby.c
View file

@ -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