Sha256: 0ef2e1b1b065f8f032fa282ea6b2539fc6daa5f78982dca78acdf16be1be3256

Contents?: true

Size: 1.56 KB

Versions: 3

Compression:

Stored size: 1.56 KB

Contents

require 'gir_ffi/type_base'

module GirFFI
  # Base module for callbacks.
  class CallbackBase < Proc
    extend TypeBase
    extend FFI::DataConverter

    def self.native_type
      FFI::Type::POINTER
    end

    def self.from_native(value, _context)
      return nil if !value || value.null?
      FFI::Function.new gir_ffi_builder.return_type, gir_ffi_builder.argument_types, value
    end

    def self.to_native(value, _context)
      return nil unless value
      return value if FFI::Function === value
      value.to_native
    end

    CALLBACKS = []

    def self.store_callback prc
      CALLBACKS << prc
    end

    # Create Callback from a Proc. Makes sure arguments are properly wrapped,
    # and the callback is stored to prevent garbage collection.
    def self.from prc
      wrap_in_callback_args_mapper(prc).tap do |cb|
        store_callback cb
      end
    end

    def self.wrap_in_callback_args_mapper prc
      return nil unless prc
      return prc if FFI::Function === prc
      return self.new do |*args|
        call_with_argument_mapping(prc, *args)
      end
    end

    def self.to_ffitype
      self
    end

    def to_native
      @to_native ||= begin
                       builder = self.class.gir_ffi_builder
                       FFI::Function.new builder.return_type, builder.argument_types, self
                     end
    end

    def self.copy_value_to_pointer value, pointer
      pointer.put_pointer 0, to_native(value, nil)
    end

    def self.get_value_from_pointer pointer
      from_native pointer.get_pointer(0), nil
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
gir_ffi-0.7.2 lib/gir_ffi/callback_base.rb
gir_ffi-0.7.1 lib/gir_ffi/callback_base.rb
gir_ffi-0.7.0 lib/gir_ffi/callback_base.rb