iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
自我挑戰組

C again系列 第 9

iseq & VALUE & rb_iseq_struct

  • 分享至 

  • xImage
  •  

在 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,根據它來判斷?


上一篇
ruby_process_options
下一篇
YARV stack 上放的資料 (1)
系列文
C again30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言