# File lib/ffi/autopointer.rb, line 116 def self.from_native(val, ctx) self.new(val) end
# 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
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
Generated with the Darkfish Rdoc Generator 2.