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.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(return_type_info, vargen, argument_builders) ⇒ MappingMethodBuilder

Returns a new instance of MappingMethodBuilder.



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

def initialize return_type_info, vargen, argument_builders
  @vargen = vargen
  @argument_builders = argument_builders

  @return_type_info = return_type_info
end

Instance Attribute Details

#argument_buildersObject (readonly)

Returns the value of attribute argument_builders.



74
75
76
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 74

def argument_builders
  @argument_builders
end

#return_type_infoObject (readonly)

Returns the value of attribute return_type_info.



72
73
74
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 72

def return_type_info
  @return_type_info
end

#vargenObject (readonly)

Returns the value of attribute vargen.



73
74
75
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 73

def vargen
  @vargen
end

Class Method Details

.for_callback(argument_infos, return_type_info) ⇒ Object



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

def self.for_callback argument_infos, return_type_info
  vargen = VariableNameGenerator.new
  argument_builders = argument_infos.map {|arg|
    CallbackArgumentBuilder.new vargen, arg }
  set_up_argument_relations argument_infos, argument_builders
  new return_type_info, vargen, argument_builders
end

.for_signal(receiver_info, argument_infos, user_data_info, return_type_info) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 18

def self.for_signal receiver_info, argument_infos, user_data_info, return_type_info
  vargen = VariableNameGenerator.new

  receiver_builder = CallbackArgumentBuilder.new vargen, receiver_info
  argument_builders = argument_infos.map {|arg|
    CallbackArgumentBuilder.new vargen, arg }
  user_data_builder = CallbackArgumentBuilder.new vargen, user_data_info

  set_up_argument_relations argument_infos, argument_builders
  user_data_builder.is_closure = true

  argument_builders.unshift receiver_builder
  argument_builders.push user_data_builder

  new return_type_info, vargen, argument_builders
end

.for_vfunc(receiver_info, argument_infos, return_type_info) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 35

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

  receiver_builder = CallbackArgumentBuilder.new vargen, receiver_info
  argument_builders = argument_infos.map {|arg|
    CallbackArgumentBuilder.new vargen, arg }

  set_up_argument_relations argument_infos, argument_builders

  argument_builders.unshift receiver_builder

  new return_type_info, vargen, argument_builders
end

.set_up_argument_relations(argument_infos, argument_builders) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 49

def self.set_up_argument_relations argument_infos, argument_builders
  argument_infos.each do |arg|
    if (idx = arg.closure) >= 0
      argument_builders[idx].is_closure = true
    end
  end
  argument_builders.each do |bldr|
    if (idx = bldr.array_length_idx) >= 0
      other = argument_builders[idx]

      bldr.length_arg = other
      other.array_arg = bldr
    end
  end
end

Instance Method Details

#all_buildersObject



118
119
120
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 118

def all_builders
  @all_builders ||= [return_value_builder] + argument_builders
end

#call_argumentsObject



122
123
124
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 122

def call_arguments
  @call_arguments ||= argument_builders.map(&:call_argument_name).compact
end

#call_to_procObject



98
99
100
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 98

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

#captureObject



107
108
109
110
111
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 107

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

#capture_variable_namesObject



113
114
115
116
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 113

def capture_variable_names
  @capture_variable_names ||=
    all_builders.map(&:capture_variable_name).compact
end

#method_argumentsObject



126
127
128
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 126

def method_arguments
  @method_arguments ||= argument_builders.map(&:method_argument_name).unshift('_proc')
end

#method_definitionObject



76
77
78
79
80
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 76

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



82
83
84
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 82

def method_lines
  parameter_preparation + call_to_proc + return_value_conversion + return_value
end

#parameter_preparationObject



102
103
104
105
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 102

def parameter_preparation
  argument_builders.sort_by {|arg|
    arg.type_info.array_length}.map(&:pre_conversion).flatten
end

#return_valueObject



86
87
88
89
90
91
92
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 86

def return_value
  if return_value_builder.is_relevant?
    ["return #{return_value_builder.return_value_name}"]
  else
    []
  end
end

#return_value_builderObject



134
135
136
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 134

def return_value_builder
  @return_value_builder ||= CallbackReturnValueBuilder.new(vargen, return_value_info)
end

#return_value_conversionObject



94
95
96
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 94

def return_value_conversion
  all_builders.map(&:post_conversion).flatten
end

#return_value_infoObject



130
131
132
# File 'lib/gir_ffi/builders/mapping_method_builder.rb', line 130

def return_value_info
  @return_value_info ||= ReturnValueInfo.new(return_type_info)
end