class FFI::AutoPointer

Public Class Methods

from_native(val, ctx) click to toggle source
# File lib/ffi/autopointer.rb, line 116
def self.from_native(val, ctx)
  self.new(val)
end
native_type() click to toggle source
# File lib/ffi/autopointer.rb, line 111
def self.native_type
  raise RuntimeError.new("no release method defined for #{self.inspect}") unless self.respond_to?(:release)
  Type::POINTER
end
new(pointer, method) → the passed Method will be invoked at GC time click to toggle source
new(pointer, proc) → the passed Proc will be invoked at GC time (SEE WARNING BELOW!)
new(pointer) { |p| ... } → the passed block will be invoked at GC time (SEE WARNING BELOW!)
new(pointer) → the pointer's release() class method will be invoked at GC time

WARNING: passing a proc may cause your pointer to never be GC'd, unless you're careful to avoid trapping a reference to the pointer in the proc. See the test specs for examples. WARNING: passing a block will cause your pointer to never be GC'd. This is bad.

Please note that the safest, and therefore preferred, calling idiom is to pass a Method as the second parameter. Example usage:

class PointerHelper
  def self.release(pointer)
    ...
  end
end

p = AutoPointer.new(other_pointer, PointerHelper.method(:release))

The above code will cause PointerHelper#release to be invoked at GC time.

The last calling idiom (only one parameter) is generally only going to be useful if you subclass AutoPointer, and override release(), which by default does nothing.

# File lib/ffi/autopointer.rb, line 52
def initialize(ptr, proc=nil, &block)
  super(ptr)
  raise TypeError, "Invalid pointer" if ptr.nil? || !ptr.kind_of?(Pointer)          || ptr.kind_of?(MemoryPointer) || ptr.kind_of?(AutoPointer)

  @releaser = if proc
                raise RuntimeError.new("proc must be callable") unless proc.respond_to?(:call)
                CallableReleaser.new(ptr, proc)

              else
                raise RuntimeError.new("no release method defined") unless self.class.respond_to?(:release)
                DefaultReleaser.new(ptr, self.class)
              end

  ObjectSpace.define_finalizer(self, @releaser)
  self
end

Public Instance Methods

autorelease=(autorelease) click to toggle source
# File lib/ffi/autopointer.rb, line 74
def autorelease=(autorelease)
  @releaser.autorelease=(autorelease)
end
free() click to toggle source
# File lib/ffi/autopointer.rb, line 70
def free
  @releaser.free
end