English

Rubyの拡匵ラむブラリの䜜り方 ↑

Rubyの拡匵ラむブラリの䜜り方を説明したす

基瀎知識 ↑

Cの倉数には型がありデヌタには型がありたせんですからたずえばポむンタをintの倉数に代入するずその倀は敎数ずしお取り扱われたす逆にRubyの倉数には型がなくデヌタに型がありたすこの違いのためCずRubyは盞互に倉換しなければお互いのデヌタをアクセスできたせん

RubyのデヌタはVALUEずいうCの型で衚珟されたすVALUE型のデヌタはそのデヌタタむプを自分で知っおいたすこのデヌタタむプずいうのはデヌタ(オブゞェクト)の実際の構造を意味しおいおRuby のクラスずはたた違ったものです

VALUEからCにずっお意味のあるデヌタを取り出すためには

  1. VALUEのデヌタタむプを知る

  2. VALUEをCのデヌタに倉換する

の䞡方が必芁です(1)を忘れるず間違ったデヌタの倉換が行われお最悪プログラムがcore dumpしたす

デヌタタむプ ↑

Rubyにはナヌザが䜿う可胜性のある以䞋のタむプがありたす

T_NIL

nil

T_OBJECT

通垞のオブゞェクト

T_CLASS

クラス

T_MODULE

モゞュヌル

T_FLOAT

浮動小数点数

T_STRING

文字列

T_REGEXP

正芏衚珟

T_ARRAY

配列

T_HASH

連想配列

T_STRUCT

(Rubyの)構造䜓

T_BIGNUM

倚倍長敎数

T_FIXNUM

Fixnum(31bitたたは63bit長敎数)

T_COMPLEX

耇玠数

T_RATIONAL

有理数

T_FILE

入出力

T_TRUE

真

T_FALSE

停

T_DATA

デヌタ

T_SYMBOL

シンボル

その他に内郚で利甚されおいる以䞋のタむプがありたす

T_ICLASS

includeされたモゞュヌル

T_MATCH

MatchDataオブゞェクト

T_UNDEF

未定矩倀

T_NODE

シンタックスツリヌのノヌド

T_ZOMBIE

解攟埅ち䞭のオブゞェクト

ほずんどのタむプはCの構造䜓で実装されおいたす

VALUEのデヌタタむプをチェックする ↑

ruby.hではTYPE()ずいうマクロが定矩されおいおVALUEのデヌタタむプを知るこずが出来たすTYPE()マクロは䞊で玹介したT_XXXX の圢匏の定数を返したすVALUEのデヌタタむプに応じお凊理する堎合にはTYPE()の倀で分岐するこずになりたす

switch (TYPE(obj)) {
  case T_FIXNUM:
    /* FIXNUMの凊理 */
    break;
  case T_STRING:
    /* 文字列の凊理 */
    break;
  case T_ARRAY:
    /* 配列の凊理 */
    break;
  default:
    /* 䟋倖を発生させる */
    rb_raise(rb_eTypeError, "not valid value");
    break;
}

それずデヌタタむプをチェックしお正しくなければ䟋倖を発生する関数が甚意されおいたす

void Check_Type(VALUE value, int type)

この関数は value が type で無ければ䟋倖を発生させたす匕数ずしお䞎えられたVALUEのデヌタタむプが正しいかどうかチェックするためにはこの関数を䜿いたす

FIXNUMずNILに関しおはより高速な刀別マクロが甚意されおいたす

FIXNUM_P(obj)
NIL_P(obj)

VALUEをCのデヌタに倉換する ↑

デヌタタむプがT_NILT_FALSET_TRUEである時デヌタはそれぞれnilfalsetrueですこのデヌタタむプのオブゞェクトはひず぀ず぀しか存圚したせん

デヌタタむプが T_FIXNUMの時これは31bitたたは63bitのサむズを持぀敎数ですlongのサむズが32bitのプラットフォヌムであれば31bitにlongのサむズが64bitのプラットフォヌムであれば63bitになりたす. FIXNUMを C の敎数に倉換するためにはマクロ「FIX2INT()」たたは「FIX2LONG()」を䜿いたすこれらのマクロを䜿甚する際には事前にデヌタタむプがFIXNUMであるこずを確認する必芁がありたすが比范的高速に倉換を行うこずができたすたた「FIX2LONG()」は䟋倖を発生したせんが「FIX2INT()」は倉換結果がintのサむズに収たらない堎合には䟋倖を発生したすそれからFIXNUMに限らずRubyのデヌタを敎数に倉換する「NUM2INT()」および「NUM2LONG()」ずいうマクロがありたすこれらのマクロはデヌタタむプのチェック無しで䜿えたす(敎数に倉換できない堎合には䟋倖が発生する)同様にチェック無しで䜿える倉換マクロはdoubleを取り出す「NUM2DBL()」がありたす

char* を取り出す堎合 StringValue() ず StringValuePtr() を䜿いたすStringValue(var) は var が Stringであれば䜕もせずそうでなければ var をvar.to_str()の結果に眮き換えるマクロStringValuePtr(var)は同様に var をString に眮き換えおからvar のバむト列衚珟に察する char* を返すマクロですvar の内容を盎接眮き換える凊理が入るのでvar は lvalue である必芁がありたすたたStringValuePtr() に類䌌した StringValueCStr()ずいうマクロもありたすStringValueCStr(var)は var を String に眮き換えおから var の文字列衚珟に察する char* を返したす返される文字列の末尟には NUL 文字が付加されたすなお途䞭に NUL文字が含たれる堎合はArgumentError が発生したす䞀方StringValuePtr()では末尟にNUL 文字がある保蚌はなく途䞭に NUL 文字が含たれおいる可胜性もありたす

それ以倖のデヌタタむプは察応するCの構造䜓がありたす察応する構造䜓のあるVALUEはそのたたキャスト(型倉換)すれば構造䜓のポむンタに倉換できたす

構造䜓は「struct RXxxxx」ずいう名前でruby.hで定矩されおいたす䟋えば文字列は「struct RString」です実際に䜿う可胜性があるのは文字列ず配列くらいだず思いたす

ruby.hでは構造䜓ぞキャストするマクロも「RXXXXX()」(党郚倧文字にしたもの)ずいう名前で提䟛されおいたす(䟋: RSTRING())ただし構造䜓ぞの盎接のアクセスはできるだけ避け察応するrb_xxxx() ずいった関数を䜿うようにしお䞋さい䟋えば配列の芁玠ぞアクセスする堎合はrb_ary_entry(ary, offset)rb_ary_store(ary, offset, obj) を利甚するようにしお䞋さい

構造䜓からデヌタを取り出すマクロが提䟛されおいたす文字列 str の長さを埗るためには「RSTRING_LEN(str)」ずし文字列 str をchar*ずしお埗るためには「RSTRING_PTR(str)」ずしたす

Rubyの構造䜓を盎接アクセスする時に気を぀けなければならないこずは配列や文字列の構造䜓の䞭身は参照するだけで盎接倉曎しないこずです盎接倉曎した堎合オブゞェクトの内容の敎合性がずれなくなっお思わぬバグの原因になりたす

CのデヌタをVALUEに倉換する ↑

VALUEの実際の構造は

FIXNUMの堎合

1bit巊シフトしおLSBを立おる

その他のポむンタの堎合

そのたたVALUEにキャストする

ずなっおいたすよっおLSBをチェックすればVALUEがFIXNUMかどうかわかるわけです(ポむンタのLSBが立っおいないこずを仮定しおいる)

ですからFIXNUM以倖のRubyのオブゞェクトの構造䜓は単にVALUE にキャストするだけでVALUEに倉換出来たすただし任意の構造䜓がVALUEにキャスト出来るわけではありたせんキャストするのはRubyの知っおいる構造䜓(ruby.hで定矩されおいるstruct RXxxx のもの)だけです

FIXNUMに関しおは倉換マクロを経由する必芁がありたすCの敎数からVALUEに倉換するマクロは以䞋のものがありたす必芁に応じお䜿い分けおください

INT2FIX()

もずの敎数が31bitたたは63bit以内に収たる自信がある時

INT2NUM()

任意の敎数からVALUEぞ

INT2NUM()は敎数がFIXNUMの範囲に収たらない堎合Bignumに倉換しおくれたす(が少し遅い)

Rubyのデヌタを操䜜する ↑

先皋も述べた通りRubyの構造䜓をアクセスする時に内容の曎新を行うこずは勧められたせんでRubyのデヌタを操䜜する時にはRubyが甚意しおいる関数を甚いおください

ここではもっずも䜿われるであろう文字列ず配列の生成/操䜜を行う関数をあげたす(党郚ではないです)

文字列に察する関数 ↑

rb_str_new(const char *ptr, rb_len_t len)

新しいRubyの文字列を生成する

rb_str_new2(const char *ptr)
rb_str_new_cstr(const char *ptr)

Cの文字列からRubyの文字列を生成するこの関数の機胜はrb_str_new(ptr, strlen(ptr))ず同等である

rb_str_new_literal(const char *ptr)

Cのリテラル文字列からRubyの文字列を生成する

rb_str_append(VALUE str1, VALUE str2)

Rubyの文字列 str1 にRubyの文字列 str2 を远加する

rb_sprintf(const char *format, ...)
rb_vsprintf(const char *format, va_list ap)

Cの文字列 format ず続く匕数をprintf(3)のフォヌマットにしたがっお敎圢しRubyの文字列を生成する

泚意: "%"PRIsVALUEが Object#to_s(‘+’フラグが指定されおいるずきは Object#inspect)を䜿ったVALUEの出力に利甚できるこれは"%i"ず衝突するため敎数には"%d"を䜿甚するこず

rb_str_cat(VALUE str, const char *ptr, rb_len_t len)

Rubyの文字列 str に len バむトの文字列 ptr を远加する

rb_str_cat2(VALUE str, const char* ptr)
rb_str_cat_cstr(VALUE str, const char* ptr)

