Class: GirFFI::Builders::MappingMethodBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/gir_ffi/builders/mapping_method_builder.rb

Overview

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argument_builder_collection) ⇒ MappingMethodBuilder

Returns a new instance of MappingMethodBuilder.



31
32
33
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 31

def initialize argument_builder_collection
  @argument_builder_collection = argument_builder_collection
end

Class Method Details

.for_callback(argument_infos, return_value_info) ⇒ Object



11
12
13
14
15
16
17
18
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 11

def self.for_callback argument_infos, return_value_info
  vargen = VariableNameGenerator.new

  argument_builders = argument_infos.map {|arg| CallbackArgumentBuilder.new vargen, arg }
  return_value_builder = CallbackReturnValueBuilder.new(vargen, return_value_info)

  new ArgumentBuilderCollection.new(return_value_builder, argument_builders)
end

.for_vfunc(receiver_info, argument_infos, return_value_info) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 20

def self.for_vfunc receiver_info, argument_infos, return_value_info
  vargen = VariableNameGenerator.new

  receiver_builder = CallbackArgumentBuilder.new vargen, receiver_info
  argument_builders = argument_infos.map {|arg| CallbackArgumentBuilder.new vargen, arg }
  return_value_builder = CallbackReturnValueBuilder.new(vargen, return_value_info)

  new ArgumentBuilderCollection.new(return_value_builder, argument_builders,
                                    receiver_builder: receiver_builder)
end

Instance Method Details

#call_to_procObject



56
57
58
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 56

def call_to_proc
  ["#{capture}_proc.call(#{@argument_builder_collection.call_argument_names.join(', ')})"]
end

#captureObject



60
61
62
63
64
65
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 60

def capture
  @capture ||= begin
                 names = @argument_builder_collection.capture_variable_names
                 names.any? ? "#{names.join(", ")} = " : ""
               end
end

#method_argumentsObject



67
68
69
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 67

def method_arguments
  @method_arguments ||= @argument_builder_collection.method_argument_names.dup.unshift('_proc')
end

#method_definitionObject



35
36
37
38
39
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 35

def method_definition
  code = "def self.call_with_argument_mapping(#{method_arguments.join(', ')})"
  method_lines.each { |line| code << "\n  #{line}" }
  code << "\nend\n"
end

#method_linesObject



41
42
43
44
45
46
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 41

def method_lines
  @argument_builder_collection.parameter_preparation +
    call_to_proc +
    @argument_builder_collection.return_value_conversion +
    return_value
end

#return_valueObject



48
49
50
51
52
53
54
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 48

def return_value
  if (name = @argument_builder_collection.return_value_name)
    ["return #{name}"]
  else
    []
  end
end