在 ruby_optoins 有宣告
void *volatile iseq = 0;
比對其後使用的方式
ruby_init_stack((void *)&iseq);
SAVE_ROOT_JMPBUF(GET_THREAD(), iseq = ruby_process_options(argc, argv));
在 ruby_process_options
裡看到宣告和 type cast,與 process_options
內的宣告
VALUE iseq;
// ...
iseq = process_options(argc, argv, cmdline_options_init(&opt));
// ...
return (void*)(struct RData*)iseq;
const rb_iseq_t *iseq;
推測 iseq 或 VALUE 是對應 stack 上的 offset,但又可以根據 RData 或 rb_iseq_struct 不同資料型態,知道在 stack 上的整包資料
typedef unsigned long VALUE;
struct RData {
struct RBasic basic;
void (*dmark)(void*);
void (*dfree)(void*);
void *data;
};
struct rb_iseq_struct {
VALUE flags; /* 1 */
VALUE wrapper; /* 2 */
struct rb_iseq_constant_body *body; /* 3 */
union { /* 4, 5 words */
struct iseq_compile_data *compile_data; /* used at compile time */
struct {
VALUE obj;
int index;
} loader;
struct {
struct rb_hook_list_struct *local_hooks;
rb_event_flag_t global_trace_events;
} exec;
} aux;
};
到此下一個問題是 iseq 參數傳出來就是一個 offset 值,是怎麼判斷對應的資料型態?是 caller 根據自己知道的資訊解讀嗎,還是 struct 中的第一個值都是 VALUE flags
,根據它來判斷?