mruby gc.c のis_deadとは何でしょうか

#define is_dead(s, o) (((o)->color & other_white_part(s) & MRB_GC_WHITES) || (o)->tt == MRB_TT_FREE)

 object.hで定義されています。

まずはother_white_partが何かを見てみましょう。

#define other_white_part(s) ((s)->current_white_part ^ MRB_GC_WHITES)

 current_white_part にMRB_GC_WHITESのnotをしています。

ここでMRB_GC_WHITESは0b11なので

もしcurrent_white_partが0b10なら0b01、0b01なら0b10とビットが反転します。

つまりcurrent_white_partの反対がother_white_partになるわけです。

ではis_deadを解析していきましょう。

is_deadはo->colorとother_white_partが互い違いの時0になります。

0b10 & 0b01 & 0b11 = 0だからです。

とするとo->colorとother_white_partが同じ時trueになるということです。

つまりo->colorとother_white_partが同じ時死んだobjectとみなされるということです。