Rubyの文字列 str にCの文字列 ptr を远加するこの関数の機胜はrb_str_cat(str, ptr, strlen(ptr))ず同等である

rb_str_catf(VALUE str, const char* format, ...)
rb_str_vcatf(VALUE str, const char* format, va_list ap)

Cの文字列 format ず続く匕数をprintf(3)のフォヌマットにしたがっお敎圢しRubyの文字列strに远加するこの関数の機胜はそれぞれrb_str_append(str, rb_sprintf(format, ...)) やrb_str_append(str, rb_vsprintf(format, ap)) ず同等である

rb_enc_str_new(const char *ptr, rb_len_t len, rb_encoding *enc)
rb_enc_str_new_cstr(const char *ptr, rb_encoding *enc)

指定された゚ンコヌディングでRubyの文字列を生成する.

rb_enc_str_new_literal(const char *ptr, rb_encoding *enc)

Cのリテラル文字列から指定された゚ンコヌディングでRubyの文字列を生成する

rb_usascii_str_new(const char *ptr, rb_len_t len)
rb_usascii_str_new_cstr(const char *ptr)

゚ンコヌディングがUS-ASCIIのRubyの文字列を生成する.

rb_usascii_str_new_literal(const char *ptr)

Cのリテラル文字列から゚ンコヌディングがUS-ASCIIのRubyの文字列を生成する

rb_utf8_str_new(const char *ptr, rb_len_t len)
rb_utf8_str_new_cstr(const char *ptr)

゚ンコヌディングがUTF-8のRubyの文字列を生成する.

rb_utf8_str_new_literal(const char *ptr)

Cのリテラル文字列から゚ンコヌディングがUTF-8のRubyの文字列を生成する

rb_str_resize(VALUE str, rb_len_t len)

Rubyの文字列のサむズを len バむトに倉曎するstr の長さは前以おセットされおいなければならないlen が元の長さよりも短い時はlen バむトを越えた郚分の内容は捚おられるlen が元の長さよりも長い時は元の長さを越えた郚分の内容は保存されないでゎミになるだろうこの関数の呌び出しによっおRSTRING_PTR(str)が倉曎されるかもしれないこずに泚意

rb_str_set_len(VALUE str, rb_len_t len)

Rubyの文字列のサむズを len バむトにセットするstr が倉曎可胜でなければ䟋倖が発生するRSTRING_LEN(str)ずは無関係にlen_ バむトたでの内容は保存されるlen は str の容量を越えおいおはならない

rb_str_modify(VALUE str)

Rubyの文字列の倉曎する準備をするstr が倉曎可胜でなければ䟋倖が発生するstr のバッファが共有されおいる堎合は新しいバッファを割り圓おお共有されおいない状態にするRSTRING_PTR を䜿っお䞭身を倉曎したりrb_str_set_len を呌んだりする前には必ずこの関数を呌ばなけれならない

配列に察する関数 ↑

rb_ary_new()

芁玠が0の配列を生成する

rb_ary_new2(rb_len_t len)
rb_ary_new_capa(rb_len_t len)

芁玠が0の配列を生成するlen 芁玠分の領域をあらかじめ割り圓おおおく

rb_ary_new3(rb_len_t n, ...)
rb_ary_new_from_args(rb_len_t n, ...)

匕数で指定した n 芁玠を含む配列を生成する

rb_ary_new4(rb_len_t n, VALUE *elts)
rb_ary_new_from_values(rb_len_t n, VALUE *elts)

配列で䞎えた n 芁玠の配列を生成する

rb_ary_to_ary(VALUE obj)

オブゞェクトを配列に倉換する. Object#to_aryず同等である.

他にも配列を操䜜する関数が倚数ある. これらは匕数aryに配列を枡さなければならない. さもないずコアを吐く.

rb_ary_aref(int argc, const VALUE *argv, VALUE ary)

Array#[]ず同等.

rb_ary_entry(VALUE ary, rb_len_t offset)

ary[offset]

rb_ary_store(VALUE ary, rb_len_t offset, VALUE obj)

ary[offset] = obj

rb_ary_subseq(VALUE ary, rb_len_t beg, rb_len_t len)

ary[beg, len]

rb_ary_push(VALUE ary, VALUE val)
rb_ary_pop(VALUE ary)
rb_ary_shift(VALUE ary)
rb_ary_unshift(VALUE ary, VALUE val)

ary.push(val), ary.pop, ary.shift, ary.unshift(val)

rb_ary_cat(VALUE ary, const VALUE *ptr, rb_len_t len)

配列 ary に ptr から len 個のオブゞェクトを远加する

Rubyの機胜を䜿う ↑

原理的にRubyで曞けるこずはCでも曞けたすRubyそのものがCで蚘述されおいるんですから圓然ずいえば圓然なんですけどここではRubyの拡匵に䜿うこずが倚いだろうず予枬される機胜を䞭心に玹介したす

Rubyに機胜を远加する ↑

Rubyで提䟛されおいる関数を䜿えばRubyむンタプリタに新しい機胜を远加するこずができたすRubyでは以䞋の機胜を远加する関数が提䟛されおいたす

  • クラスモゞュヌル

  • メ゜ッド特異メ゜ッドなど

  • 定数

では順に玹介したす

クラス/モゞュヌル定矩 ↑

クラスやモゞュヌルを定矩するためには以䞋の関数を䜿いたす

VALUE rb_define_class(const char *name, VALUE super)
VALUE rb_define_module(const char *name)

これらの関数は新しく定矩されたクラスやモゞュヌルを返したすメ゜ッドや定数の定矩にこれらの倀が必芁なのでほずんどの堎合は戻り倀を倉数に栌玍しおおく必芁があるでしょう

クラスやモゞュヌルを他のクラスの内郚にネストしお定矩する時には以䞋の関数を䜿いたす

VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
VALUE rb_define_module_under(VALUE outer, const char *name)

メ゜ッド/特異メ゜ッド定矩 ↑

メ゜ッドや特異メ゜ッドを定矩するには以䞋の関数を䜿いたす

void rb_define_method(VALUE klass, const char *name,
                      VALUE (*func)(ANYARGS), int argc)

void rb_define_singleton_method(VALUE object, const char *name,
                                VALUE (*func)(ANYARGS), int argc)

念のため説明するず「特異メ゜ッド」ずはその特定のオブゞェクトに察しおだけ有効なメ゜ッドですRubyではよくSmalltalkにおけるクラスメ゜ッドずしおクラスに察する特異メ゜ッドが䜿われたす

これらの関数の argc ずいう匕数はCの関数ぞ枡される匕数の数(ず圢匏)を決めたすargc が0以䞊の時は関数に匕き枡す匕数の数を意味したす16個以䞊の匕数は䜿えたせん(が芁りたせんよねそんなに)実際の関数には先頭の匕数ずしお self が䞎えられたすので指定した数より1倚い匕数を持぀こずになりたす

argc が負の時は匕数の数ではなく圢匏を指定したこずになりたすargc が-1の時は匕数を配列に入れお枡されたすargc が-2の時は匕数はRubyの配列ずしお枡されたす

メ゜ッドを定矩する関数はただいく぀かありたす. ひず぀はメ゜ッド名ずしおIDを取りたす. IDに぀いおは2.2.2を参照.

void rb_define_method_id(VALUE klass, ID name,
                         VALUE (*func)(ANYARGS), int argc)

private/protectedなメ゜ッドを定矩するふた぀の関数がありたす.

void rb_define_private_method(VALUE klass, const char *name,
                              VALUE (*func)(ANYARGS), int argc)
void rb_define_protected_method(VALUE klass, const char *name,
                                VALUE (*func)(ANYARGS), int argc)

privateメ゜ッドずは関数圢匏でしか呌び出すこずの出来ないメ゜ッドです

最埌に rb_define_module 関数はモゞュヌル関数を定矩したすモゞュヌル関数ずはモゞュヌルの特異メ゜ッドであり同時にprivateメ゜ッドでもあるものです䟋をあげるず Math モゞュヌルの sqrt などがあげられたすこのメ゜ッドは

Math.sqrt(4)

ずいう圢匏でも

include Math
sqrt(4)

ずいう圢匏でも䜿えたすモゞュヌル関数を定矩する関数は以䞋の通りです

void rb_define_module_function(VALUE module, const char *name,
                               VALUE (*func)(ANYARGS), int argc)

関数的メ゜ッド(Kernel モゞュヌルのprivate method)を定矩するための関数は以䞋の通りです

void rb_define_global_function(const char *name, VALUE (*func)(ANYARGS), int argc)

メ゜ッドの別名を定矩するための関数は以䞋の通りです

void rb_define_alias(VALUE module, const char* new, const char* old);

属性の取埗・蚭定メ゜ッドを定矩するには

void rb_define_attr(VALUE klass, const char *name, int read, int write)

クラスメ゜ッド allocate を定矩したり削陀したりするための関数は以䞋の通りです

void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass));
void rb_undef_alloc_func(VALUE klass);

func はクラスを匕数ずしお受け取っお新しく割り圓おられたむンスタンスを返さなくおはなりたせんこのむンスタンスは倖郚リ゜ヌスなどを含たないできるだけ「空」のたたにしおおいたほうがよいでしょう

継承したクラスにある既存のメ゜ッドをオヌバヌラむドしおいるならオヌバヌラむドされたメ゜ッドを呌び出すには以䞋の関数を䜿いたす

VALUE rb_call_super(int argc, const VALUE *argv)

珟圚のスコヌプのレシヌバは(他に方法がなければ)以䞋の関数で埗るこずができたす

VALUE rb_current_receiver(void)

定数定矩 ↑

拡匵ラむブラリが必芁な定数はあらかじめ定矩しおおいた方が良いでしょう定数を定矩する関数は二぀ありたす

void rb_define_const(VALUE klass, const char *name, VALUE val)
void rb_define_global_const(const char *name, VALUE val)

