Module: GirFFI::InfoExt::ITypeInfo

Overview

Extensions for GObjectIntrospection::ITypeInfo needed by GirFFI

Constant Summary collapse

FLATTENED_TAG_TO_GTYPE_MAP =
{
  gboolean: GObject::TYPE_BOOLEAN,
  gint32: GObject::TYPE_INT,
  gint64: GObject::TYPE_INT64,
  guint64: GObject::TYPE_UINT64,
  void: GObject::TYPE_NONE
}.freeze
FLATTENED_TAG_POINTER_TO_GTYPE_MAP =
{
  array: GObject::TYPE_ARRAY,
  ghash: GObject::TYPE_HASH_TABLE,
  strv: GObject::TYPE_STRV,
  utf8: GObject::TYPE_STRING
}.freeze
TAG_TO_WRAPPER_CLASS_MAP =
{
  array: "GLib::Array",
  byte_array: "GLib::ByteArray",
  c: "GirFFI::SizedArray",
  error: "GLib::Error",
  ghash: "GLib::HashTable",
  glist: "GLib::List",
  gslist: "GLib::SList",
  ptr_array: "GLib::PtrArray",
  strv: "GLib::Strv",
  utf8: "GirFFI::InPointer", # TODO: Create a string-like class
  void: "GirFFI::InPointer", # TODO: Create a void-pointer class
  zero_terminated: "GirFFI::ZeroTerminated"
}.freeze
TAGS_NEEDING_RUBY_TO_C_CONVERSION =
[
  :array, :c, :callback, :error, :ghash, :glist, :gslist, :object,
  :ptr_array, :struct, :strv, :utf8, :zero_terminated
].freeze
TAGS_NEEDING_C_TO_RUBY_CONVERSION =
[
  :array, :byte_array, :c, :error, :filename, :ghash, :glist, :gslist,
  :interface, :object, :ptr_array, :struct, :strv, :union, :utf8,
  :zero_terminated
].freeze
GOBJECT_VALUE_NAME =
"GObject::Value"

Instance Method Summary collapse

Instance Method Details

#argument_class_nameObject

TODO: Use class rather than class name



103
104
105
106
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 103

def argument_class_name
  interface_class_name ||
    TAG_TO_WRAPPER_CLASS_MAP[flattened_tag]
end

#element_typeObject



38
39
40
41
42
43
44
45
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 38

def element_type
  case tag
  when :glist, :gslist, :array, :c
    enumerable_element_type
  when :ghash
    dictionary_element_type
  end
end

#extra_conversion_argumentsObject



185
186
187
188
189
190
191
192
193
194
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 185

def extra_conversion_arguments
  case flattened_tag
  when :c
    [element_type, array_fixed_size]
  when :array, :ghash, :glist, :gslist, :ptr_array, :zero_terminated
    [element_type]
  else
    []
  end
end

#flattened_tagObject



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 47

def flattened_tag
  @flattened_tag ||=
    case tag
    when :interface
      interface_type
    when :array
      flattened_array_type
    else
      tag
    end
end

#gtypeObject



24
25
26
27
28
29
30
31
32
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 24

def gtype
  return interface.gtype if tag == :interface

  if pointer?
    FLATTENED_TAG_POINTER_TO_GTYPE_MAP.fetch(flattened_tag, GObject::TYPE_POINTER)
  else
    FLATTENED_TAG_TO_GTYPE_MAP.fetch(flattened_tag)
  end
end

#gvalue?Boolean

Returns:



198
199
200
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 198

def gvalue?
  argument_class_name == GOBJECT_VALUE_NAME
end

#hidden_struct_type?Boolean

Returns:



63
64
65
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 63

def hidden_struct_type?
  flattened_tag == :struct && interface.empty?
end

#interface_classObject



83
84
85
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 83

def interface_class
  @interface_class ||= Builder.build_class interface if tag == :interface
end

#interface_class_nameObject



108
109
110
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 108

def interface_class_name
  interface.full_name if tag == :interface
end

#interface_typeObject



59
60
61
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 59

def interface_type
  tag == :interface && interface.info_type
end

#make_g_valueObject



34
35
36
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 34

def make_g_value
  GObject::Value.for_gtype gtype
end

#needs_c_to_ruby_conversion_for_callbacks?Boolean

Returns:



163
164
165
166
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 163

def needs_c_to_ruby_conversion_for_callbacks?
  [:callback, :enum].include?(flattened_tag) ||
    needs_c_to_ruby_conversion_for_functions?
end

#needs_c_to_ruby_conversion_for_closures?Boolean

Returns:



168
169
170
171
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 168

def needs_c_to_ruby_conversion_for_closures?
  [:array, :c, :error, :ghash, :glist, :ptr_array, :struct, :strv]
    .include?(flattened_tag)
end

#needs_c_to_ruby_conversion_for_functions?Boolean

Returns:



154
155
156
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 154

def needs_c_to_ruby_conversion_for_functions?
  TAGS_NEEDING_C_TO_RUBY_CONVERSION.include?(flattened_tag)
end

#needs_c_to_ruby_conversion_for_properties?Boolean

Returns:



181
182
183
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 181

def needs_c_to_ruby_conversion_for_properties?
  [:glist, :ghash, :callback].include?(flattened_tag)
end

#needs_ruby_to_c_conversion_for_callbacks?Boolean

Returns:



158
159
160
161
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 158

def needs_ruby_to_c_conversion_for_callbacks?
  [:enum].include?(flattened_tag) ||
    needs_ruby_to_c_conversion_for_functions?
end

#needs_ruby_to_c_conversion_for_closures?Boolean

Returns:



173
174
175
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 173

def needs_ruby_to_c_conversion_for_closures?
  [:array].include?(flattened_tag)
end

#needs_ruby_to_c_conversion_for_functions?Boolean

Returns:



150
151
152
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 150

def needs_ruby_to_c_conversion_for_functions?
  TAGS_NEEDING_RUBY_TO_C_CONVERSION.include?(flattened_tag)
end

#needs_ruby_to_c_conversion_for_properties?Boolean

Returns:



177
178
179
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 177

def needs_ruby_to_c_conversion_for_properties?
  [:glist, :ghash, :strv, :callback].include?(flattened_tag)
end

#tag_or_classObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 67

def tag_or_class
  base = case tag
         when :interface
           interface_class
         when :ghash
           [tag, *element_type]
         else
           flattened_tag
         end
  if pointer? && tag != :utf8 && tag != :filename
    [:pointer, base]
  else
    base
  end
end

#to_callback_ffi_typeObject



125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 125

def to_callback_ffi_type
  return :pointer if pointer?

  case tag
  when :interface
    interface.to_callback_ffi_type
  when :gboolean
    # TODO: Move this logic into TypeMap
    :bool
  else
    TypeMap.map_basic_type tag
  end
end

#to_ffi_typeObject



112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/gir_ffi/info_ext/i_type_info.rb', line 112

def to_ffi_type
  return :pointer if pointer?

  case tag
  when :interface
    interface.to_ffi_type
  when :array
    [subtype_ffi_type(0), array_fixed_size]
  else
    TypeMap.map_basic_type tag
  end
end