Sha256: 700b4fc857c9276ffd53f78deb0c850cc1953c7e7ef8d1bfe4cbc782698e5e99

Contents?: true

Size: 1.8 KB

Versions: 9

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true
require 'gir_ffi/variable_name_generator'
require 'gir_ffi/builders/closure_argument_builder'
require 'gir_ffi/builders/closure_return_value_builder'
require 'gir_ffi/builders/argument_builder_collection'
require 'gir_ffi/builders/method_template'

module GirFFI
  module Builders
    # Implements the creation mapping method for a signal
    # handler. This method converts arguments from C to Ruby, and the
    # result from Ruby to C.
    class MarshallingMethodBuilder < BaseMethodBuilder
      def self.for_signal(receiver_info, info)
        new receiver_info, info
      end

      def initialize(receiver_info, info)
        super(info, ClosureReturnValueBuilder,
              receiver_info: receiver_info,
              argument_builder_class: ClosureArgumentBuilder)
      end

      ## Methods used by MethodTemplate

      def method_name
        'marshaller'
      end

      def method_arguments
        %w(closure return_value param_values _invocation_hint _marshal_data)
      end

      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

      def invocation
        "wrap(closure.to_ptr).invoke_block(#{call_argument_list})"
      end

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

      def singleton_method?
        true
      end

      private

      def call_argument_list
        @argument_builder_collection.call_argument_names.join(', ')
      end

      def param_names
        @param_names ||= @argument_builder_collection.method_argument_names
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
gir_ffi-0.11.1 lib/gir_ffi/builders/marshalling_method_builder.rb
gir_ffi-0.11.0 lib/gir_ffi/builders/marshalling_method_builder.rb
gir_ffi-0.10.2 lib/gir_ffi/builders/marshalling_method_builder.rb
gir_ffi-0.10.1 lib/gir_ffi/builders/marshalling_method_builder.rb
gir_ffi-0.10.0 lib/gir_ffi/builders/marshalling_method_builder.rb
gir_ffi-0.10.0.pre1 lib/gir_ffi/builders/marshalling_method_builder.rb
gir_ffi-0.9.5 lib/gir_ffi/builders/marshalling_method_builder.rb
gir_ffi-0.9.4 lib/gir_ffi/builders/marshalling_method_builder.rb
gir_ffi-0.9.3 lib/gir_ffi/builders/marshalling_method_builder.rb