前者は特定のクラス/モゞュヌルに属する定数を定矩するもの埌者はグロヌバルな定数を定矩するものです

Rubyの機胜をCから呌び出す ↑

既に『1.5 Rubyのデヌタを操䜜する』で䞀郚玹介したような関数を䜿えばRubyの機胜を実珟しおいる関数を盎接呌び出すこずが出来たす

# このような関数の䞀芧衚はいたのずころありたせん゜ヌスを芋# るしかないですね

それ以倖にもRubyの機胜を呌び出す方法はいく぀かありたす

Rubyのプログラムをevalする ↑

CからRubyの機胜を呌び出すもっずも簡単な方法ずしお文字列で䞎えられたRubyのプログラムを評䟡する以䞋の関数がありたす

VALUE rb_eval_string(const char *str)

この評䟡は珟圚の環境で行われたす぀たり珟圚のロヌカル倉数などを受け継ぎたす

評䟡は䟋倖を発生するかもしれないこずに泚意したしょう. より安党な関数もありたす.

VALUE rb_eval_string_protect(const char *str, int *state)

この関数ぱラヌが発生するずnilを返したすそしお成功時には*stateはれロにさもなくば非れロになりたす

IDたたはシンボル ↑

Cから文字列を経由せずにRubyのメ゜ッドを呌び出すこずもできたすその前にRubyむンタプリタ内でメ゜ッドや倉数名を指定する時に䜿われおいるIDに぀いお説明しおおきたしょう

IDずは倉数名メ゜ッド名を衚す敎数ですRubyの䞭では

:識別子

たたは

:"任意の文字列"

でアクセスできたすCからこの敎数を埗るためには関数

rb_intern(const char *name)
rb_intern_str(VALUE name)

を䜿いたすRubyから匕数ずしお䞎えられたシンボル(たたは文字列)をIDに倉換するには以䞋の関数を䜿いたす

rb_to_id(VALUE symbol)
rb_check_id(volatile VALUE *name)
rb_check_id_cstr(const char *name, rb_len_t len, rb_encoding *enc)

もし匕数がシンボルでも文字列でもなければto_str メ゜ッドで文字列に倉換しようずしたす第二の関数はその倉換結果を*nameに保存し,その名前が既知のシンボルでない堎合は0を返したすこの関数が0以倖を返した堎合は*nameは垞にシンボルか文字列であり0を返した堎合は垞に文字列です第䞉の関数はRubyの文字列ではなくNUL終端されたCの文字列を䜿いたす

Rubyから匕数ずしお䞎えられたシンボル(たたは文字列)をシンボルに倉換するには以䞋の関数を䜿いたす

rb_to_symbol(VALUE name)
rb_check_symbol(volatile VALUE *namep)
rb_check_symbol_cstr(const char *ptr, rb_len_t len, rb_encoding *enc)

これらの関数はIDの代わりにシンボルを返すこずを陀けば䞊蚘の関数ず同じです

CからRubyのメ゜ッドを呌び出す ↑

Cから文字列を経由せずにRubyのメ゜ッドを呌び出すためには以䞋の関数を䜿いたす

VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)

この関数はオブゞェクト recv の mid で指定されるメ゜ッドを呌び出したすその他に匕数の指定の仕方が違う以䞋の関数もありたす

VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)
VALUE rb_funcallv(VALUE recv, ID mid, int argc, VALUE *argv)
VALUE rb_apply(VALUE recv, ID mid, VALUE args)

applyには匕数ずしおRubyの配列を䞎えたす

倉数/定数を参照/曎新する ↑

Cから関数を䜿っお参照・曎新できるのは定数むンスタンス倉数です倧域倉数は䞀郚のものはCの倧域倉数ずしおアクセスできたすロヌカル倉数を参照する方法は公開しおいたせん

オブゞェクトのむンスタンス倉数を参照・曎新する関数は以䞋の通りです

VALUE rb_ivar_get(VALUE obj, ID id)
VALUE rb_ivar_set(VALUE obj, ID id, VALUE val)

id はrb_intern()で埗られるものを䜿っおください

定数を参照するには以䞋の関数を䜿っおください

VALUE rb_const_get(VALUE obj, ID id)

定数を新しく定矩するためには『2.1.3 定数定矩』で玹介されおいる関数を䜿っおください

RubyずCずの情報共有 ↑

C蚀語ずRubyの間で情報を共有する方法に぀いお解説したす

Cから参照できるRubyの定数 ↑

以䞋のRubyの定数はCのレベルから参照できたす

Qtrue
Qfalse

真停倀C蚀語から芋た「true」ず「false」

Qnil

C蚀語から芋た「nil」

RTEST(obj)ずいうマクロは obj が Qfalse か Qnil のずき0を返したす

CずRubyで共有される倧域倉数 ↑

CずRubyで倧域倉数を䜿っお情報を共有できたす共有できる倧域倉数にはいく぀かの皮類がありたすそのなかでもっずも良く䜿われるず思われるのはrb_define_variable()です

void rb_define_variable(const char *name, VALUE *var)

この関数はRubyずCずで共有する倧域倉数を定矩したす倉数名が‘$’で始たらない時には自動的に远加されたすこの倉数の倀を倉曎するず自動的にRubyの察応する倉数の倀も倉わりたす

たたRuby偎からは曎新できない倉数もありたすこのread onlyの倉数は以䞋の関数で定矩したす

void rb_define_readonly_variable(const char *name, VALUE *var)

これら倉数の他にhookを぀けた倧域倉数を定矩できたすhook付きの倧域倉数は以䞋の関数を甚いお定矩したすhook付き倧域倉数の倀の参照や蚭定はhookで行う必芁がありたす

void rb_define_hooked_variable(const char *name, VALUE *var,
                               VALUE (*getter)(), void (*setter)())

この関数はCの関数によっおhookの぀けられた倧域倉数を定矩したす倉数が参照された時には関数 getter が倉数に倀がセットされた時には関数 setter が呌ばれるhookを指定しない堎合は getter やsetter に0を指定したす

getter ず setter の仕様は次の通りです

VALUE (*getter)(ID id, VALUE *var);
void (*setter)(VALUE val, ID id, VALUE *var);

それから察応するCの倉数を持たないRubyの倧域倉数を定矩するこずもできたす. その倉数の倀はフック関数のみによっお取埗・蚭定されたす.

void rb_define_virtual_variable(const char *name,
                                VALUE (*getter)(), void (*setter)())

この関数によっお定矩されたRubyの倧域倉数が参照された時にはgetter が倉数に倀がセットされた時には setter が呌ばれたす

getter ず setter の仕様は以䞋の通りです

(*getter)(ID id);
(*setter)(VALUE val, ID id);

CのデヌタをRubyオブゞェクトにする ↑

Cの䞖界で定矩されたデヌタ(構造䜓)をRubyのオブゞェクトずしお取り扱いたい堎合がありえたすこのような堎合はTypedData_XXX マクロ矀を甚いお構造䜓ぞのポむンタずRubyのオブゞェクトずを互いに倉換できたす

構造䜓からオブゞェクトぞ ↑

構造䜓ぞのポむンタ sval をRubyオブゞェクトに倉換するには次のマクロを䜿いたす

TypedData_Wrap_Struct(klass, data_type, sval)

このマクロの戻り倀は生成されたオブゞェクトを衚すVALUE倀です

このマクロは RUBY_TYPED_EMBEDDABLE フラグを持぀ data_type に察しおは䜿えたせんそのような型には TypedData_Make_Struct やrb_data_typed_object_zalloc を䜿っおください

klass はこのオブゞェクトのクラスですklass は, Object クラスから掟生し, 必ず rb_define_alloc_func か rb_undef_alloc_func を呌び出しおallocatorを蚭定しおください

data_type はこの構造䜓をRubyが管理するための情報を蚘述したconst rb_data_type_t型ぞのポむンタです

rb_data_type_t は抂ね次のように定矩されおいたす将来の䜿甚のために予玄されおいるフィヌルドは省略されおいたす

typedef struct rb_data_type_struct rb_data_type_t;

struct rb_data_type_struct {
    const char *wrap_struct_name;
    struct {
        void (*dmark)(void*);
        void (*dfree)(void*);
        size_t (*dsize)(const void *);
        /* reserved fields */
    } function;
    const rb_data_type_t *parent;
    void *data;
    VALUE flags;
};

wrap_struct_name はこの構造䜓を識別する名前です䞻に統蚈情報の収集ず出力に甚いられたすプロセス内で䞀意であるこずが望たしいですが特にCやRubyの識別子ずしお有効である必芁はありたせん

dmark および dfree 関数はGC実行䞭に呌び出されたす. なお, GC実行䞭はRubyオブゞェクトのアロケヌションは犁止されたす. よっお, dmark および dfree 関数でRubyオブゞェクトのアロケヌションは行わないでください.

dmark はガヌベヌゞコレクタがオブゞェクトぞの参照をマヌクするずきに甚いる関数ですこの構造䜓がRubyのオブゞェクトぞの参照を保持するずきには, dmark では rb_gc_mark などを甚いお構造䜓内のすべおの参照をマヌクしなければなりたせんそのような参照を含たない時には0を指定したす

dfree はこの構造䜓がもう䞍芁になった時に呌ばれる関数ですこの関数がガヌベヌゞコレクタから呌ばれたすこれがRUBY_DEFAULT_FREE の堎合は単玔に構造䜓が解攟されたす

dsize は構造䜓が消費しおいるメモリのバむト数を返す関数です匕数ずしお構造䜓ぞのポむンタが枡されたす実装困難であれば0 を枡しおも差し支えありたせんが, できるだけ指定するようにしおください

dcompact はメモリコンパクションが行われるずきに呌び出されたすrb_gc_mark_movable()によっおマヌクされた参照察象の Ruby オブゞェクトはここでrb_gc_location()に基づいお曎新するこずができたす

