Ruby1.9/初期化を読む
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#contents
*はじめに [#ma195721]
ここではRuby1.9の初期化を読解したいと思います。
*ruby_init(eval.c) [#q7d6ac37]
ruby_init関数はmain関数から呼び出されます。この関数の実行...
**Init_BareVM(vm.c) [#zab79610]
ruby_init関数から呼ばれている関数の中でYARVに関係ありそう...
Init_BareVM関数ではruby_current_vmとruby_current_threadが...
フレーム情報を設定するあたりを詳しく見てみましょう。
th_init2(rb_thread_t *th)
{
...
th->cfp = (void *)(th->stack + th->stack_size);
vm_push_frame(th, 0, FRAME_MAGIC_TOP, Qnil, 0, 0, th...
vm_push_frame(rb_thread_t *th, rb_iseq_t *iseq, VALUE ty...
VALUE self, VALUE specval, VALUE *pc,
VALUE *sp, VALUE *lfp, int local_size)
{
...
/* nil initialize */
for (i=0; i < local_size; i++) {
*sp = Qnil;
sp++;
}
/* set special val */
*sp = GC_GUARDED_PTR(specval);
dfp = sp;
if (lfp == 0) {
lfp = sp;
}
cfp = th->cfp = th->cfp - 1;
cfp->pc = pc;
cfp->sp = sp + 1;
cfp->bp = sp + 1;
cfp->iseq = iseq;
cfp->flag = type;
cfp->self = self;
cfp->lfp = lfp;
cfp->dfp = dfp;
cfp->proc = 0;
vm_push_frame関数を呼び出す前のスタックはこんな感じ。
stack→|
|
...
|
|
cfp→
vm_push_frame関数を呼び出した後のスタックはこんな感じ。
stack→|Qnil
dfp,lfp→|GC_GUARDED_PTR(0)
sp,bp→|
|
...
|
cfp→|フレーム情報
というわけでスタックは上から使われていき下に伸びる、フレ...
余談ですがマクロ化されてる処理もあればマクロ化されてない...
**PUSH_TAG, EXEC_TAG, POP_TAG(eval_intern.h) [#i9567fad]
マクロを展開するとEXEC_TAGではsetjmp関数が実行されること...
それ以上のことについては、とりあえず「なんかエラーなこと...
**rb_call_inits(inits.c) [#jd50de85]
rb_call_inits関数では組込クラスなどの初期化が行われていま...
**Init_top_self(vm.c) [#a04b12e6]
まずInit_Object関数(object.c)の後にInit_top_self関数が呼...
void
Init_top_self()
{
rb_vm_t *vm = GET_VM();
vm->top_self = rb_obj_alloc(rb_cObject);
rb_define_singleton_method(rb_vm_top_self(), "to_s",...
}
VALUE
rb_vm_top_self()
{
return GET_VM()->top_self;
}
**Init_eval(eval.c) [#g89a51b1]
(位置を直すべきと書いてますが)Init_eval関数にてruby_cur...
grepをかけてみるとmark_object_aryはrb_register_mark_objec...
rb_register_mark_object(VALUE obj)
{
VALUE ary = GET_THREAD()->vm->mark_object_ary;
rb_ary_push(ary, obj);
}
でもってmark_object_aryはrb_vm_mark関数(vm.c)でマークされ...
**Init_load(load.c) [#t712c209]
Init_load関数にてruby_current_vmのloaded_features(ロード...
**Init_VM(vm.c) [#m7c6d634]
Init_VM関数では以下のことが行われています。
-ruby_current_vmをくるむVMオブジェクトの作成
-ruby_current_threadをくるむThreadオブジェクトの作成
-vmのmain_thread, running_threadとしてruby_current_thread...
-threadのトップレベルオブジェクトを設定
-vmのliving_threadsにruby_current_threadを追加
これ以外にフレームに命令コードが設定されていますが、ダミ...
**Init_Thread(thread.c) [#l4bf8a8d]
Init_Thread関数では以下のことが行われています。一部の処理...
-ruby_current_threadのスレッドグループ、およびruby_curren...
-ruby_current_threadのthread_idの初期化
--初期化される前にvmのliving_threadsに情報が格納されたの...
-ロック変数の初期化
--vmのglobal_interpreter_lockがロックされたまま終了してる...
-10msごとに処理を行うスレッドの作成
ちなみに、staticなはずのnative_mutex_initialize関数とかが...
*エンコーディングの初期化 [#c75f8dc1]
YARVではないですがm17nもRuby1.9のメイン機能らしいので見る...
まずエンコーディングテーブルですがいつの間にか初期化され...
inits.c
rb_call_inits()
{
Init_sym();
parse.y
Init_sym(void)
{
...
rb_intern2("", 0);
rb_intern2(const char *name, long len)
{
return rb_intern3(name, len, rb_enc_from_index(0));
}
encoding.c
rb_enc_from_index(int index)
{
if (!enc_table) {
rb_enc_init();
というわけでruby_call_inits関数の初めにこっそり初期化され...
*おわりに [#p94daf54]
ここではRuby1.9の初期化のうちYARV周りを中心に見てきました...
-rb_current_vm
-rb_current_thread
のようです。それでは続いて[[スクリプトの解析>Ruby1.9/スク...
終了行:
#contents
*はじめに [#ma195721]
ここではRuby1.9の初期化を読解したいと思います。
*ruby_init(eval.c) [#q7d6ac37]
ruby_init関数はmain関数から呼び出されます。この関数の実行...
**Init_BareVM(vm.c) [#zab79610]
ruby_init関数から呼ばれている関数の中でYARVに関係ありそう...
Init_BareVM関数ではruby_current_vmとruby_current_threadが...
フレーム情報を設定するあたりを詳しく見てみましょう。
th_init2(rb_thread_t *th)
{
...
th->cfp = (void *)(th->stack + th->stack_size);
vm_push_frame(th, 0, FRAME_MAGIC_TOP, Qnil, 0, 0, th...
vm_push_frame(rb_thread_t *th, rb_iseq_t *iseq, VALUE ty...
VALUE self, VALUE specval, VALUE *pc,
VALUE *sp, VALUE *lfp, int local_size)
{
...
/* nil initialize */
for (i=0; i < local_size; i++) {
*sp = Qnil;
sp++;
}
/* set special val */
*sp = GC_GUARDED_PTR(specval);
dfp = sp;
if (lfp == 0) {
lfp = sp;
}
cfp = th->cfp = th->cfp - 1;
cfp->pc = pc;
cfp->sp = sp + 1;
cfp->bp = sp + 1;
cfp->iseq = iseq;
cfp->flag = type;
cfp->self = self;
cfp->lfp = lfp;
cfp->dfp = dfp;
cfp->proc = 0;
vm_push_frame関数を呼び出す前のスタックはこんな感じ。
stack→|
|
...
|
|
cfp→
vm_push_frame関数を呼び出した後のスタックはこんな感じ。
stack→|Qnil
dfp,lfp→|GC_GUARDED_PTR(0)
sp,bp→|
|
...
|
cfp→|フレーム情報
というわけでスタックは上から使われていき下に伸びる、フレ...
余談ですがマクロ化されてる処理もあればマクロ化されてない...
**PUSH_TAG, EXEC_TAG, POP_TAG(eval_intern.h) [#i9567fad]
マクロを展開するとEXEC_TAGではsetjmp関数が実行されること...
それ以上のことについては、とりあえず「なんかエラーなこと...
**rb_call_inits(inits.c) [#jd50de85]
rb_call_inits関数では組込クラスなどの初期化が行われていま...
**Init_top_self(vm.c) [#a04b12e6]
まずInit_Object関数(object.c)の後にInit_top_self関数が呼...
void
Init_top_self()
{
rb_vm_t *vm = GET_VM();
vm->top_self = rb_obj_alloc(rb_cObject);
rb_define_singleton_method(rb_vm_top_self(), "to_s",...
}
VALUE
rb_vm_top_self()
{
return GET_VM()->top_self;
}
**Init_eval(eval.c) [#g89a51b1]
(位置を直すべきと書いてますが)Init_eval関数にてruby_cur...
grepをかけてみるとmark_object_aryはrb_register_mark_objec...
rb_register_mark_object(VALUE obj)
{
VALUE ary = GET_THREAD()->vm->mark_object_ary;
rb_ary_push(ary, obj);
}
でもってmark_object_aryはrb_vm_mark関数(vm.c)でマークされ...
**Init_load(load.c) [#t712c209]
Init_load関数にてruby_current_vmのloaded_features(ロード...
**Init_VM(vm.c) [#m7c6d634]
Init_VM関数では以下のことが行われています。
-ruby_current_vmをくるむVMオブジェクトの作成
-ruby_current_threadをくるむThreadオブジェクトの作成
-vmのmain_thread, running_threadとしてruby_current_thread...
-threadのトップレベルオブジェクトを設定
-vmのliving_threadsにruby_current_threadを追加
これ以外にフレームに命令コードが設定されていますが、ダミ...
**Init_Thread(thread.c) [#l4bf8a8d]
Init_Thread関数では以下のことが行われています。一部の処理...
-ruby_current_threadのスレッドグループ、およびruby_curren...
-ruby_current_threadのthread_idの初期化
--初期化される前にvmのliving_threadsに情報が格納されたの...
-ロック変数の初期化
--vmのglobal_interpreter_lockがロックされたまま終了してる...
-10msごとに処理を行うスレッドの作成
ちなみに、staticなはずのnative_mutex_initialize関数とかが...
*エンコーディングの初期化 [#c75f8dc1]
YARVではないですがm17nもRuby1.9のメイン機能らしいので見る...
まずエンコーディングテーブルですがいつの間にか初期化され...
inits.c
rb_call_inits()
{
Init_sym();
parse.y
Init_sym(void)
{
...
rb_intern2("", 0);
rb_intern2(const char *name, long len)
{
return rb_intern3(name, len, rb_enc_from_index(0));
}
encoding.c
rb_enc_from_index(int index)
{
if (!enc_table) {
rb_enc_init();
というわけでruby_call_inits関数の初めにこっそり初期化され...
*おわりに [#p94daf54]
ここではRuby1.9の初期化のうちYARV周りを中心に見てきました...
-rb_current_vm
-rb_current_thread
のようです。それでは続いて[[スクリプトの解析>Ruby1.9/スク...
ページ名: