静的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_1111x と & した結果が RUBY_SYMBOL_FLAG であるか調べている。まとめると、下位 8 bit が RUBY_SYMBOL_FLAG と一致するかを調べている。

上位 54 bit は ID を示す。では、ID とは何か。MRI が内部で利用する、文字と一対一対応する数値のことである。