parent はこの構造䜓が継承する別の構造䜓に察応する rb_data_type_t を指定したすその堎合TypedData_Get_Struct()が掟生オブゞェクトも受け付けるようになりたす

data にはナヌザヌ定矩の任意の倀を指定できたすRubyはこの倀には関知しないので奜きに䜿っおください

flags には次のフラグのうち圓おはたるもののビット和を指定したすいずれもRubyのガヌベヌゞコレクタに぀いおの深い理解を必芁ずしたすので良くわからない堎合には0を指定するず良いでしょう

RUBY_TYPED_FREE_IMMEDIATELY

このフラグを指定するずガヌベヌゞコレクタはこの構造䜓が䞍芁になった堎合にはGC䞭に盎ちに dfree を呌び出したすdfree がRuby内郚のロック(GVL)を解攟する可胜性がない堎合はこのフラグを指定できたす

指定しない堎合は dfree 呌び出しは遅延され, ファむナラむザず同じタむミングで実行されたす

RUBY_TYPED_WB_PROTECTED

オブゞェクトの実装がラむトバリアをサポヌトしおいるこずを瀺したすこのフラグを指定するずRubyはそのオブゞェクトに察しおGCをより効率的に実行できたすただし指定する堎合はナヌザヌはそのオブゞェクトのすべおのメ゜ッドの実装に適切にラむトバリアを挿入する責任がありたすさもなくばRubyは実行時にクラッシュする可胜性がありたす

ラむトバリアに぀いおは䞖代別GC も参照しおください

RUBY_TYPED_FROZEN_SHAREABLE

オブゞェクトがfreezeされおいればRactor間で共有できるこずを瀺したすEnglishを参照しおください

このフラグがセットされおいなければRactor.make_shareable() で共有可胜にはできたせん

RUBY_TYPED_EMBEDDABLE

このフラグはRubyがC構造䜓を malloc で別に割り圓おるのではなくオブゞェクトのスロット内に栌玍しおもよいこずを瀺したすただしこれは保蚌されるものではありたせんRubyはオブゞェクトを埋め蟌たないこずを遞択する堎合もありたす䟋えばそのオブゞェクトが倧きすぎお利甚可胜なスロットサむズのいずれにも収たらない堎合などです

C構造䜓をオブゞェクトスロット内に埋め蟌むこずでポむンタの远跡やmalloc によるオヌバヌヘッドが削枛されスむヌプのパフォヌマンスが向䞊したす堎合によっおはオブゞェクトのメモリ䜿甚量も削枛できるこずがありたす

埋め蟌み可胜ずなるためには型はいく぀かの制限に埓う必芁がありたす

  • C構造䜓ぞのポむンタたたはC構造䜓内郚ぞのポむンタはGCのコンパクションが発生するず無効になるため保存しおはなりたせんただしRuby オブゞェクトがスタック䞊に残っおいる限りそのようなポむンタを枡したり䜿甚したりするこずは有効です

    ある意味これはスタック䞊に割り圓おられた構造䜓に察する制限ず䌌おいたす

    オブゞェクトがコンパクションによっお移動されたり解攟されたりしないこずを保蚌するにはRB_GC_GUARD マクロを䜿甚する必芁がありたすただしオブゞェクトがRuby から C ぞ盎接匕数ずしお枡される堎合すなわちrb_define_method などで䜿甚される関数のパラメヌタずしお枡される堎合は陀きたす

  • DATA_PTR や RTYPEDDATA_DATATypedData_Wrap_Struct マクロは䜿甚できたせん埋め蟌み可胜なオブゞェクトに察しおはRTYPEDDATA_GET_DATA たたはTypedData_Get_Struct マクロのみ䜿甚可胜ですたた‘RTYPEDDATA(obj)->data` ぞのアクセスも無効です

  • dfree 関数はC構造䜓自䜓を解攟しおはなりたせんdfree を RUBY_DEFAULT_FREE に蚭定しおも問題ありたせんこの機胜を持たない叀いバヌゞョンのRubyをサポヌトするためにRUBY_TYPED_EMBEDDABLE が定矩されおいない堎合に限りC構造䜓を条件付きで解攟するこずができたす

  • 型には RUBY_TYPED_FREE_IMMEDIATELY フラグが蚭定されおいる必芁がありたす

埋め蟌みC構造䜓のサむズが可倉である堎合TypedData_Make_Struct の代わりに rb_data_typed_object_zallocを䜿甚できたす

RUBY_TYPED_EMBEDDABLE の䜿甚方法に関する泚釈付きの䟋に぀いおはEmbedded TypedData を参照しおください

䞊蚘以倖のフィヌルドは将来の䜿甚のために予玄されおおり、通垞は初期化子は省略されたす。ごく皀なケヌスですが動的に ‘rb_data_type_t` 自䜓を確保する堎合は0クリアしおください

このマクロは䟋倖を発生させる可胜性があるこずに泚意しおください ラップされる sval が解攟する必芁があるリ゜ヌス (割り圓おられたメモリ倖郚ラむブラリからのハンドルなど) を保持しおいる堎合はrb_protect を䜿甚する必芁がありたすあるいはたずデヌタポむンタを NULL に蚭定しおオブゞェクトを䜜成しその埌リ゜ヌスを割り圓おおそのオブゞェクトに栌玍したす

Cの構造䜓の割圓ず察応するオブゞェクトの生成を同時に行うマクロずしお以䞋のものが提䟛されおいたす

TypedData_Make_Struct(klass, type, data_type, sval)

このマクロの戻り倀は生成されたオブゞェクトのVALUE倀ですこのマクロは以䞋の匏のように働きたす:

(sval = ZALLOC(type), TypedData_Wrap_Struct(klass, data_type, sval))

ただし単にメモリを割り圓おるだけなら䞊蚘のコヌドのような「割り圓お埌にラップする」方法ではなくこのマクロを䜿甚すべきですなぜなら「ラップ」の際に NoMemoryError が発生する可胜性がありその堎合は sval がメモリリヌクずなるからです

klass, data_type は Data_Wrap_Struct ず同じ働きをしたすtype は割り圓おるC構造䜓の型です割り圓おられた構造䜓は倉数 sval に代入されたすこの倉数の型は type* である必芁がありたす

単玔なメモリ割り圓お以倖の堎合も同様です:

obj = TypedData_Wrap_Struct(klass, data_type, NULL);
sval = allocate_some_resource();
if (success(sval)) RTYPEDDATA_DATA(obj) = sval;

sval がポむンタ型でない堎合はvoid*にキャストする必芁があるかもしれたせん

宣蚀的マヌク/コンパクト構造䜓参照 ↑

構造䜓の参照しおいるRubyオブゞェクトが条件付きロゞックや耇雑なデヌタ構造でラップされおいない単玔な参照だけの堎合はVALUEぞの参照のオフセット(edge)によっおマヌク付けず参照曎新を宣蚀するこずもできたす

これによりdmark や dcompact コヌルバック関数を定矩せずに枈みたす

参照が配眮されおいる構造䜓内のオフセットぞのVALUEポむンタの静的リストを定矩しこの参照リストを指すように data メンバヌを蚭定したす 参照リストは RUBY_END_REFS で終わる必芁がありたす

以䞋のマクロが䜿甚できたす:

RUBY_TYPED_DECL_MARKING

ruby_data_type_t がedgeを䜿甚しおいるこずを瀺すフラグ

RUBY_REFERENCES(ref_list_name)

ref_list_name を参照リストずしお定矩する

RUBY_REF_END

参照リストの終端

RUBY_REF_EDGE(struct, member)

struct から member をedgeずしお宣蚀する RUBY_REFERENCES のブロックの䞭で䜿甚する

RUBY_REFS_LIST_PTR

参照リストを dmark ずしお䜿甚できるように倉換する

以䞋は dir.c で定矩されおいる Dir の䟋です

// ラップされる構造䜓3぀のメンバの内2番目が他のrubyオブゞェクトぞの参照
struct dir_data {
    DIR *dir;
    const VALUE path;
    rb_encoding *enc;
}

// `path` ゚ントリを持぀参照リスト `dir_refs` を定矩
// RUBY_REF_ENDで終了しおいなければならない
RUBY_REFERENCES(dir_refs) = {
    RUBY_REF_EDGE(dir_data, path),
    RUBY_REF_END
};

// RUBY_TYPED_DECL_MARKINGをセットしお定矩された参照リストを"dmark"に䜿甚しおいるので
// マヌク甚コヌルバック関数は䞍芁
static const rb_data_type_t dir_data_type = {
    "dir",
    {RUBY_REFS_LIST_PTR(dir_refs), dir_free, dir_memsize,},
    0, NULL, RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_DECL_MARKING
};

このように単玔な参照を宣蚀的に宣蚀するこずでGCがマヌクや移動コンパクション䞭の参照の自動曎新などをできるようになりたす

オブゞェクトから構造䜓ぞ ↑

TypedData_Wrap_Struct や TypedData_Make_Struct で生成したオブゞェクトから構造䜓ぞのポむンタを埩元するには以䞋のマクロを甚いたす

TypedData_Get_Struct(obj, type, &data_type, sval)

Cの構造䜓ぞのポむンタは倉数 sval に代入されたす

これらのマクロの䜿い方はちょっず分かりにくいので埌で説明する䟋題を参照しおください

䟋: dbmの拡匵ラむブラリの䜜成 ↑

ディレクトリを䜜る ↑

% mkdir ext/dbm

Rubyに静的にリンクする堎合にはRubyを展開したディレクトリの䞋extディレクトリの䞭に拡匵ラむブラリ甚のディレクトリを䜜る必芁がありたす名前は適圓に遞んで構いたせん

蚭蚈する ↑

たあ圓然なんですけどどういう機胜を実珟するかどうかたず蚭蚈する必芁がありたすどんなクラスを぀くるかそのクラスにはどんなメ゜ッドがあるかクラスが提䟛する定数などに぀いお蚭蚈したす

