class Gogyou::Accessor::Pointer

Constants

BYTEALIGN
BYTESIZE
EXTENSIBLE

Public Class Methods

aref(buf, off) click to toggle source
# File lib/gogyou/accessor.rb, line 266
def self.aref(buf, off)
  new(buf, off)
end
aset(buf, off, val) click to toggle source
# File lib/gogyou/accessor.rb, line 270
def self.aset(buf, off, val)
  if val.kind_of?(Fixnum)
    buf.store_sizet(off, val)
  else
    raise PointerError, "wrong address (#{val.class} for Fixnum)"
  end

  buf
end
define(type) click to toggle source
Calls superclass method Gogyou::Accessor::define
# File lib/gogyou/accessor.rb, line 280
def self.define(type)
  require_relative "fiddle" # for Fiddle::Pointer and extend

  Class.new(Pointer) do |t|
    define_singleton_method(:aset, ->(buf, off, val) {
      if val.kind_of?(self)
        addr = val.buffer.load_sizet(val.offset)
        buf.store_sizet(off, addr)
      else
        super
      end

      buf
    })

    define_method(:pointer_address, -> {
      @buffer__GOGYOU__.load_sizet(@offset__GOGYOU__)
    })

    define_method(:[], ->(*args) {
      case args.size
      when 0
        elem = 0
      when 1
        elem = args[0].to_i
      else
        raise ArgumentError, "wrong argument size (#{args.size} for 0 .. 1)"
      end
      addr = @buffer__GOGYOU__.load_sizet(@offset__GOGYOU__)
      if addr == 0
        raise NullPointerError, "nullpo - #<%s:0x%08X>" % [self.class, __id__ << 1]
      end
      buf = ::Fiddle::Pointer.new(addr + elem * type.bytesize, type.bytesize)
      type.aref(buf, 0)
    })

    define_method(:[]=, ->(*args) {
      case args.size
      when 1
        elem = 0
        v = args[0]
      when 2
        elem = args[0].to_i
        v = args[1]
      else
        raise ArgumentError, "wrong argument size (#{args.size} for 1 .. 2)"
      end

      addr = @buffer__GOGYOU__.load_sizet(@offset__GOGYOU__)
      if addr == 0
        raise NullPointerError, "nullpo - #<%s:0x%08X>" % [self.class, __id__ << 1]
      end
      buf = ::Fiddle::Pointer.new(addr + elem * type.bytesize, type.bytesize)
      type.aset(buf, 0, v)
      v
    })

    define_method(:+, ->(elem) {
      addr = @buffer__GOGYOU__.load_sizet(@offset__GOGYOU__)
      buf = String.alloc(Primitives::SIZE_T.bytesize)
      buf.store_sizet(0, addr + elem * type.bytesize)
      self.class.new(buf, 0)
    })

    typename = String(type.respond_to?(:name) ? type.name : type) rescue String(type)
    define_method(:inspect, -> {
      addr = @buffer__GOGYOU__.load_sizet(@offset__GOGYOU__)
      "#<*%s:0x%08X>" % [typename, addr]
    })
  end
end

Public Instance Methods

self + elem_num → new pointer object click to toggle source
# File lib/gogyou/accessor.rb, line 356
def +(elem_num)
  raise NotImplementedError, "this method is shall be defined in sub-class"
end
-(off) click to toggle source
# File lib/gogyou/accessor.rb, line 360
def -(off)
  send(:+, -off.to_i)
end
pretty_print(q) click to toggle source
# File lib/gogyou/accessor.rb, line 364
def pretty_print(q)
  q.text inspect
end