gir_ffi 0.6.7 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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