在 ruby_options() 內有對 execution context, stack 的操作。
YARV 是 stack machine 架構,用來取代原始 MRI 直接操作 AST nodes 速度慢的問題。ruby 執行過程中會一直 parse ruby 程式,看起來都是用 ruby_options()
處理。推測裡面 EC 的 marco 會操作 stack,相關資訊叫 TAG
用它來判斷狀態。不知道這些狀態的定義是什麼,要再看 code
void *
ruby_options(int argc, char **argv)
{
rb_execution_context_t *ec = GET_EC();
enum ruby_tag_type state;
void *volatile iseq = 0;
ruby_init_stack((void *)&iseq);
EC_PUSH_TAG(ec);
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
SAVE_ROOT_JMPBUF(GET_THREAD(), iseq = ruby_process_options(argc, argv));
}
else {
rb_ec_clear_current_thread_trace_func(ec);
int exitcode = error_handle(ec, ec->errinfo, state);
ec->errinfo = Qnil; /* just been handled */
iseq = (void *)INT2FIX(exitcode);
}
EC_POP_TAG();
return iseq;
}