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.
Class Method Summary collapse
- .for_callback(argument_infos, return_value_info) ⇒ Object
- .for_vfunc(receiver_info, argument_infos, return_value_info) ⇒ Object
Instance Method Summary collapse
- #call_to_proc ⇒ Object
- #capture ⇒ Object
-
#initialize(argument_builder_collection) ⇒ MappingMethodBuilder
constructor
A new instance of MappingMethodBuilder.
- #method_arguments ⇒ Object
- #method_definition ⇒ Object
- #method_lines ⇒ Object
- #return_value ⇒ Object
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_proc ⇒ Object
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 |
#capture ⇒ Object
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_arguments ⇒ Object
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_definition ⇒ Object
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_lines ⇒ Object
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_value ⇒ Object
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 |