diff options
author | Takashi Kokubun <[email protected]> | 2023-02-07 14:42:58 -0800 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2023-03-05 22:11:20 -0800 |
commit | 5a1cee1d965301b05e9d2d85b0ee39ef3c6757f7 (patch) | |
tree | 452e673ff17de60fa4b2c35613c39e386cd760e5 /lib/ruby_vm/mjit/c_pointer.rb | |
parent | a026bcedc87a2f502befbd7476a997a9fe030203 (diff) |
Implement getivar
Diffstat (limited to 'lib/ruby_vm/mjit/c_pointer.rb')
-rw-r--r-- | lib/ruby_vm/mjit/c_pointer.rb | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/lib/ruby_vm/mjit/c_pointer.rb b/lib/ruby_vm/mjit/c_pointer.rb index 03742dd53a..c91f6f646b 100644 --- a/lib/ruby_vm/mjit/c_pointer.rb +++ b/lib/ruby_vm/mjit/c_pointer.rb @@ -55,7 +55,14 @@ module RubyVM::MJIT define_singleton_method(:size) { size } # Return the offset to a field - define_singleton_method(:offsetof) { |field| members.fetch(field).last / 8 } + define_singleton_method(:offsetof) do |field, *fields| + member, offset = members.fetch(field) + offset /= 8 + unless fields.empty? + offset += member.offsetof(*fields) + end + offset + end # Return member names define_singleton_method(:members) { members.keys } @@ -127,6 +134,15 @@ module RubyVM::MJIT # Return the size of this type define_singleton_method(:sizeof) { sizeof } + # Part of Struct's offsetof implementation + define_singleton_method(:offsetof) do |*fields| + if fields.size == 1 + 0 + else + raise NotImplementedError + end + end + define_method(:initialize) do |addr| super(addr, sizeof, members) end |