iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

C again系列 第 18

Ruby code to YARV C code

  • 分享至 

  • xImage
  •  

VALUE 的設計衍生出疑問為什麼要這樣子做,再看一下 code 後有一個想法:

在 Ruby 程式裡可以存取很多內建的變數或常數,它們有些是在 YARV 的 C code 裡定義,而不是在 Ruby 裡定義的。Ruby 程式經過 parse/compile 後,會對應到 YARV C 的實作。如果在 YARV 自身邏輯裡,能夠與 Ruby 對應的 API,有相同的結構和規則,那麼很自然的 Ruby 可以操作在 C 裡面建立的 Object,模糊兩邊的界線。而在執行 Ruby 程式時關鍵的 C struct 除了之前看到的 rb_ast,另外就是其中的 RNode。

typedef struct RNode {
    VALUE flags;
    union {
        struct RNode *node;
        ID id;
        VALUE value;
        rb_ast_id_table_t *tbl;
    } u1;
    union {
        struct RNode *node;
        ID id;
        long argc;
        VALUE value;
    } u2;
    union {
        struct RNode *node;
        ID id;
        long state;
        struct rb_args_info *args;
        struct rb_ary_pattern_info *apinfo;
        struct rb_fnd_pattern_info *fpinfo;
        VALUE value;
    } u3;
    rb_code_location_t nd_loc;
    int node_id;
} NODE;

上一篇
VALUE (2)
下一篇
用 Ripper 看 tokens, AST
系列文
C again30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言