gir_ffi 0.6.7 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/{History.txt → Changelog.md} +93 -61
  3. data/{DESIGN.rdoc → DESIGN.md} +7 -7
  4. data/README.md +5 -7
  5. data/TODO.md +90 -0
  6. data/lib/ffi-glib.rb +0 -1
  7. data/lib/ffi-glib/array.rb +13 -29
  8. data/lib/ffi-glib/array_methods.rb +13 -0
  9. data/lib/ffi-glib/container_class_methods.rb +6 -1
  10. data/lib/ffi-glib/hash_table.rb +3 -2
  11. data/lib/ffi-glib/list.rb +3 -17
  12. data/lib/ffi-glib/list_methods.rb +22 -3
  13. data/lib/ffi-glib/ptr_array.rb +19 -19
  14. data/lib/ffi-glib/s_list.rb +3 -17
  15. data/lib/ffi-gobject.rb +10 -17
  16. data/lib/ffi-gobject/object.rb +19 -9
  17. data/lib/ffi-gobject/object_class.rb +14 -0
  18. data/lib/ffi-gobject/ruby_closure.rb +4 -5
  19. data/lib/ffi-gobject/value.rb +7 -5
  20. data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
  21. data/lib/gir_ffi-base.rb +0 -2
  22. data/lib/gir_ffi-base/gobject.rb +1 -0
  23. data/lib/gir_ffi-base/gobject/lib.rb +1 -1
  24. data/lib/gir_ffi.rb +2 -0
  25. data/lib/gir_ffi/arg_helper.rb +18 -8
  26. data/lib/gir_ffi/builders/argument_builder.rb +62 -55
  27. data/lib/gir_ffi/builders/base_argument_builder.rb +52 -106
  28. data/lib/gir_ffi/builders/base_type_builder.rb +3 -3
  29. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +34 -0
  30. data/lib/gir_ffi/builders/callback_argument_builder.rb +73 -0
  31. data/lib/gir_ffi/builders/callback_builder.rb +19 -9
  32. data/lib/gir_ffi/builders/callback_return_value_builder.rb +54 -0
  33. data/lib/gir_ffi/builders/closure_convertor.rb +9 -0
  34. data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +9 -0
  35. data/lib/gir_ffi/builders/constructor_result_convertor.rb +9 -0
  36. data/lib/gir_ffi/builders/enum_builder.rb +16 -16
  37. data/lib/gir_ffi/builders/field_builder.rb +36 -15
  38. data/lib/gir_ffi/builders/function_builder.rb +32 -27
  39. data/lib/gir_ffi/builders/interface_builder.rb +14 -4
  40. data/lib/gir_ffi/builders/mapping_method_builder.rb +95 -43
  41. data/lib/gir_ffi/builders/module_builder.rb +22 -35
  42. data/lib/gir_ffi/builders/null_convertor.rb +9 -0
  43. data/lib/gir_ffi/builders/object_builder.rb +11 -14
  44. data/lib/gir_ffi/builders/property_builder.rb +107 -9
  45. data/lib/gir_ffi/builders/registered_type_builder.rb +2 -2
  46. data/lib/gir_ffi/builders/return_value_builder.rb +42 -33
  47. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +15 -0
  48. data/lib/gir_ffi/builders/signal_builder.rb +18 -58
  49. data/lib/gir_ffi/builders/struct_builder.rb +1 -2
  50. data/lib/gir_ffi/builders/type_builder.rb +1 -0
  51. data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -4
  52. data/lib/gir_ffi/builders/user_defined_builder.rb +151 -26
  53. data/lib/gir_ffi/builders/vfunc_builder.rb +57 -0
  54. data/lib/gir_ffi/builders/with_layout.rb +10 -8
  55. data/lib/gir_ffi/builders/with_methods.rb +1 -1
  56. data/lib/gir_ffi/callback_base.rb +42 -8
  57. data/lib/gir_ffi/class_base.rb +1 -2
  58. data/lib/gir_ffi/enum_base.rb +26 -4
  59. data/lib/gir_ffi/error_argument_info.rb +21 -0
  60. data/lib/gir_ffi/{setter_argument_info.rb → field_argument_info.rb} +2 -1
  61. data/lib/gir_ffi/g_type.rb +25 -0
  62. data/lib/gir_ffi/in_out_pointer.rb +3 -14
  63. data/lib/gir_ffi/in_pointer.rb +20 -21
  64. data/lib/gir_ffi/info_ext.rb +2 -0
  65. data/lib/gir_ffi/info_ext/i_callable_info.rb +0 -9
  66. data/lib/gir_ffi/info_ext/i_callback_info.rb +17 -0
  67. data/lib/gir_ffi/info_ext/i_function_info.rb +4 -0
  68. data/lib/gir_ffi/info_ext/i_property_info.rb +4 -0
  69. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -0
  70. data/lib/gir_ffi/info_ext/i_signal_info.rb +14 -16
  71. data/lib/gir_ffi/info_ext/i_type_info.rb +72 -34
  72. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +12 -0
  73. data/lib/gir_ffi/info_ext/safe_constant_name.rb +3 -2
  74. data/lib/gir_ffi/interface_base.rb +8 -3
  75. data/lib/gir_ffi/module_base.rb +3 -5
  76. data/lib/gir_ffi/object_base.rb +8 -0
  77. data/lib/gir_ffi/receiver_argument_info.rb +21 -0
  78. data/lib/gir_ffi/receiver_type_info.rb +27 -0
  79. data/lib/gir_ffi/return_value_info.rb +23 -0
  80. data/lib/gir_ffi/signal_base.rb +1 -1
  81. data/lib/{ffi-glib → gir_ffi}/sized_array.rb +10 -6
  82. data/lib/gir_ffi/struct_base.rb +10 -9
  83. data/lib/gir_ffi/type_base.rb +1 -0
  84. data/lib/gir_ffi/type_map.rb +3 -0
  85. data/lib/gir_ffi/unintrospectable_type_info.rb +4 -1
  86. data/lib/gir_ffi/union_base.rb +4 -21
  87. data/lib/gir_ffi/user_data_argument_info.rb +21 -0
  88. data/lib/gir_ffi/user_data_type_info.rb +17 -0
  89. data/lib/gir_ffi/user_defined_type_info.rb +18 -4
  90. data/lib/gir_ffi/version.rb +1 -1
  91. data/lib/gir_ffi/vfunc_base.rb +8 -0
  92. data/lib/gir_ffi/vfunc_implementation.rb +11 -0
  93. data/lib/gir_ffi/zero_terminated.rb +18 -24
  94. data/test/base_test_helper.rb +2 -3
  95. data/test/ffi-glib/array_test.rb +3 -3
  96. data/test/ffi-glib/ruby_closure_test.rb +3 -3
  97. data/test/ffi-gobject/value_test.rb +15 -1
  98. data/test/ffi-gobject_test.rb +2 -1
  99. data/test/gir_ffi/arg_helper_test.rb +21 -2
  100. data/test/gir_ffi/builders/argument_builder_test.rb +213 -287
  101. data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
  102. data/test/gir_ffi/builders/callback_builder_test.rb +26 -8
  103. data/test/gir_ffi/builders/field_builder_test.rb +18 -3
  104. data/test/gir_ffi/builders/function_builder_test.rb +30 -12
  105. data/test/gir_ffi/builders/interface_builder_test.rb +9 -0
  106. data/test/gir_ffi/builders/module_builder_test.rb +0 -39
  107. data/test/gir_ffi/builders/object_builder_test.rb +27 -27
  108. data/test/gir_ffi/builders/property_builder_test.rb +110 -0
  109. data/test/gir_ffi/builders/return_value_builder_test.rb +168 -200
  110. data/test/gir_ffi/builders/signal_builder_test.rb +58 -14
  111. data/test/gir_ffi/builders/struct_builder_test.rb +2 -41
  112. data/test/gir_ffi/builders/user_defined_builder_test.rb +88 -20
  113. data/test/gir_ffi/builders/vfunc_builder_test.rb +44 -0
  114. data/test/gir_ffi/g_type_test.rb +29 -0
  115. data/test/gir_ffi/in_pointer_test.rb +28 -9
  116. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -9
  117. data/test/gir_ffi/info_ext/i_callback_info_test.rb +19 -0
  118. data/test/gir_ffi/info_ext/i_function_info_test.rb +9 -0
  119. data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -11
  120. data/test/gir_ffi/info_ext/i_type_info_test.rb +140 -16
  121. data/test/gir_ffi/interface_base_test.rb +9 -3
  122. data/test/gir_ffi/object_base_test.rb +1 -2
  123. data/test/{ffi-glib → gir_ffi}/sized_array_test.rb +28 -28
  124. data/test/gir_ffi/type_map_test.rb +1 -1
  125. data/test/gir_ffi/user_defined_type_info_test.rb +36 -4
  126. data/test/gir_ffi_test.rb +5 -5
  127. data/test/gir_ffi_test_helper.rb +4 -0
  128. data/test/integration/generated_gimarshallingtests_test.rb +163 -59
  129. data/test/integration/generated_gobject_test.rb +21 -8
  130. data/test/integration/generated_pango_test.rb +2 -2
  131. data/test/integration/generated_regress_test.rb +361 -101
  132. data/test/lib/autogen.sh +5 -1
  133. metadata +51 -35
  134. data/TODO.rdoc +0 -63
  135. data/lib/gir_ffi-base/gir_ffi/library.rb +0 -17
  136. data/lib/gir_ffi-base/gir_ffi/struct.rb +0 -27
