猫の魔法

主にruby系の技術メモを記載

rubyソースコードリーディング 1日目

特に理由はないが、読める所からrubyのソースを読もうと思う。 パット見途中で挫折しそうだが、何も無しに何処まで読めるか試してみるのもありかなと。

とりあえずはv2_5_0_rc1のmain.cから

int
main(int argc, char **argv)
{
#ifdef RUBY_DEBUG_ENV
    ruby_set_debug_option(getenv("RUBY_DEBUG"));
#endif

RUBY_DEBUG_ENVが有効ならruby_set_debug_optionを呼ぶ。

RUBY_DEBUG_ENVはRUBY_DEVELが有効であれば定義される。 

#if RUBY_DEVEL && !defined RUBY_DEBUG_ENV
# define RUBY_DEBUG_ENV 1
#endif

RUBY_DEVELはconfigure.acで定義されているか、こっちはm4マクロなので読み解くのがしんどい。 恐らく、RUBY_PATCHLEVELに入っている物のうち、-*に一致する場合はRUBY_DEVELがyesに、そうでない場合はnoが入るということだと思うが、 なんでそういうことをしているかはよく分からない。

AS_CASE([$RUBY_PATCHLEVEL], [-*],
    [RUBY_DEVEL=yes], [RUBY_DEVEL=no])

戻って、ruby_set_debug_optionはdebug.cで定義されていて、中でruby_each_wordsを呼んでいる。

void
ruby_set_debug_option(const char *str)
{
    ruby_each_words(str, set_debug_option, 0);
}

set_debug_optionはdebug.c上でstatic voidとして定義されているので第二引数は関数ポインタと思われる(こう言う書き方が出来るは知らなかった)

static void
set_debug_option(const char *str, int len, void *arg)
{
    if (!ruby_env_debug_option(str, len, arg)) {
    fprintf(stderr, "unexpected debug option: %.*s\n", len, str);
    }
}

とりあえず今日はここまで。