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 29 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) end
new(&block)
click to toggle source
# File lib/ffi-gobject/ruby_closure.rb, line 20 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 44 def invoke_block(*args) block.call(*args) end
Private Instance Methods
block()
click to toggle source
# File lib/ffi-gobject/ruby_closure.rb, line 57 def block BLOCK_STORE[struct[:block_id]] end
block=(block)
click to toggle source
@api private
# File lib/ffi-gobject/ruby_closure.rb, line 51 def block=(block) id = block.object_id BLOCK_STORE[id] = block struct[:block_id] = id end