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

# class RubyVM::RJIT::CPointer::Union

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

### Public Class Methods

define(sizeof, members) click to toggle source

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

Calls superclass method

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

        # Part of Struct's offsetof implementation
        define_singleton_method(:offsetof) do |field, *fields|
          member = members.fetch(field)
          offset = 0
          unless fields.empty?
            offset += member.offsetof(*fields)
          end
          offset
        end

        define_method(:initialize) do |addr|
          super(addr, sizeof, members)
        end

        members.each do |member, type|
          # Intelligent API that does automatic dereference
          define_method(member) do
            value = type.new(@addr)
            if value.respond_to?(:*)
              value = value.*
            end
            value
          end
        end
      end
    end

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

@param _name [String] To be used when it starts defining a union pointer class @param sizeof [Integer] @param members [Hash{ Symbol => RubyVM::RJIT::CType::* }]

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

### Public Instance Methods

+(index) click to toggle source

Move addr to access this pointer like an array

    # File ruby_vm/rjit/c_pointer.rb, line 119
    def +(index)
      raise ArgumentError unless index.is_a?(Integer)
      self.class.new(@addr + index * @sizeof)
    end

-(union) click to toggle source

`Pointer` diff

    # File ruby_vm/rjit/c_pointer.rb, line 125
    def -(union)
      raise ArgumentError if self.class != union.class
      (@addr - union.instance_variable_get(:@addr)) / @sizeof
    end

to_i() click to toggle source

Get a raw address

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