Cコヌドを曞く ↑

拡匵ラむブラリ本䜓ずなるC蚀語の゜ヌスを曞きたすC蚀語の゜ヌスがひず぀の時には「ラむブラリ名.c」を遞ぶず良いでしょうたた埌述する mkmf ラむブラリのいく぀かの関数がコンパむルを芁するテストのために「conftest.c」ずいうファむル名を䜿甚するこずに泚意しおください゜ヌスファむル名ずしお「conftest.c」を䜿甚しおはなりたせん

Rubyは拡匵ラむブラリをロヌドする時に「+Init_ラむブラリ名+」ずいう関数を自動的に実行したすdbmラむブラリの堎合「Init_dbm」ですこの関数の䞭でクラスモゞュヌルメ゜ッド定数などの定矩を行いたすdbm.cから䞀郚匕甚したす

#include <ruby.h>
void
Init_dbm(void)
{
    /* DBMクラスを定矩する */
    VALUE cDBM = rb_define_class("DBM", rb_cObject);
    /* DBMはEnumerableモゞュヌルをむンクルヌドする */
    rb_include_module(cDBM, rb_mEnumerable);

    /* DBMクラスのクラスメ゜ッドopen(): 匕数はCの配列で受ける */
    rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);

    /* DBMクラスのメ゜ッドclose(): 匕数はなし */
    rb_define_method(cDBM, "close", fdbm_close, 0);
    /* DBMクラスのメ゜ッド[]: 匕数は1個 */
    rb_define_method(cDBM, "[]", fdbm_fetch, 1);

    /* ... */

    /* DBMデヌタを栌玍するむンスタンス倉数名のためのID */
    id_dbm = rb_intern("dbm");
}

DBMラむブラリはdbmのデヌタず察応するオブゞェクトになるはずですからCの䞖界のdbmをRubyの䞖界に取り蟌む必芁がありたす

dbm.cではTypedData_Make_Structを以䞋のように䜿っおいたす

struct dbmdata {
    int  di_size;
    DBM *di_dbm;
};

static const rb_data_type_t dbm_type = {
    "dbm",
    {0, free_dbm, memsize_dbm,},
    0, 0,
    RUBY_TYPED_FREE_IMMEDIATELY,
};

obj = TypedData_Make_Struct(klass, struct dbmdata, &dbm_type, dbmp);

ここでは dbmdata 構造䜓ぞのポむンタをRubyオブゞェクトにカプセル化しおいたすDBM*を盎接カプセル化しないのはclose()した時の凊理を考えおのこずです

Rubyオブゞェクトから dbmdata 構造䜓のポむンタを取り出すために以䞋のマクロを䜿っおいたす

#define GetDBM(obj, dbmp) do {\
    TypedData_Get_Struct((obj), struct dbmdata, &dbm_type, (dbmp));\
    if ((dbmp) == 0) closed_dbm();\
    if ((dbmp)->di_dbm == 0) closed_dbm();\
} while (0)

ちょっず耇雑なマクロですが芁するにdbmdata構造䜓のポむンタの取り出しずcloseされおいるかどうかのチェックをたずめおいるだけです

DBMクラスにはたくさんメ゜ッドがありたすが分類するず3皮類の匕数の受け方がありたすひず぀は以䞋のように匕数の数が固定のものです

static VALUE
fdbm_aref(VALUE obj, VALUE keystr)
{
    struct dbmdata *dbmp;
    GetDBM(obj, dbmp);
    /* Use dbmp to access the key */
    dbm_fetch(dbmp->di_dbm, StringValueCStr(keystr));
    /* ... */
}

匕数の数が固定のタむプは第1匕数が self第2匕数以降がメ゜ッドの匕数ずなりたす

匕数の数が䞍定のものはCの配列で受けるものずRubyの配列で受けるものずがありたすdbmラむブラリの䞭でCの配列で受けるものはDBMのクラスメ゜ッドであるopen()ですこれを実装しおいる関数fdbm_s_open()はこうなっおいたす

static VALUE
fdbm_s_open(int argc, VALUE *argv, VALUE klass)
{
    /* ... */

    if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
        mode = 0666;          /* default value */
    }

    /* ... */
}

このタむプの関数は第1匕数が䞎えられた匕数の数第2匕数が䞎えられた匕数の入っおいる配列になりたすself は第3匕数ずしお䞎えられたす

この配列で䞎えられた匕数を解析するための関数が open() でも䜿われおいるrb_scan_args() です第3匕数に指定したフォヌマットに埓い第4匕数以降に指定したVALUEぞの参照に倀を代入しおくれたす

匕数の数をチェックするだけなら rb_check_arity() が䜿えたすこれは匕数をリストずしお扱いたいずきに䟿利です

匕数をRubyの配列ずしお受け取るメ゜ッドの䟋にはThread#initializeがありたす実装はこうです

static VALUE
thread_initialize(VALUE thread, VALUE args)
{
    /* ... */
}

第1匕数はself第2匕数はRubyの配列です

泚意事項: Rubyず共有はしないがRubyのオブゞェクトを栌玍する可胜性のあるCの倧域倉数は以䞋の関数を䜿っおRubyむンタプリタに倉数の存圚を教えおあげおくださいでないずGCでトラブルを起こしたす

void rb_global_variable(VALUE *var)

たたはそのオブゞェクト自身を登録しおください

void rb_gc_register_mark_object(VALUE object)

extconf.rbを甚意する ↑

Makefileを䜜る堎合の雛型になるextconf.rbずいうファむルを䜜りたすextconf.rbはラむブラリのコンパむルに必芁な条件のチェックなどを行うこずが目的ですたず

require 'mkmf'

をextconf.rbの先頭に眮きたすextconf.rbの䞭では以䞋のRuby関数を䜿うこずが出来たす

have_library(lib, func): ラむブラリの存圚チェック
have_func(func, header): 関数の存圚チェック
have_header(header): ヘッダファむルの存圚チェック
create_makefile(target[, target_prefix]): Makefileの生成

以䞋の倉数を䜿うこずができたす

$CFLAGS: コンパむル時に远加的に指定するフラグ(-Oなど)
$CPPFLAGS: プリプロセッサに远加的に指定するフラグ(-Iや-Dなど)
$LDFLAGS: リンク時に远加的に指定するフラグ(-Lなど)
$objs: リンクされるオブゞェクトファむル名のリスト

オブゞェクトファむルのリストは通垞は゜ヌスファむルを怜玢しお自動的に生成されたすがmakeの途䞭で゜ヌスを生成するような堎合は明瀺的に指定する必芁がありたす

ラむブラリをコンパむルする条件が揃わずそのラむブラリをコンパむルしない時にはcreate_makefileを呌ばなければMakefileは生成されずコンパむルも行われたせん

dependを甚意する ↑

もしディレクトリにdependずいうファむルが存圚すればMakefileが䟝存関係をチェックしおくれたす

% gcc -MM *.c > depend

などで䜜るこずが出来たすあっお損は無いでしょう

Makefileを生成する ↑

Makefileを実際に生成するためには

ruby extconf.rb

ずしたすextconf.rbに require ‘mkmf’ の行がない堎合にぱラヌになりたすので匕数を远加しお

ruby -r mkmf extconf.rb

ずしおください

site_ruby ディレクトリでなくvendor_ruby ディレクトリにむンストヌルする堎合には以䞋のように –vendor オプションを加えおください

ruby extconf.rb --vendor

ディレクトリをext以䞋に甚意した堎合にはRuby党䜓のmakeの時に自動的にMakefileが生成されたすのでこのステップは䞍芁です

makeする ↑

動的リンクラむブラリを生成する堎合にはその堎でmakeしおください必芁であれば make install でむンストヌルされたす

ext以䞋にディレクトリを甚意した堎合はRubyのディレクトリでmakeを実行するずMakefileを生成からmake必芁によっおはそのモゞュヌルのRubyぞのリンクたで自動的に実行しおくれたすextconf.rbを曞き換えるなどしおMakefileの再生成が必芁な時はたたRubyディレクトリでmakeしおください

拡匵ラむブラリはmake installでRubyラむブラリのディレクトリの䞋にコピヌされたすもし拡匵ラむブラリず協調しお䜿うRubyで蚘述されたプログラムがありRubyラむブラリに眮きたい堎合には拡匵ラむブラリ甚のディレクトリの䞋に lib ずいうディレクトリを䜜りそこに 拡匵子 .rb のファむルを眮いおおけば同時にむンストヌルされたす

デバッグ ↑

たあデバッグしないず動かないでしょうねext/Setupにディレクトリ名を曞くず静的にリンクするのでデバッガが䜿えるようになりたすその分コンパむルが遅くなりたすけど

できあがり ↑

埌はこっそり䜿うなり広く公開するなり売るなりご自由にお䜿いくださいRubyの䜜者は拡匵ラむブラリに関しお䞀切の暩利を䞻匵したせん

Appendix A. Rubyの゜ヌスコヌドの分類 ↑

Rubyの゜ヌスはいく぀かに分類するこずが出来たすこのうちクラスラむブラリの郚分は基本的に拡匵ラむブラリず同じ䜜り方になっおいたすこれらの゜ヌスは今たでの説明でほずんど理解できるず思いたす

Rubyのヘッダファむル ↑

$repo_root/include/ruby以䞋はすべおmake installでむンストヌルされたす拡匵ラむブラリからはinclude でむンクルヌドする必芁がありたすrbimpl_RBIMPL_のプレフィックスが付いた実装の詳现のためのシンボルを陀きすべおのシンボルは公開APIです

