Class: GirFFI::Builders::MappingMethodBuilder
- Inherits:
-
Object
- Object
- GirFFI::Builders::MappingMethodBuilder
- 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
-
#argument_builders ⇒ Object
readonly
Returns the value of attribute argument_builders.
-
#return_type_info ⇒ Object
readonly
Returns the value of attribute return_type_info.
-
#vargen ⇒ Object
readonly
Returns the value of attribute vargen.
Class Method Summary collapse
- .for_callback(argument_infos, return_type_info) ⇒ Object
- .for_signal(receiver_info, argument_infos, user_data_info, return_type_info) ⇒ Object
- .for_vfunc(receiver_info, argument_infos, return_type_info) ⇒ Object
- .set_up_argument_relations(argument_infos, argument_builders) ⇒ Object
Instance Method Summary collapse
- #all_builders ⇒ Object
- #call_arguments ⇒ Object
- #call_to_proc ⇒ Object
- #capture ⇒ Object
- #capture_variable_names ⇒ Object
-
#initialize(return_type_info, vargen, argument_builders) ⇒ MappingMethodBuilder
constructor
A new instance of MappingMethodBuilder.
- #method_arguments ⇒ Object
- #method_definition ⇒ Object
- #method_lines ⇒ Object
- #parameter_preparation ⇒ Object
- #return_value ⇒ Object
- #return_value_builder ⇒ Object
- #return_value_conversion ⇒ Object
- #return_value_info ⇒ Object
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_builders ⇒ Object (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_info ⇒ Object (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 |
#vargen ⇒ Object (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_builders ⇒ Object
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_arguments ⇒ Object
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_proc ⇒ Object
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 |
#capture ⇒ Object
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_names ⇒ Object
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_arguments ⇒ Object
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_definition ⇒ Object
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_lines ⇒ Object
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_preparation ⇒ Object
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_value ⇒ Object
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_builder ⇒ Object
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_conversion ⇒ Object
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_info ⇒ Object
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 |