稍微理解一下 VALUE
,參考 https://docs.ruby-lang.org/en/3.2/extension_rdoc.html :
The type for the Ruby object. Actual structures are defined in ruby.h, such as struct RString, etc. To refer the values in structures, use casting macros like RSTRING(obj).
所以前面看到 type cast 成 VALUE 的 C object 都是視為 Ruby object 處理。依照 memory alignment 最小單位是 word (根據系統架構是 32bit or 64bit) 的特性,address 的最後兩個 bit 會是 00
。
所以一般 pointer cast 成 VALUE 時沒有問題,指向的 C object 對應到 Ruby object。如果最後兩個 bit 不是 00
的話,表示這個值有其他用途,在 YARV 實作表示此 VALUE 為 word - 1bit 的整數。