summaryrefslogtreecommitdiff
path: root/lib/ruby_vm/mjit/c_pointer.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2023-02-07 14:42:58 -0800
committerTakashi Kokubun <[email protected]>2023-03-05 22:11:20 -0800
commit5a1cee1d965301b05e9d2d85b0ee39ef3c6757f7 (patch)
tree452e673ff17de60fa4b2c35613c39e386cd760e5 /lib/ruby_vm/mjit/c_pointer.rb
parenta026bcedc87a2f502befbd7476a997a9fe030203 (diff)
Implement getivar
Diffstat (limited to 'lib/ruby_vm/mjit/c_pointer.rb')
-rw-r--r--lib/ruby_vm/mjit/c_pointer.rb18
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