静的SymbolとID
静的 Symbol の話。基本的には、ID に tag bits を含ませて VALUE にする。
#define RB_STATIC_SYM_P(x) (((VALUE)(x)&~((~(VALUE)0)<<RUBY_SPECIAL_SHIFT)) == RUBY_SYMBOL_FLAG)
RB_STATIC_SYM_P(x)
は、静的 Symbol であれば真になる。
ちょっと複雑なので解説しておくと、0b111... を RUBY_SPECIAL_SHIFT
だけシフトするので、0b111...111_0000_0000
ができる(下位 8 bit が 0)。これの否定なので、0b000...000_1111_1111
を x
と & した結果が RUBY_SYMBOL_FLAG
であるか調べている。まとめると、下位 8 bit が RUBY_SYMBOL_FLAG
と一致するかを調べている。
上位 54 bit は ID を示す。では、ID とは何か。MRI が内部で利用する、文字と一対一対応する数値のことである。