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