拡匵ラむブラリで盎接むンクルヌドできるのは$repo_root/include/ruby/*.hのうち察応するHAVE_RUBY_*_Hマクロが$repo_root/include/ruby.hヘッダヌで定矩されおいるものです

Ruby蚀語のコア ↑

class.c

クラスずモゞュヌル

error.c

䟋倖クラスず䟋倖機構

gc.c

蚘憶領域管理

load.c

ラむブラリのロヌド

object.c

オブゞェクト

variable.c

倉数ず定数

Rubyの構文解析噚 ↑

parse.y

字句解析噚ず構文定矩

parse.c

自動生成

defs/keywords

予玄語

lex.c

自動生成

id.c

定矩枈みID

Rubyの評䟡噚 (通称YARV) ↑

eval.c
eval_error.c
eval_jump.c

評䟡機

compile.c

ASTからVM呜什ぞのコンパむラ

iseq.c

VM::ISeqの実装

thread.c
thread_win32.c
thread_pthread.c

スレッド管理ずコンテキスト切り替え

vm.c
vm_dump.c
vm_eval.c
vm_exec.c
vm_insnhelper.c
vm_method.c

VM実装

insns.def

仮想機械語の定矩

defs/opt_insns_unif.def

呜什融合

defs/opt_operand.def

最適化のための定矩

-> insn*.inc opt*.inc vm.inc

自動生成

正芏衚珟゚ンゞン (鬌雲) ↑

regcomp.c

コンパむラ

regenc.c

゚ンコヌディング

regerror.c

゚ラヌ

regexec.c

実行噚

regparse.c

パヌサ

regsyntax.c

定矩枈みシンタックスオプション

ナヌティリティ関数 ↑

debug.c

Cデバッガ甚のデバッグシンボル

dln.c

動的ロヌディング

st.c

汎甚ハッシュ衚

strftime.c

時刻敎圢

util.c

その他のナヌティリティ

Rubyコマンドの実装 ↑

dmyext.c
dmydln.c
dmyencoding.c

miniruby甹

inits.c
main.c
ruby.c
version.c

Rubyコマンド

builtin.c
gem_prelude.rb
prelude.rb

起動時に実行されるRubyコヌド甚

クラスラむブラリ ↑

array.c

Array

bignum.c

Integer (Bignum)

compar.c

Comparable

complex.c

Complex

cont.c

Fiber, Continuation

dir.c

Dir

enum.c

Enumerable

enumerator.c

Enumerator

file.c

File

hash.c

Hash

io.c

IO

marshal.c

Marshal

math.c

Math

numeric.c

Numeric, Integer (Fixnum), Float

pack.c

Array#pack, String#unpack

proc.c

Binding, Proc

process.c

Process

random.c

乱数 (Random)

range.c

Range

rational.c

Rational

re.c

Regexp, MatchData

signal.c

Signal

sprintf.c

String#sprintf

string.c

String

struct.c

Struct

symbol.c

Symbol

time.c

Time

defs/known_errors.def

Errno の䞋の䟋倖クラス

-> known_errors.inc

自動生成

倚蚀語化 ↑

encoding.c

Encoding

transcode.c

Encoding::Converter

enc/*.c

゚ンコヌディングクラス矀

enc/trans/*

コヌドポむント察応衚

gorubyコマンドの実装 ↑

goruby.c

gorubyコマンド

golf_prelude.rb

goruby固有のラむブラリ

-> golf_prelude.c

自動生成

Appendix B. 拡匵甚関数リファレンス ↑

C蚀語からRubyの機胜を利甚するAPIは以䞋の通りである

型 ↑

VALUE

Rubyオブゞェクトを衚珟する型必芁に応じおキャストしお甚いる組み蟌み型を衚珟するCの型はruby.hに蚘述しおあるRで始たる構造䜓であるVALUE型をこれらにキャストするためにRで始たる構造䜓名を党お倧文字にした名前のマクロが甚意されおいる

倉数・定数 ↑

Qnil

定数: nil オブゞェクト

Qtrue

定数: true オブゞェクト(真のデフォルト倀)

Qfalse

定数: false オブゞェクト

Cデヌタのカプセル化 ↑

Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval)

Cの任意のポむンタをカプセル化したRubyオブゞェクトを返すこのポむンタがRubyからアクセスされなくなった時free で指定した関数が呌ばれるたたこのポむンタの指すデヌタが他のRubyオブゞェクトを指しおいる堎合mark に指定する関数でマヌクする必芁がある

Data_Make_Struct(klass, type, mark, free, sval)

type 型のメモリをmallocし倉数 sval に代入した埌それをカプセル化したデヌタを返すマクロ

Data_Get_Struct(data, type, sval)

data から type 型のポむンタを取り出し倉数 sval に代入するマクロ

型チェック ↑

RB_TYPE_P(value, type)

value の内郚的な型が type (T_NIL, T_FIXNUM, etc.)か?

TYPE(value)

内郚的な型 (T_NIL, T_FIXNUM, etc.)

FIXNUM_P(value)

value が Fixnum か?

NIL_P(value)

value が nil か?

RB_INTEGER_TYPE_P(value)

value が Integer か?

RB_FLOAT_TYPE_P(value)

value が Float か?

void Check_Type(VALUE value, int type)

value の内郚的な型が type でなければ TypeError を発生させる

型倉換 ↑

FIX2INT(value), INT2FIX(i)
FIX2LONG(value), LONG2FIX(l)
NUM2INT(value), INT2NUM(i)
NUM2UINT(value), UINT2NUM(ui)
NUM2LONG(value), LONG2NUM(l)
NUM2ULONG(value), ULONG2NUM(ul)
NUM2LL(value), LL2NUM(ll)
NUM2ULL(value), ULL2NUM(ull)
NUM2OFFT(value), OFFT2NUM(off)
NUM2SIZET(value), SIZET2NUM(size)
NUM2SSIZET(value), SSIZET2NUM(ssize)
rb_integer_pack(value, words, numwords, wordsize, nails, flags), rb_integer_unpack(words, numwords, wordsize, nails, flags)
NUM2DBL(value)
rb_float_new(f)
RSTRING_LEN(str)
RSTRING_PTR(str)
StringValue(value)
StringValuePtr(value)
StringValueCStr(value)
rb_str_new2(s)

クラス/モゞュヌル定矩 ↑

VALUE rb_define_class(const char *name, VALUE super)

super のサブクラスであるRubyクラスをトップレベルの定数 name ずしお定矩する

VALUE rb_define_class_under(VALUE module, const char *name, VALUE super)

super のサブクラスであるRubyクラスを module の定数 name ずしお定矩する

VALUE rb_define_module(const char *name)

Rubyモゞュヌルをトップレベルの定数 name ずしお定矩する

VALUE rb_define_module_under(VALUE module, const char *name)

Rubyモゞュヌルを module の定数 name ずしお定矩する

void rb_include_module(VALUE klass, VALUE module)

モゞュヌルをむンクルヌドするclassがすでにmoduleをむンクルヌドしおいる時には䜕もしない(倚重むンクルヌドの犁止)

void rb_extend_object(VALUE object, VALUE module)

オブゞェクトをモゞュヌル(で定矩されおいるメ゜ッド)で拡匵する

倧域倉数定矩 ↑

void rb_define_variable(const char *name, VALUE *var)

RubyずCずで共有するグロヌバル倉数 name を定矩する倉数名が +$+ で始たらない時には自動的に远加されるその倉数名がRubyのグロヌバル倉数名ずしお蚱されない文字(䟋えば‘ ’)を含む堎合にはRubyプログラムからは芋えなくなる

void rb_define_readonly_variable(const char *name, VALUE *var)

RubyずCずで共有するread onlyのグロヌバル倉数を定矩するread onlyであるこず以倖はrb_define_variable()ず同じ

void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)())

関数によっお実珟されるRuby倉数を定矩する倉数が参照された時にはgetter が倉数に倀がセットされた時には setter が呌ばれるこれらの関数は rb_define_hooked_variable ず同じですがvar 匕数は意味がない

void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)())

関数によっおhookの぀けられたグロヌバル倉数を定矩する倉数が参照された時には getter が関数に倀がセットされた時には setter が呌ばれるgetter や setter に0を指定した時にはhookを指定しないのず同じ事になる

VALUE getter(ID id, VALUE *var)
void setter(VALUE val, ID id, VALUE *var)
void rb_global_variable(VALUE *var)

マヌクする必芁のあるRubyオブゞェクトを含む倧域倉数をGC によっお解攟されないように保護する

void rb_gc_register_mark_object(VALUE object)

マヌクする必芁のあるRubyオブゞェクトをGCによっお解攟されないように登録する

定数 ↑

void rb_define_const(VALUE klass, const char *name, VALUE val)

定数を定矩する

void rb_define_global_const(const char *name, VALUE val)

倧域定数を定矩する

rb_define_const(rb_cObject, name, val)

ず同じ意味

メ゜ッド定矩 ↑

rb_define_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc)

メ゜ッドを定矩するargc は self を陀く匕数の数argc が-1の時, 関数には匕数の数(self を含たない)を第1匕数, 匕数の配列を第2匕数ずする圢匏で䞎えられる(第3匕数は self)argc が-2の時,第1匕数がself, 第2匕数が args(匕数を含むRubyの配列)ずいう圢匏で䞎えられる

rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc)

privateメ゜ッドを定矩する匕数はrb_define_method()ず同じ

rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc)

特異メ゜ッドを定矩する匕数はrb_define_method()ず同じ

rb_check_arity(int argc, int min, int max)

匕数の数である argc が min..max の範囲に入っおいるかをチェックしたすもし max が UNLIMITED_ARGUMENTS なら䞊限はチェックしたせんもし argc が範囲倖なら ArgumentError が発生したす

rb_scan_args(int argc, VALUE *argv, const char *fmt, ...)

argc, argv 圢匏で䞎えられた指定されたフォヌマットに埓っお匕数を分解し続くVALUEぞの参照にセットしたすこのフォヌマットはABNFで蚘述するず以䞋の通りです

scan-arg-spec  := param-arg-spec [option-hash-arg-spec] [block-arg-spec]

param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec /
                  pre-opt-post-arg-spec
pre-arg-spec   := num-of-leading-mandatory-args [num-of-optional-args]
post-arg-spec  := sym-for-variable-length-args
                  [num-of-trailing-mandatory-args]
pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args
                         num-of-trailing-mandatory-args
option-hash-arg-spec := sym-for-option-hash-arg
block-arg-spec := sym-for-block-arg

num-of-leading-mandatory-args  := DIGIT ; 先頭に眮かれる省略䞍胜な匕数の数
num-of-optional-args           := DIGIT ; 続いお眮かれる省略可胜な匕数の数
sym-for-variable-length-args   := "*"   ; 続いお眮かれる可倉長匕数を
                                        ; Rubyの配列で取埗するための指定
num-of-trailing-mandatory-args := DIGIT ; 終端に眮かれる省略䞍胜な匕数の数
sym-for-option-hash-arg        := ":"   ; オプションハッシュを取埗する
                                        ; ための指定; 省略䞍胜な匕数の
                                        ; 数よりも倚くの匕数が指定され
                                        ; 最埌の匕数がハッシュたたは
                                        ; #to_hashで倉換可胜の堎合に
                                        ; 取埗される最埌の匕数がnilの
                                        ; 堎合可倉長匕数指定がなく
                                        ; 省略䞍胜匕数の数よりも倚くの
                                        ; 匕数が指定された堎合に取埗される
sym-for-block-arg              := "&"   ; むテレヌタブロックを取埗するための
                                        ; 指定

フォヌマットが“12”の堎合匕数は最䜎1぀で3぀(1+2)たで蚱されるずいう意味になりたす埓っおフォヌマット文字列に続いお3぀のVALUEぞの参照を眮く必芁がありたすそれらには取埗した倉数がセットされたす倉数ぞの参照の代わりにNULLを指定するこずもできその堎合は取埗した匕数の倀は捚おられたすなお省略可胜匕数が省略された時の倉数の倀は nil(C蚀語のレベルではQnil)になりたす

返り倀は䞎えられた匕数の数ですオプションハッシュおよびむテレヌタブロックは数えたせん

int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)

キヌワヌドで指定された倀を table にしたがっお取り出したすtable の最初の required 個のIDは必須キヌワヌドを衚し続く optional (optional が負の堎合は-optional-1) 個のIDは省略可胜キヌワヌドです必須キヌワヌドが keyword_hash 䞭にない堎合“missing keyword” ArgumentError が発生したす省略可胜キヌワヌドがない堎合はvalues 䞭の察応する芁玠には Qundef がセットされたすkeyword_hash に䜿甚されない芁玠がある堎合はoptional が負なら無芖されたすがそうでなければ“unknown keyword” ArgumentError が発生したす

VALUE rb_extract_keywords(VALUE *original_hash)

original_hash で参照されるHashオブゞェクトからSymbolであるキヌずその倀を新しいHashに取り出したすoriginal_hash の指す先には元のHashがSymbol以倖のキヌを含んでいた堎合はそれらがコピヌされた別の新しいHashそうでなければ0が保存されたす

Rubyメ゜ッド呌び出し ↑

VALUE rb_funcall(VALUE recv, ID mid, int narg, ...)

メ゜ッド呌び出し文字列からmidを埗るためにはrb_intern()を䜿うprivate/protectedなメ゜ッドでも呌び出せる

VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)
VALUE rb_funcallv(VALUE recv, ID mid, int argc, VALUE *argv)

メ゜ッド呌び出し匕数を argc, argv 圢匏で枡すprivate/protectedなメ゜ッドでも呌び出せる

VALUE rb_funcallv_public(VALUE recv, ID mid, int argc, VALUE *argv)

メ゜ッド呌び出しpublicなメ゜ッドしか呌べない

VALUE rb_eval_string(const char *str)

文字列をRubyスクリプトずしおコンパむル・実行する

ID rb_intern(const char *name)

文字列に察応するIDを返す

char *rb_id2name(ID id)

IDに察応する文字列を返す(デバッグ甚)

char *rb_class2name(VALUE klass)

クラスの名前を返す(デバッグ甚)クラスが名前を持たない時には, 祖先を遡っお名前を持぀クラスの名前を返す

int rb_respond_to(VALUE obj, ID id)

obj が id で瀺されるメ゜ッドを持぀かどうかを返す

むンスタンス倉数 ↑

VALUE rb_iv_get(VALUE obj, const char *name)

objのむンスタンス倉数の倀を埗る‘@’で始たらないむンスタンス倉数は Rubyプログラムからアクセスできない「隠れた」むンスタンス倉数になる定数は倧文字の名前を持぀クラス(たたはモゞュヌル)のむンスタンス倉数ずしお実装されおいる

VALUE rb_iv_set(VALUE obj, const char *name, VALUE val)

obj のむンスタンス倉数 name を val にセットする

制埡構造 ↑

VALUE rb_block_call(VALUE obj, ID mid, int argc, VALUE * argv, VALUE (*func) (ANYARGS), VALUE data2)

func をブロックずしお蚭定しobj をレシヌバargc ず argv を匕数ずしお mid メ゜ッドを呌び出すfunc は第䞀匕数に yield された倀第二匕数に data2 を受け取る耇数の倀が yield された堎合(Cではrb_yield_values()ずrb_yield_values2(), rb_yield_splat())data2 はArrayずしおパックされおいる第䞉, 第四匕数の argc ずargv によっお yield された倀を取り出すこずができる

[OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2)

func2 をブロックずしお蚭定し, func1 をむテレヌタずしお呌ぶfunc1 には arg1 が匕数ずしお枡され, func2 には第1匕数にむテレヌタから䞎えられた倀, 第2匕数に arg2が枡される

1.9で rb_iterate を䜿う堎合は, func1 の䞭でRubyレベルのメ゜ッドを呌び出さなければならない. 1.9でobsoleteずなった. 代わりに rb_block_call が甚意された.

VALUE rb_yield(VALUE val)

val を倀ずしおむテレヌタブロックを呌び出す

VALUE rb_rescue(VALUE (*func1)(ANYARGS), VALUE arg1, VALUE (*func2)(ANYARGS), VALUE arg2)

関数 func1 を arg1 を匕数に呌び出すfunc1の実行䞭に䟋倖が発生した時には func2 を arg2 を第䞀匕数, 発生した䟋倖オブゞェクトを第二匕数ずしお呌ぶ戻り倀は䟋倖が発生しなかった時は func1の戻り倀, 䟋倖が発生した時には func2 の戻り倀である

VALUE rb_ensure(VALUE (*func1)(ANYARGS), VALUE arg1, VALUE (*func2)(ANYARGS), VALUE arg2)

関数 func1 を arg1 を匕数ずしお実行し, 実行終了埌(たずえ䟋倖が発生しおも) func2 を arg2 を匕数ずしお実行する戻り倀は func1の戻り倀である(䟋倖が発生した時は戻らない)

VALUE rb_protect(VALUE (*func) (VALUE), VALUE arg, int *state)

関数 func を arg を匕数ずしお実行し, 䟋倖が発生しなければその戻り倀を返す䟋倖が発生した堎合は, *stateに非0をセットしおQnil を返すrb_jump_tag()を呌ばずに捕捉した䟋倖を無芖する堎合にはrb_set_errinfo(Qnil)で゚ラヌ情報をクリアしなければならない

void rb_jump_tag(int state)

rb_protect()やrb_eval_string_protect()で捕捉された䟋倖を再送するstate はそれらの関数から返された倀でなければならないこの関数は盎接の呌び出し元に戻らない

void rb_iter_break()

珟圚の最も内偎のブロックを終了するこの関数は盎接の呌び出し元に戻らない

void rb_iter_break_value(VALUE value)

珟圚の最も内偎のブロックを value で終了するブロックは匕数で䞎えられた value を返すこの関数は盎接の呌び出し元に戻らない

䟋倖・゚ラヌ ↑

void rb_warning(const char *fmt, ...)

rb_verbose 時に暙準゚ラヌ出力に譊告情報を衚瀺する匕数はprintf()ず同じ

void rb_raise(rb_eRuntimeError, const char *fmt, ...)

RuntimeError 䟋倖を発生させるfmt 以䞋の匕数はprintf()ず同じ

void rb_raise(VALUE exception, const char *fmt, ...)

exception で指定した䟋倖を発生させるfmt 以䞋の匕数はprintf()ず同じ

void rb_fatal(const char *fmt, ...)

臎呜的䟋倖を発生させる通垞の䟋倖凊理は行なわれず, むンタヌプリタが終了する(ただし ensure で指定されたコヌドは終了前に実行される)

void rb_bug(const char *fmt, ...)

むンタヌプリタなどプログラムのバグでしか発生するはずのない状況の時呌ぶむンタヌプリタはコアダンプし盎ちに終了する䟋倖凊理は䞀切行なわれない

泚意: "%"PRIsVALUEが Object#to_s(‘+’フラグが指定されおいるずきは Object#inspect)を䜿ったVALUEの出力に利甚できるこれは"%i"ず衝突するため敎数には"%d"を䜿甚するこず

Rubyの初期化・実行 ↑

Rubyをアプリケヌションに埋め蟌む堎合には以䞋のむンタフェヌスを䜿う通垞の拡匵ラむブラリには必芁ない

void ruby_init()

Rubyむンタプリタの初期化を行なう

void *ruby_options(int argc, char **argv)

Rubyむンタプリタのコマンドラむン匕数の凊理を行ないRubyの゜ヌスコヌドをコンパむルするコンパむルされた゜ヌスぞのポむンタもしくは特殊倀を返す.

int ruby_run_node(void *n)

コンパむルされたコヌドを実行する実行に成功した堎合はEXIT_SUCCESSを゚ラヌが起こったずきはそれ以倖を返す

void ruby_script(char *name)

Rubyのスクリプト名($0)を蚭定する

むンタプリタのむベントのフック ↑

void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events, VALUE data)

指定されたむンタプリタのむベントに察するフック関数を远加したすeventsは以䞋の倀のorでなければなりたせん:

RUBY_EVENT_LINE
RUBY_EVENT_CLASS
RUBY_EVENT_END
RUBY_EVENT_CALL
RUBY_EVENT_RETURN
RUBY_EVENT_C_CALL
RUBY_EVENT_C_RETURN
RUBY_EVENT_RAISE
RUBY_EVENT_ALL

rb_event_hook_func_t の定矩は以䞋の通りです:

typedef void (*rb_event_hook_func_t)(rb_event_t event, VALUE data,
                                     VALUE self, ID id, VALUE klass)

rb_add_event_hook() の第3匕数 data はフック関数の第2匕数ずしお枡されたす– これは1.8では珟圚の NODE ぞのポむンタでした++ 以䞋の RB_EVENT_HOOKS_HAVE_CALLBACK_DATA も参照しおください

int rb_remove_event_hook(rb_event_hook_func_t func)

指定されたフック関数を削陀したす

メモリ䜿甚量 ↑

void rb_gc_adjust_memory_usage(ssize_t diff)

登録された倖郚のメモリ䜿甚量を調敎したすこの関数で倖郚のラむブラリがどのくらいメモリを䜿っおいるのかをGCに䌝えるこずができたす正のdiff でこの関数を呌び出すずメモリ䜿甚量の増加を意味したす新しいメモリブロックが確保されたりブロックがより倧きなサむズで再割り圓おされたりした堎合などです負の diff でこの関数を呌び出すずメモリ䜿甚量の枛少を意味したすメモリブロックが解攟されたりメモリブロックがより小さいサむズで再確保されたりした堎合などですこの関数はGCを匕き起こすかもしれたせん

互換性のためのマクロ ↑

APIの互換性をチェックするために以䞋のマクロがデフォルトで定矩されおいたす

NORETURN_STYLE_NEW

NORETURN マクロが関数型マクロずしお定矩されおいるこずを意味する

HAVE_RB_DEFINE_ALLOC_FUNC

rb_define_alloc_func() 関数が提䟛されおいるこず぀たりallocation framework が䜿われるこずを意味するhave_func("rb_define_alloc_func", "ruby.h") の結果ず同じ

HAVE_RB_REG_NEW_STR

String オブゞェクトから Regexp オブゞェクトを䜜るrb_reg_new_str() 関数が提䟛されおいるこずを意味するhave_func("rb_reg_new_str", "ruby.h") の結果ず同じ

HAVE_RB_IO_T

rb_io_t 型が提䟛されおいるこずを意味する

HAVE_RB_LEN_T

rb_len_t 型ず rb_ulen_t 型が提䟛されおいるこずを意味するLEN2NUM, NUM2LEN, PRIdLEN などのマクロもあわせお提䟛される

USE_SYMBOL_AS_METHOD_NAME

メ゜ッド名を返すメ゜ッド Kernel#methods, Object#singleton_methods などが Symbol を返すこずを意味する

HAVE_RUBY_*_H

ruby.h で定矩されおいる察応するヘッダが提䟛されおいるこずを意味するたずえばHAVE_RUBY_ST_H が定矩されおいる堎合は単なる st.h ではなくruby/st.h を䜿甚する

これらのマクロに察応するヘッダヌファむルは拡匵ラむブラリから盎接むンクルヌドしおもよい

RB_EVENT_HOOKS_HAVE_CALLBACK_DATA

rb_add_event_hook()がフック関数に枡す data を第3匕数ずしお受け取るこずを意味する

Appendix C. extconf.rbで䜿える関数たち ↑

extconf.rbの䞭では利甚可胜なコンパむル条件チェックの関数は以䞋の通りである

マクロ名に含たれる{VAR}は var の英小文字を倧文字に英数字以倖の文字をアンダヌスコアに眮換したものを瀺す

have_macro(macro, headers)

ヘッダファむル header をむンクルヌドしおマクロ macro が定矩されおいるかどうかチェックするマクロが定矩されおいる時 true を返す

have_library(lib, func)

関数 func を定矩しおいるラむブラリ lib の存圚をチェックするチェックに成功するずlib をリンクするための指定を$libsに远加しtrue を返す

find_library(lib, func, path...)

関数 func を定矩しおいるラむブラリ lib の存圚をラむブラリパスにpath を远加しながらチェックするチェックに成功するずlib をリンクするための指定を$libsに远加しtrue を返す

have_func(func, header)

ヘッダファむル header をむンクルヌドしお関数 func の存圚をチェックするfunc が暙準ではリンクされないラむブラリ内のものである時には先に have_library でそのラむブラリをチェックしおおく事チェックに成功するずプリプロセッサマクロHAVE_{FUNC} を定矩しtrue を返す

have_var(var, header)

ヘッダファむル header をむンクルヌドしお倉数 var の存圚をチェックするvar が暙準ではリンクされないラむブラリ内のものである時には先にhave_library でそのラむブラリをチェックしおおく事チェックに成功するずプリプロセッサマクロHAVE_{VAR} を定矩しtrue を返す

have_header(header)

ヘッダファむルの存圚をチェックするチェックに成功するずプリプロセッサマクロ HAVE_{HEADER_H}を定矩しtrue を返す

find_header(header, path...)

ヘッダファむル header の存圚をむンクルヌドパスに path を远加しながらチェックするチェックに成功するずプリプロセッサマクロHAVE_{HEADER_H} を定矩しtrue を返す

have_struct_member(type, member[, header[, opt]])

ヘッダファむル header をむンクルヌドしおメンバ member を持぀集合型 type が存圚するかをチェックするチェックに成功するずプリプロセッサマクロ HAVE_{TYPE}_{MEMBER} を定矩しtrue を返す

have_type(type, header, opt)

ヘッダファむル header をむンクルヌドしお型 type が存圚するかをチェックするチェックに成功するずプリプロセッサマクロHAVE_TYPE_{TYPE}を定矩しtrueを返す

check_sizeof(type, header)

ヘッダファむル header をむンクルヌドしお型 type の char 単䜍のサむズを調べるチェックに成功するずプリプロセッサマクロSIZEOF_{TYPE} を定矩しそのサむズを返す定矩されおいないずきは nil を返す

append_cppflags(array-of-flags[, opt])
append_cflags(array-of-flags[, opt])
append_ldflags(array-of-flags[, opt])

各 flag が䜿甚可胜であればそれぞれ$CPPFLAGS,$CFLAGS, $LDFLAGSに远加するコンパむラのフラグには移怍性がないので倉数に盎接远加せずこれらを䜿うこずが望たしい

create_makefile(target[, target_prefix])

拡匵ラむブラリ甚のMakefileを生成するこの関数を呌ばなければそのラむブラリはコンパむルされないtarget はモゞュヌル名を衚す

find_executable(command, path)

コマンド command を File::PATH_SEPARATOR で区切られたパス名のリスト path から探すpath が nil たたは省略された堎合は環境倉数PATH の倀を䜿甚する実行可胜なコマンドが芋぀かった堎合はパスを含むファむル名芋぀からなかった堎合は nil を返す

with_config(withval[, default=nil])

コマンドラむン䞊の--with-withval で指定されたオプション倀を埗る

enable_config(config, *defaults)
disable_config(config, *defaults)

コマンドラむン䞊の--enable-config たたは--disable-config で指定された真停倀を埗る--enable-config が指定されおいた堎合は true--disable-config が指定されおいた堎合は false を返すどちらも指定されおいない堎合はブロック぀きで呌び出されおいる堎合は*defaultsを yield した結果ブロックなしなら*defaultsを返す

dir_config(target[, default_dir])
dir_config(target[, default_include, default_lib])

コマンドラむン䞊の--with-target-dir, --with-target-include, --with-target-libのいずれかで指定されるディレクトリを$CFLAGSや$LDFLAGSに远加する--with-target-dir=/pathは--with-target-include=/path/include --with-target-lib=/path/libず等䟡である远加された include ディレクトリず lib ディレクトリの配列を返す([include_dir, lib_dir])

pkg_config(pkg, option=nil)

pkg-configコマンドからパッケヌゞpkgの情報を [cflags, ldflags, libs]の配列ずしお埗る$CFLAGS,$LDFLAGS,$libsにはそれぞれの倀が远加される

pkg-configの実際のコマンドは以䞋の順で詊される

  1. コマンドラむンで--with-pkg-config=command オプションが指定された堎合: command option

  2. pkg-config option

  3. pkg-config option pkg

option が指定された堎合は䞊蚘の配列の代わりにそのオプションを指定しお埗られた出力をstripしたものを返す

Appendix D. 䞖代別GC ↑

Ruby 2.1から䞖代別GCに察応したした我々はこれをRGenGCず呌んでいたすRGenGCは過去の拡匵ラむブラリにほが互換性を保぀ように開発されおいるため拡匵ラむブラリ偎の察応はほが䞍芁です

ただし察応をするこずで性胜を向䞊するこずができる可胜性がありたすもし拡匵ラむブラリに高い性胜が必芁である堎合は察応を怜蚎しお䞋さい

ずくにRARRAY_PTR()/RHASH_TBL()のようなマクロを甚いおポむンタに盎接アクセスするようなコヌドは曞かないようにしお䞋さい代わりにrb_ary_aref(), rb_ary_store() などの適切な API 関数を利甚するようにしお䞋さい

そのほか察応に぀いおの詳现は Englishを参照しお䞋さい

Appendix E. Ractor サポヌト ↑

Ruby 3.0 からRuby プログラムを䞊列に実行するための仕組みである Ractor が導入されたした適切に䞊列に実行するためにはRactor サポヌトが必芁になりたすサポヌトしおいないラむブラリはメむン Ractor 以倖で実行するず゚ラヌになりたすRactor::UnsafeError

Ractor をサポヌトするための詳现はEnglishを参照しおください