mirror of
https://github.com/ruby/ruby.git
synced 2025-08-26 06:25:31 +02:00
Implement getivar
This commit is contained in:
parent
a026bcedc8
commit
5a1cee1d96
8 changed files with 230 additions and 12 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue