Implement getivar

This commit is contained in:
Takashi Kokubun 2023-02-07 14:42:58 -08:00
parent a026bcedc8
commit 5a1cee1d96
8 changed files with 230 additions and 12 deletions

View file

@ -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