@@ -5,15 +5,6 @@ module GirFFI
5
5
  def argument_ffi_types
6
6
  args.map { |arg| arg.to_ffitype }
7
7
  end
8
-
9
- def return_ffi_type
10
- return_type.to_ffitype
11
- end
12
-
13
- # TODO: Move to extension just for ICallbackInfo
14
- def to_ffitype
15
- Builder.build_class(self)
16
- end
17
8
  end
18
9
  end
19
10
  end
@@ -0,0 +1,17 @@
1
+ module GirFFI
2
+ module InfoExt
3
+ # Extensions for GObjectIntrospection::ICallbackInfo needed by GirFFI
4
+ module ICallbackInfo
5
+ def to_ffitype
6
+ Builder.build_class(self)
7
+ end
8
+
9
+ def return_ffi_type
10
+ return_type.to_callback_ffitype
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ GObjectIntrospection::ICallbackInfo.send :include, GirFFI::InfoExt::ICallbackInfo
17
+
@@ -8,6 +8,10 @@ module GirFFI
8
8
  types << :pointer if throws?
9
9
  end
10
10
  end
11
+
12
+ def return_ffi_type
13
+ return_type.to_ffitype
14
+ end
11
15
  end
12
16
  end
13
17
  end
@@ -5,6 +5,10 @@ module GirFFI
5
5
  def getter_name
