從 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;