# File lib/gir_ffi/arg_helper.rb, line 108 def self.allocate_array_of_type type, length AllocationHelper.safe_malloc FFI.type_size(type) * length end
# File lib/gir_ffi/arg_helper.rb, line 123 def self.cast_from_pointer type, it case type when :utf8, :filename ptr_to_utf8 it when :gint32 cast_pointer_to_int32 it else it.address end end
# File lib/gir_ffi/arg_helper.rb, line 142 def self.cast_pointer_to_int32 ptr cast_uint32_to_int32(ptr.address & 0xffffffff) end
# File lib/gir_ffi/arg_helper.rb, line 134 def self.cast_uint32_to_int32 val if val >= 0x80000000 -(0x100000000-val) else val end end
# File lib/gir_ffi/arg_helper.rb, line 97 def self.check_error errpp err = GLib::Error.wrap(errpp.read_pointer) raise err.message unless err.nil? end
# File lib/gir_ffi/arg_helper.rb, line 102 def self.check_fixed_array_size size, arr, name unless arr.size == size raise ArgumentError, "#{name} should have size #{size}" end end
# File lib/gir_ffi/arg_helper.rb, line 112 def self.object_pointer_to_object optr gtype = GObject.type_from_instance_pointer optr wrap_object_pointer_by_gtype optr, gtype end
FIXME: Hideous TODO: Move this implementation to InPointer
# File lib/gir_ffi/arg_helper.rb, line 19 def self.object_to_inptr obj return obj.to_ptr if obj.respond_to? :to_ptr return nil if obj.nil? return obj if obj.is_a? FFI::Pointer FFI::Pointer.new(obj.object_id).tap {|ptr| OBJECT_STORE[ptr.address] = obj } end
# File lib/gir_ffi/arg_helper.rb, line 60 def self.ptr_to_interface_array klass, ptr, size return [] if ptr.nil? or ptr.null? struct_size = klass.ffi_structure.size size.times.map do |idx| klass.wrap(ptr + struct_size * idx) end end
# File lib/gir_ffi/arg_helper.rb, line 68 def self.ptr_to_interface_pointer_array klass, ptr, size return [] if ptr.nil? or ptr.null? ptrs = ptr.read_array_of_pointer(size) ptrs.map do |optr| klass.wrap(optr) end end
# File lib/gir_ffi/arg_helper.rb, line 28 def self.ptr_to_typed_array type, ptr, size if type.is_a? Class ptr_to_interface_array type, ptr, size elsif type.is_a? Array ptr_to_interface_pointer_array type[1], ptr, size elsif type == :utf8 ptr_to_utf8_array ptr, size else self.send "ptr_to_#{type}_array", ptr, size end end
# File lib/gir_ffi/arg_helper.rb, line 77 def self.ptr_to_utf8 ptr ptr.null? ? nil : ptr.read_string end
# File lib/gir_ffi/arg_helper.rb, line 54 def self.ptr_to_utf8_array ptr, size return [] if ptr.nil? or ptr.null? ptrs = ptr.read_array_of_pointer(size) ptrs.map { |pt| ptr_to_utf8 pt } end
# File lib/gir_ffi/arg_helper.rb, line 86 def self.ptr_to_utf8_length ptr, len ptr.null? ? nil : ptr.read_string(len) end
# File lib/gir_ffi/arg_helper.rb, line 40 def self.setup_ptr_to_type_array_handler_for *types types.flatten.each do |type| ffi_type = TypeMap.map_basic_type type defn = "def self.ptr_to_#{type}_array ptr, size return [] if ptr.nil? or ptr.null? ptr.get_array_of_#{ffi_type}(0, size) end" eval defn end end
# File lib/gir_ffi/arg_helper.rb, line 117 def self.wrap_object_pointer_by_gtype optr, gtype return nil if optr.null? klass = Builder.build_by_gtype gtype klass.direct_wrap optr end