MRI

true

MRI

IMMEDIATE_P(v) は、いくつかの種類のオブジェクトであると紹介した。もっとも簡単なものは true であり、Qtrue というマクロで値を参照できる。実際には 0x14 == 0b0001_0100 という値になる(64bit CPU の場合)。 #define RB_IMMEDIATE_P(x) ((VALUE)(x) …

RB_TEST_P(x)

MRI

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

MRI

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 実装

MRI

さて、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

MRI

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 について…

VALUE: special const

MRI

Ruby から見えるすべてはオブジェクトである、という言説がある。実際、数値など 1 + 2 は 1.+(2) といったように、オブジェクトとメソッドの組み合わせで表現される。 オブジェクトをどのように表現するかは、処理系のデザインとしては難しい問題だ。一番ナ…

VALUE という型

MRI

(早速一日さぼってしまった) MRI のソースコードでは至る所に出てくる VALUE という型が、Ruby のオブジェクトを表している。 https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L94 この辺で定義しているが、やりたいことは、ポインタ型の…

ar_table の話(もっと良い提案を募集します)

MRI

Hash なのに Hash 値を使わない O(n) な Hash table いきなり色々すっ飛ばして、hash.c に定義してある ar_table の話をする。 話の前提は Ruby 2.6 の改善を自慢したい - クックパッド開発者ブログ にまとめた transient heap。この話は今後、ここでもちゃ…

対象とする CPU アーキテクチャ

MRI

MRI が対象とする CPU アーキテクチャは、32bit および 64bit CPU。命令セットは、一応だいたい動くような気がするけど、レジスタウィンドウとか、IA64 のなんとか、というのが特殊な対応が入る奴がいる。今は Intel x64 が多いんじゃないかな。AWS で動かす…

データ構造が定義してあるソースコード

MRI

Ruby のデータ構造の定義は、いろいろなところに偏在している。 主には次の三カ所。 include/ruby/ruby.h (インストールされる) internal.h(インストールされない) vm_core.h(インストールされない) (なお、他にも本当はいろいろある) 歴史的には、r…