Class: RubyVM::RJIT::CPointer::Immediate

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_vm/rjit/c_pointer.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(addr, size, pack) ⇒ Immediate

Returns a new instance of Immediate.

Parameters:



169
170
171
172
173
# File 'lib/ruby_vm/rjit/c_pointer.rb', line 169

def initialize(addr, size, pack)
  @addr = addr
  @size = size
  @pack = pack
end

Class Method Details

.define(fiddle_type) ⇒ Object

Parameters:

  • fiddle_type (Integer)

    Fiddle::TYPE_*



207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/ruby_vm/rjit/c_pointer.rb', line 207

def self.define(fiddle_type)
  size = Fiddle::PackInfo::SIZE_MAP.fetch(fiddle_type)
  pack = Fiddle::PackInfo::PACK_MAP.fetch(fiddle_type)

  Class.new(self) do
    define_method(:initialize) do |addr|
      super(addr, size, pack)
    end

    define_singleton_method(:size) do
      size
    end

    # Type-level []=: Used by struct fields
    define_singleton_method(:[]=) do |addr, value|
      Fiddle::Pointer.new(addr)[0, size] = [value].pack(pack)
    end
  end
end

Instance Method Details

#*Object

Dereference



186
187
188
# File 'lib/ruby_vm/rjit/c_pointer.rb', line 186

def *
  self[0]
end

#+(index) ⇒ Object

Move addr to addess this pointer like an array



181
182
183
# File 'lib/ruby_vm/rjit/c_pointer.rb', line 181

def +(index)
  Immediate.new(@addr + index * @size, @size, @pack)
end

#[](index) ⇒ Object

Array access



191
192
193
194
# File 'lib/ruby_vm/rjit/c_pointer.rb', line 191

def [](index)
  return nil if @addr == 0
  Fiddle::Pointer.new(@addr + index * @size)[0, @size].unpack1(@pack)
end

#[]=(index, value) ⇒ Object

Array set



197
198
199
# File 'lib/ruby_vm/rjit/c_pointer.rb', line 197

def []=(index, value)
  Fiddle::Pointer.new(@addr + index * @size)[0, @size] = [value].pack(@pack)
end

#to_iObject

Get a raw address



176
177
178
# File 'lib/ruby_vm/rjit/c_pointer.rb', line 176

def to_i
  @addr
end

#to_sObject

Serialized address for generated code. Used for embedding things like body->iseq_encoded.



202
203
204
# File 'lib/ruby_vm/rjit/c_pointer.rb', line 202

def to_s
  "0x#{Integer(@addr).to_s(16)}"
end