MRI
IMMEDIATE_P(v) は、いくつかの種類のオブジェクトであると紹介した。もっとも簡単なものは true であり、Qtrue というマクロで値を参照できる。実際には 0x14 == 0b0001_0100 という値になる(64bit CPU の場合)。 #define RB_IMMEDIATE_P(x) ((VALUE)(x) …
https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L478 #define RB_TEST(v) !(((VALUE)(v) & (VALUE)~RUBY_Qnil) == 0) #define RB_NIL_P(v) !((VALUE)(v) != RUBY_Qnil) #define RTEST(v) RB_TEST(v) #define NIL_P(v) RB_NIL_P(v) RB_TEST…
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 …
さて、SPECIAL_CONST_P の実装の話。 #define RB_SPECIAL_CONST_P(x) (RB_IMMEDIATE_P(x) || !RB_TEST(x)) #define SPECIAL_CONST_P(x) RB_SPECIAL_CONST_P(x) この条件で、メモリへのポインタか、そうでないかを分けることができる、といっている。どうやる…
SPECIAL_CONST_P の実装を見てみる。 https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L1297 #define RB_SPECIAL_CONST_P(x) (RB_IMMEDIATE_P(x) || !RB_TEST(x)) #define SPECIAL_CONST_P(x) RB_SPECIAL_CONST_P(x) どうやら、x について…
Ruby から見えるすべてはオブジェクトである、という言説がある。実際、数値など 1 + 2 は 1.+(2) といったように、オブジェクトとメソッドの組み合わせで表現される。 オブジェクトをどのように表現するかは、処理系のデザインとしては難しい問題だ。一番ナ…
(早速一日さぼってしまった) MRI のソースコードでは至る所に出てくる VALUE という型が、Ruby のオブジェクトを表している。 https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L94 この辺で定義しているが、やりたいことは、ポインタ型の…
Hash なのに Hash 値を使わない O(n) な Hash table いきなり色々すっ飛ばして、hash.c に定義してある ar_table の話をする。 話の前提は Ruby 2.6 の改善を自慢したい - クックパッド開発者ブログ にまとめた transient heap。この話は今後、ここでもちゃ…
MRI が対象とする CPU アーキテクチャは、32bit および 64bit CPU。命令セットは、一応だいたい動くような気がするけど、レジスタウィンドウとか、IA64 のなんとか、というのが特殊な対応が入る奴がいる。今は Intel x64 が多いんじゃないかな。AWS で動かす…
Ruby のデータ構造の定義は、いろいろなところに偏在している。 主には次の三カ所。 include/ruby/ruby.h (インストールされる) internal.h(インストールされない) vm_core.h(インストールされない) (なお、他にも本当はいろいろある) 歴史的には、r…