6
6
  name.gsub(/-/, '_')
7
7
  end
8
+
9
+ def setter_name
10
+ "#{getter_name}="
11
+ end
8
12
  end
9
13
  end
10
14
  end
@@ -2,6 +2,7 @@ require 'gir_ffi/builder_helper'
2
2
 
3
3
  module GirFFI
4
4
  module InfoExt
5
+ # Extensions for GObjectIntrospection::IRegisteredTypeInfo needed by GirFFI
5
6
  module IRegisteredTypeInfo
6
7
  def to_ffitype
7
8
  to_type.to_ffitype
@@ -1,7 +1,6 @@
1
1
  module GirFFI
2
2
  module InfoExt
3
3
  # Extensions for GObjectIntrospection::ISignalInfo needed by GirFFI
4
- # TODO: Rename methods to not include 'signal' everywhere.
5
4
  module ISignalInfo
6
5
  # Create a signal hander callback. Wraps the given block in such a way that
7
6
  # arguments and return value are cast correctly to the ruby world and back.
@@ -10,33 +9,32 @@ module GirFFI
10
9
  #
11
10
  # @return [FFI::Function] The signal handler, ready to be passed as a
12
11
  # callback to C.
13
- def signal_callback &block
14
- rettype = self.return_ffi_type
15
- argtypes = self.ffi_callback_argument_types
16
-
12
+ def create_callback &block
17
13
  raise ArgumentError, "Block needed" unless block
18
14
 
19
15
  # TODO: Find the signal module directly, then retrieve the info
20
16
  # from that, instead of vice versa.
21
17
  bldr = Builders::SignalBuilder.new(self)
22
18
  wrapped = bldr.build_class.from(block)
23
- FFI::Function.new rettype, argtypes, &wrapped
19
+ FFI::Function.new return_ffi_type, ffi_callback_argument_types, &wrapped
24
20
  end
25
21
 
26
- def signal_arguments_to_gvalue_array instance, *rest
27
- arr = ::GObject::ValueArray.new self.n_args + 1
28
-
29
- arr.append GObject::Value.wrap_instance(instance)
22
+ # TODO: Use argument info to convert out arguments and array lengths.
23
+ def arguments_to_gvalue_array_pointer object, args
24
+ arr = arguments_to_gvalues object, args
25
+ GirFFI::InPointer.from_array GObject::Value, arr
26
+ end
30
27
 
