class RubyVM::RJIT::CPointer::Struct - ruby_vm: Ruby Standard Library Documentation

# class RubyVM::RJIT::CPointer::Struct

Note: We’d like to avoid alphabetic method names to avoid a conflict with member methods. `to_i` and `to_s` are considered an exception.

### Public Class Methods

new(addr, sizeof, members) click to toggle source

@param name [String] @param sizeof [Integer] @param members [Hash{ Symbol => [RubyVM::RJIT::CType::*, Integer, TrueClass] }]

    # File ruby_vm/rjit/c_pointer.rb, line 11
    def initialize(addr, sizeof, members)
      @addr = addr
      @sizeof = sizeof
      @members = members
    end

### Private Class Methods

define(size, members) click to toggle source

@param size [Integer] @param members [Hash{ Symbol => [Integer, RubyVM::RJIT::CType::*] }]

Calls superclass method

    # File ruby_vm/rjit/c_pointer.rb, line 52
    def self.define(size, members)
      Class.new(self) do
        # Return the size of this type
        define_singleton_method(:size) { size }

        # Return the offset to a field
        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 }

        define_method(:initialize) do |addr = nil|
          if addr.nil? # TODO: get rid of this feature later
            addr = Fiddle.malloc(size)
          end
          super(addr, size, members)
        end

        members.each do |member, (type, offset, to_ruby)|
          # Intelligent API that does automatic dereference
          define_method(member) do
            value = self[member]
            if value.respond_to?(:*)
              value = value.*
            end
            if to_ruby
              value = C.to_ruby(value)
            end
            value
          end

          define_method("#{member}=") do |value|
            if to_ruby
              value = C.to_value(value)
            end
            self[member] = value
          end
        end
      end
    end

### Public Instance Methods

-(struct) click to toggle source

`Pointer` diff

    # File ruby_vm/rjit/c_pointer.rb, line 28
    def -(struct)
      raise ArgumentError if self.class != struct.class
      (@addr - struct.to_i) / @sizeof
    end

[](member) click to toggle source

Primitive API that does no automatic dereference TODO: remove this? @param member [Symbol]

    # File ruby_vm/rjit/c_pointer.rb, line 36
    def [](member)
      type, offset = @members.fetch(member)
      type.new(@addr + offset / 8)
    end

to_i() click to toggle source

Get a raw address

    # File ruby_vm/rjit/c_pointer.rb, line 18
    def to_i
      @addr
    end

to_s() click to toggle source

Serialized address for generated code

    # File ruby_vm/rjit/c_pointer.rb, line 23
    def to_s
      "0x#{@addr.to_s(16)}"
    end

### Private Instance Methods

[]=(member, value) click to toggle source

@param member [Symbol] @param value [Object]

    # File ruby_vm/rjit/c_pointer.rb, line 45
    def []=(member, value)
      type, offset = @members.fetch(member)
      type[@addr + offset / 8] = value
    end