Add `offsetof` so we can get the offset of members

I want to get the offset of fields inside structs, but I don't want to
instantiate the struct.  I need to embed the offsets inside machine
code, and I can't get the offsets without calling `new` on the struct.

This commit adds an `offset` method so you can get the offset of a
member without instantiating anything.  You can do:

```ruby
C.rb_control_frame_t.offsetof(:sp) #=> 8
```

I don't think this implementation is perfect, you can only get immediate
fields.  But it is better than nothing!
This commit is contained in:
Aaron Patterson 2023-01-20 10:57:23 -08:00 коммит произвёл Aaron Patterson
Родитель 887d21613c
Коммит 06b62cbbdd
1 изменённых файлов: 6 добавлений и 0 удалений

Просмотреть файл

@ -54,6 +54,12 @@ module RubyVM::MJIT # :nodoc: all
# Return the size of this type
define_singleton_method(:sizeof) { sizeof }
# Get the offset of a member named +name+
define_singleton_method(:offsetof) { |name|
_, offset = members.fetch(name)
offset / 8
}
define_method(:initialize) do |addr = nil|
if addr.nil? # TODO: get rid of this feature later
addr = Fiddle.malloc(sizeof)