31
- self.args.zip(rest).each do |info, arg|
32
- arr.append info.argument_type.make_g_value.set_value(arg)
28
+ def arguments_to_gvalues instance, arguments
29
+ arg_values = self.args.zip(arguments).map do |info, arg|
30
+ info.argument_type.make_g_value.set_value(arg)
33
31
  end
34
32
 
35
- arr
33
+ arg_values.unshift GObject::Value.wrap_instance(instance)
36
34
  end
37
35
 
38
- def gvalue_for_signal_return_value
39
- GObject::Value.for_g_type return_type.g_type
36
+ def gvalue_for_return_value
37
+ return_type.make_g_value
40
38
  end
41
39
 
42
40
  # TODO: Rename and clarify relation to argument_ffi_types:
@@ -52,7 +50,7 @@ module GirFFI
52
50
  end
53
51
 
54
52
  def return_ffi_type
55
- result = super
53
+ result = return_type.to_ffitype
56
54
  if result == GLib::Boolean
57
55
  :bool
58
56
  else
@@ -2,17 +2,30 @@ require 'gir_ffi/builder_helper'
2
2
 
3
3
  module GirFFI
4
4
  module InfoExt
5
- # Extensions for GObjectIntrospection::IArgInfo needed by GirFFI
5
+ # Extensions for GObjectIntrospection::ITypeInfo needed by GirFFI
6
6
  module ITypeInfo
7
- include BuilderHelper
7
+
8
+ def self.flattened_tag_to_gtype_map
9
+ @flattened_tag_to_gtype_map ||= {
10
+ :array => GObject::TYPE_ARRAY,
11
+ :c => GObject::TYPE_POINTER,
12
+ :gboolean => GObject::TYPE_BOOLEAN,
13
+ :ghash => GObject::TYPE_HASH_TABLE,
14
+ :gint32 => GObject::TYPE_INT,
15
+ :gint64 => GObject::TYPE_INT64,
16
+ :guint64 => GObject::TYPE_UINT64,
17
+ :strv => GObject::TYPE_STRV,
18
+ :utf8 => GObject::TYPE_STRING,
19
+ :void => GObject::TYPE_NONE
20
+ }
21
+ end
8
22
 
9
23
  def g_type
10
- tag = self.tag
11
- case tag
12
- when :interface
24
+ if tag == :interface
13
25
  interface.g_type
14
26
  else
15
- GObject::TYPE_TAG_TO_GTYPE[tag]
27
+ ITypeInfo.flattened_tag_to_gtype_map[flattened_tag] or
28
+ raise "Can't find type for #{flattened_tag} pointer? = #{pointer?}"
16
29
  end
17
30
  end
18
31
 
@@ -22,10 +35,10 @@ module GirFFI
22
35
 
23
36
  def element_type
24
37
  case tag
25
- when :glist, :gslist, :array
26
- subtype_tag_or_class 0
38
+ when :glist, :gslist, :array, :c
39
+ enumerable_element_type
27
40
  when :ghash
28
- [subtype_tag_or_class(0), subtype_tag_or_class(1)]
41
+ dictionary_element_type
29
42
  else
30
43
  nil
31
44
  end
@@ -46,18 +59,16 @@ module GirFFI
46
59
  tag == :interface && interface.info_type
47
60
  end
48
61
 
49
- def subtype_tag_or_class index = 0
50
- param_type(index).tag_or_class
51
- end
52
-
53
62
  def tag_or_class
54
- base = case flattened_tag
55
- when :struct, :union, :object, :interface, :enum, :flags
63
+ base = case tag
64
+ when:interface
56
65
  Builder.build_class interface
66
+ when :ghash
67
+ [tag, *element_type]
57
68
  else
58
69
  flattened_tag
59
70
  end
60
- if pointer? && tag != :utf8 && tag != :filename || interface_type == :object
71
+ if pointer? && tag != :utf8 && tag != :filename
61
72
  [:pointer, base]
62
73
  else
63
74
  base
