IMMEDIATE_P
IMMEDIATE_P
の実装を確認する。
https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L400
#define RB_IMMEDIATE_P(x) ((VALUE)(x) & RUBY_IMMEDIATE_MASK) #define IMMEDIATE_P(x) RB_IMMEDIATE_P(x)
RUBY_IMMEDIATE_MASK
も確認する(64bit の場合)。
https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L442
RUBY_IMMEDIATE_MASK = 0x07,
と定義してある。つまり、0b0111 、x
の下位3ビットをとってきて & を取った結果、0 でなければ IMMEDIATE である、という意味になる。
これは、ポインタ値かどうかのチェックということもできる。下位 3 bit が 0 でなければ、ポインタの恐れがあると判断できる。