class GirFFI::Builders::MarshallingMethodBuilder

Implements the creation mapping method for a signal handler. This method converts arguments from C to Ruby, and the result from Ruby to C.

TODO: Inherit from BaseMethodBuilder

Public Class Methods

for_signal(receiver_info, argument_infos, return_value_info) click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 15
def self.for_signal(receiver_info, argument_infos, return_value_info)
  new receiver_info, argument_infos, return_value_info
end
new(receiver_info, argument_infos, return_value_info) click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 19
def initialize(receiver_info, argument_infos, return_value_info)
  receiver_builder = make_argument_builder receiver_info
  argument_builders = argument_infos.map { |arg| make_argument_builder arg }
  return_value_builder =
    ClosureReturnValueBuilder.new(variable_generator, return_value_info)

  @argument_builder_collection =
    ArgumentBuilderCollection.new(return_value_builder, argument_builders,
                                  receiver_builder: receiver_builder)
  @template = MethodTemplate.new(self, @argument_builder_collection)
end

Public Instance Methods

invocation() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 51
def invocation
  "wrap(closure.to_ptr).invoke_block(#{call_argument_list})"
end
method_arguments() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 39
def method_arguments
  %w(closure return_value param_values _invocation_hint _marshal_data)
end
method_definition() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 31
def method_definition
  @template.method_definition
end
method_name() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 35
def method_name
  'marshaller'
end
preparation() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 43
def preparation
  if param_names.size == 1
    ["#{param_names.first} = param_values.first.get_value_plain"]
  else
    ["#{param_names.join(', ')} = param_values.map(&:get_value_plain)"]
  end
end
result() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 55
def result
  if (name = @argument_builder_collection.return_value_name)
    ["return_value.set_value #{name}"]
  else
    []
  end
end
singleton_method?() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 63
def singleton_method?
  true
end

Private Instance Methods

call_argument_list() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 69
def call_argument_list
  @argument_builder_collection.call_argument_names.join(', ')
end
make_argument_builder(argument_info) click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 81
def make_argument_builder(argument_info)
  ClosureArgumentBuilder.new variable_generator, argument_info
end
param_names() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 73
def param_names
  @param_names ||= @argument_builder_collection.method_argument_names
end
variable_generator() click to toggle source
# File lib/gir_ffi/builders/marshalling_method_builder.rb, line 77
def variable_generator
  @variable_generator ||= VariableNameGenerator.new
end