@@ -67,8 +78,7 @@ module GirFFI
67
78
  TAG_TO_WRAPPER_CLASS_MAP = {
68
79
  :array => 'GLib::Array',
69
80
  :byte_array => 'GLib::ByteArray',
70
- :c => 'GLib::SizedArray',
71
- :callback => 'GirFFI::Callback',
81
+ :c => 'GirFFI::SizedArray',
72
82
  :error => 'GLib::Error',
73
83
  :ghash => 'GLib::HashTable',
74
84
  :glist => 'GLib::List',
@@ -82,8 +92,7 @@ module GirFFI
82
92
 
83
93
  # TODO: Use class rather than class name
84
94
  def argument_class_name
85
- case flattened_tag
86
- when :struct, :union, :object, :interface, :enum, :flags, :callback
95
+ if tag == :interface
87
96
  interface.full_type_name
88
97
  else
89
98
  TAG_TO_WRAPPER_CLASS_MAP[flattened_tag]
@@ -93,28 +102,20 @@ module GirFFI
93
102
  def to_ffitype
94
103
  return :pointer if pointer?
95
104
 
96
- type_tag = tag
97
- case type_tag
105
+ case tag
98
106
  when :interface
99
107
  interface.to_ffitype
100
108
  when :array
101
- subtype = param_type(0).to_ffitype
102
- # NOTE: Don't use pointer directly to appease JRuby.
103
- if subtype == :pointer
104
- subtype = :"uint#{FFI.type_size(:pointer)*8}"
105
- end
106
- [subtype, array_fixed_size]
109
+ [subtype_ffitype(0), array_fixed_size]
107
110
  else
108
- TypeMap.map_basic_type type_tag
111
+ TypeMap.map_basic_type tag
109
112
  end
110
113
  end
111
114
 
112
115
  def to_callback_ffitype
113
- type_tag = tag
114
-
115
116
  return :pointer if pointer?
116
117
 
117
- if type_tag == :interface
118
+ if tag == :interface
118
119
  case interface.info_type
119
120
  when :enum, :flags
120
121
  :int32
@@ -122,16 +123,31 @@ module GirFFI
122
123
  :pointer
123
124
  end
124
125
  else
125
- return TypeMap.map_basic_type type_tag
126
+ TypeMap.map_basic_type tag
126
127
  end
127
128
  end
128
129
 
130
+ def needs_ruby_to_c_conversion_for_functions?
131
+ [ :array, :c, :callback, :ghash, :glist, :gslist, :object, :ptr_array,
132
+ :struct, :strv, :utf8, :void, :zero_terminated ].include?(flattened_tag)
133
+ end
134
+
135
+ def needs_conversion_for_functions?
136
+ [ :array, :byte_array, :c, :error, :filename, :ghash, :glist,
137
+ :gslist, :interface, :object, :ptr_array, :struct, :strv, :union,
138
+ :utf8, :zero_terminated ].include?(flattened_tag)
139
+ end
140
+
141
+ def needs_conversion_for_callbacks?
142
+ flattened_tag == :enum || needs_conversion_for_functions?
143
+ end
144
+
129
145
  def extra_conversion_arguments
130
146
  case flattened_tag
131
147
  when :utf8, :void
132
148
  [flattened_tag]
133
149
  when :c
134
- [subtype_tag_or_class, array_fixed_size]
150
+ [element_type, array_fixed_size]
135
151
  when :array, :ghash, :glist, :gslist, :ptr_array, :zero_terminated
136
152
  [element_type]
137
153
  else
@@ -141,6 +157,28 @@ module GirFFI
141
157
 
142
158
  private
143
159
 
160
+ def subtype_tag_or_class index
161
+ param_type(index).tag_or_class
162
+ end
163
+
164
+ def dictionary_element_type
165
+ [subtype_tag_or_class(0), subtype_tag_or_class(1)]
166
+ end
167
+
168
+ def enumerable_element_type
169
+ subtype_tag_or_class 0
170
+ end
171
+
172
+ def subtype_ffitype(index)
173
+ subtype = param_type(index).to_ffitype
174
+ if subtype == :pointer
175
+ # NOTE: Don't use pointer directly to appease JRuby.
176
+ :"uint#{FFI.type_size(:pointer)*8}"
177
+ else
178
+ subtype
179
+ end
180
+ end
181
+
144
182
  def flattened_array_type
145
183
  if zero_terminated?
146
184
  zero_terminated_array_type
@@ -0,0 +1,12 @@
1
+ module GirFFI
2
+ module InfoExt
3
+ # Extensions for GObjectIntrospection::IVFuncInfo needed by GirFFI
4
+ module IVFuncInfo
5
+ def return_ffi_type
6
+ return_type.to_callback_ffitype
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ GObjectIntrospection::IVFuncInfo.send :include, GirFFI::InfoExt::IVFuncInfo
@@ -13,9 +13,9 @@ module GirFFI
13
13
  end
14
14
  end
15
15
 
16
- # FIXME: Remove leading colons.
16
+ # FIXME: This is invalid for ISignalInfo and IVFuncInfo
17
17
  def full_type_name
18
- "::#{safe_namespace}::#{safe_name}"
18
+ "#{safe_namespace}::#{safe_name}"
19
19
  end
20
20
  end
21
21
  end
@@ -25,3 +25,4 @@ GObjectIntrospection::ICallbackInfo.send :include, GirFFI::InfoExt::SafeConstant
25
25
  GObjectIntrospection::IConstantInfo.send :include, GirFFI::InfoExt::SafeConstantName
26
26
  GObjectIntrospection::IRegisteredTypeInfo.send :include, GirFFI::InfoExt::SafeConstantName
27
27
  GObjectIntrospection::ISignalInfo.send :include, GirFFI::InfoExt::SafeConstantName
28
+ GObjectIntrospection::IVFuncInfo.send :include, GirFFI::InfoExt::SafeConstantName
@@ -1,8 +1,9 @@
1
+ require 'gir_ffi/type_base'
2
+
1
3
  module GirFFI
4
+ # Base module for modules representing GLib interfaces.
2
5
  module InterfaceBase
3
- def gir_ffi_builder
4
- self.const_get :GIR_FFI_BUILDER
5
- end
6
+ include TypeBase
6
7
 
7
8
  def setup_instance_method name
8
9
  gir_ffi_builder.setup_instance_method name
@@ -11,5 +12,9 @@ module GirFFI
11
12
  def wrap ptr
12
13
  ptr.to_object
13
14
  end
15
+
16
+ def to_ffitype
17
+ :pointer
18
+ end
14
19
  end
15
20
  end
@@ -1,4 +1,5 @@
1
1
  module GirFFI
2
+ # Base module for modules representing GLib namespaces.
2
3
  module ModuleBase
3
4
  def method_missing method, *arguments, &block
4
5
  result = setup_method method.to_s
@@ -10,15 +11,12 @@ module GirFFI
10
11
  load_class(classname) || super
11
12
  end
12
13
 
13
- # @deprecated Compatibility function. Remove in 0.7.0.
14
- def load_class classname
15
- setup_class classname
16
- end
17
-
18
14
  def setup_class classname
19
15
  gir_ffi_builder.build_namespaced_class classname.to_s
20
16
  end
21
17
 
18
+ alias load_class setup_class
19
+
22
20
  def gir_ffi_builder
23
21
  self.const_get :GIR_FFI_BUILDER
24
22
  end
@@ -48,5 +48,13 @@ module GirFFI
48
48
  def self.to_ffitype
49
49
  :pointer
50
50
  end
51
+
52
+ def self.copy_value_to_pointer value, pointer, offset=0
53
+ pointer.put_pointer offset, value.to_ptr
54
+ end
55
+
56
+ def self.object_class
57
+ gir_ffi_builder.object_class
58
+ end
51
59
  end
52
60
  end
@@ -0,0 +1,21 @@
1
+ # Class to represent the info for the receiver argument of a callback or signal
2
+ # handler. Implements the necessary parts of IArgumentInfo's interface.
3
+ class GirFFI::ReceiverArgumentInfo
4
+ attr_reader :argument_type
5
+
6
+ def initialize type
7
+ @argument_type = type
8
+ end
9
+
10
+ def direction
11
+ :in
12
+ end
13
+
14
+ def skip?
15
+ false
16
+ end
17
+
18
+ def name
19
+ "_instance"
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ module GirFFI
2
+ # Represents the type of the receiver of a signal or vfunc, conforming, as
3
+ # needed, to the interface of GObjectIntrospection::ITypeInfo
4
+ class ReceiverTypeInfo
5
+ include InfoExt::ITypeInfo
6
+
7
+ def initialize interface_info
8
+ @interface_info = interface_info
9
+ end
10
+
11
+ def interface
12
+ @interface_info
13
+ end
14
+
15
+ def tag
16
+ :interface
17
+ end
18
+
19
+ def pointer?
20
+ false
21
+ end
22
+
23
+ def array_length
24
+ -1
25
+ end
26
+ end
27
+ end