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

# class RubyVM::RJIT::CPointer::BitField

### Public Class Methods

define(width, offset) click to toggle source

@param width [Integer] @param offset [Integer]

Calls superclass method

    # File ruby_vm/rjit/c_pointer.rb, line 364
    def self.define(width, offset)
      Class.new(self) do
        define_method(:initialize) do |addr|
          super(addr, width, offset)
        end
      end
    end

new(addr, width, offset) click to toggle source

@param addr [Integer] @param width [Integer] @param offset [Integer]

    # File ruby_vm/rjit/c_pointer.rb, line 342
    def initialize(addr, width, offset)
      @addr = addr
      @width = width
      @offset = offset
    end

### Public Instance Methods

*() click to toggle source

Dereference

    # File ruby_vm/rjit/c_pointer.rb, line 349
    def *
      byte = Fiddle::Pointer.new(@addr)[0, Fiddle::SIZEOF_CHAR].unpack('c').first
      if @width == 1
        bit = (1 & (byte >> @offset))
        bit == 1
      elsif @width <= 8 && @offset == 0
        bitmask = @width.times.map { |i| 1 << i }.sum
        byte & bitmask
      else
        raise NotImplementedError.new("not-implemented bit field access: width=#{@width} offset=#{@offset}")
      end
    end