Module: GirFFI::InfoExt::ITypeInfo
- Included in:
- GObjectIntrospection::ITypeInfo, ErrorTypeInfo, ReceiverTypeInfo, UserDefinedPropertyInfo::UserDefinedTypeInfo
- Defined in:
- lib/gir_ffi/info_ext/i_type_info.rb
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
-
#argument_class_name ⇒ Object
TODO: Use class rather than class name.
- #element_type ⇒ Object
- #extra_conversion_arguments ⇒ Object
- #flattened_tag ⇒ Object
- #gtype ⇒ Object
- #gvalue? ⇒ Boolean
- #hidden_struct_type? ⇒ Boolean
- #interface_class ⇒ Object
- #interface_class_name ⇒ Object
- #interface_type ⇒ Object
- #make_g_value ⇒ Object
- #needs_c_to_ruby_conversion_for_callbacks? ⇒ Boolean
- #needs_c_to_ruby_conversion_for_closures? ⇒ Boolean
- #needs_c_to_ruby_conversion_for_functions? ⇒ Boolean
- #needs_c_to_ruby_conversion_for_properties? ⇒ Boolean
- #needs_ruby_to_c_conversion_for_callbacks? ⇒ Boolean
- #needs_ruby_to_c_conversion_for_closures? ⇒ Boolean
- #needs_ruby_to_c_conversion_for_functions? ⇒ Boolean
- #needs_ruby_to_c_conversion_for_properties? ⇒ Boolean
- #tag_or_class ⇒ Object
- #to_callback_ffi_type ⇒ Object
- #to_ffi_type ⇒ Object
Instance Method Details
#argument_class_name ⇒ Object
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_type ⇒ Object
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_arguments ⇒ Object
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_tag ⇒ Object
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 |
#gtype ⇒ Object
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
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
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_class ⇒ Object
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_name ⇒ Object
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_type ⇒ Object
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_value ⇒ Object
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
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
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
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
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
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
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
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
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_class ⇒ Object
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_type ⇒ Object
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_type ⇒ Object
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 |