class GObject::RubyClosure

Encapsulates Ruby blocks as GObject Closures.

Constants

BLOCK_STORE

@api private

Public Class Methods

marshaller(closure, return_value, param_values, _invocation_hint, _marshal_data) click to toggle source

@api private

# File lib/ffi-gobject/ruby_closure.rb, line 27
def self.marshaller(closure, return_value, param_values, _invocation_hint,
                    _marshal_data)
  # TODO: Improve by registering RubyClosure as a GObject type
  rclosure = wrap(closure.to_ptr)
  param_values ||= []

  args = param_values.map(&:get_value)

  result = rclosure.invoke_block(*args)

  return_value.set_value(result) if return_value
end
new(&block) click to toggle source
# File lib/ffi-gobject/ruby_closure.rb, line 18
def initialize(&block)
  raise ArgumentError unless block_given?

  initialize_simple(self.class::Struct.size, nil)
  self.block = block
  set_marshal proc { |*args| self.class.marshaller(*args) }
end

Public Instance Methods

invoke_block(*args) click to toggle source

@api private TODO: Re-structure so #invoke_block can become a private method

# File lib/ffi-gobject/ruby_closure.rb, line 42
def invoke_block(*args)
  block.call(*args)
end

Private Instance Methods

block() click to toggle source
# File lib/ffi-gobject/ruby_closure.rb, line 55
def block
  BLOCK_STORE[@struct[:block_id]]
end
block=(block) click to toggle source

@api private

# File lib/ffi-gobject/ruby_closure.rb, line 49
def block=(block)
  id = block.object_id
  BLOCK_STORE[id] = block
  @struct[:block_id] = id
end