/usr/lib/ruby/vendor_ruby/gir_ffi/in_out_pointer.rb is in ruby-gir-ffi 0.9.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | module GirFFI
# The InOutPointer class handles conversion between ruby types and
# pointers for arguments with direction :inout and :out.
#
# TODO: This has now become a more general extended pointer class and should be renamed.
class InOutPointer < FFI::Pointer
attr_reader :value_type
def initialize(type, ptr = nil)
@value_type = type
ptr ||= AllocationHelper.safe_malloc(value_type_size)
super ptr
end
# TODO: Create type classes that extract values from pointers.
def to_value
case value_ffi_type
when Module
value_ffi_type.get_value_from_pointer(self, 0)
when Symbol
send("get_#{value_ffi_type}", 0)
else
raise NotImplementedError
end
end
# Convert more fully to a ruby value than #to_value
def to_ruby_value
bare_value = to_value
case value_type
when :utf8
bare_value.to_utf8
when Array
value_type[1].wrap bare_value
when Class
value_type.wrap bare_value
else
bare_value
end
end
def set_value(value)
case value_ffi_type
when Module
value_ffi_type.copy_value_to_pointer(value, self)
when Symbol
send "put_#{value_ffi_type}", 0, value
else
raise NotImplementedError, value_ffi_type
end
end
def clear
put_bytes 0, "\x00" * value_type_size, 0, value_type_size
end
def self.for(type)
new(type).tap(&:clear)
end
def self.from(type, value)
new(type).tap { |ptr| ptr.set_value value }
end
private
def value_ffi_type
@value_ffi_type ||= TypeMap.type_specification_to_ffi_type value_type
end
def value_type_size
@value_type_size ||= FFI.type_size value_ffi_type
end
end
end
|