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
@@ -18,7 +18,7 @@ module GirFFI
18
18
  def setup_gtype_getter
19
19
  gtype = target_gtype
20
20
  return if gtype.nil?
21
- @klass.instance_eval "
21
+ klass.instance_eval "
22
22
  def self.get_gtype
23
23
  #{gtype}
24
24
  end
@@ -29,7 +29,7 @@ module GirFFI
29
29
  def provide_constructor
30
30
  return if info.find_method 'new'
31
31
 
32
- (class << @klass; self; end).class_eval {
32
+ (class << klass; self; end).class_eval {
33
33
  alias_method :new, :_allocate
34
34
  }
35
35
  end
@@ -1,63 +1,72 @@
1
1
  require 'gir_ffi/builders/base_argument_builder'
2
+ require 'gir_ffi/builders/c_to_ruby_convertor'
3
+ require 'gir_ffi/builders/closure_convertor'
4
+ require 'gir_ffi/builders/constructor_result_convertor'
2
5
 
3
6
  module GirFFI
4
7
  module Builders
5
8
  # Implements building post-processing statements for return values.
6
9
  class ReturnValueBuilder < BaseArgumentBuilder
7
- def initialize var_gen, type_info, is_constructor = false, skip = false
8
- super var_gen, nil, type_info, :return
10
+ def initialize var_gen, arginfo, is_constructor = false
11
+ super var_gen, arginfo
9
12
  @is_constructor = is_constructor
10
- @skip = skip
11
13
  end
12
14
 
13
- def post
14
- if has_conversion?
15
- [ "#{retname} = #{post_conversion}" ]
16
- else
17
- []
18
- end
15
+ def is_relevant?
16
+ !is_void_return_value? && !arginfo.skip?
19
17
  end
20
18
 
21
- def inarg
22
- nil
19
+ def capture_variable_name
20
+ @capture_variable_name ||= new_variable
23
21
  end
24
22
 
25
- def retval
26
- if has_conversion?
27
- super
28
- elsif is_relevant?
29
- callarg
30
- else
31
- nil
23
+ def post_converted_name
24
+ @post_converted_name ||= if has_post_conversion?
25
+ new_variable
26
+ else
27
+ capture_variable_name
28
+ end
29
+ end
30
+
31
+ def return_value_name
32
+ if is_relevant?
33
+ post_converted_name unless array_arg
32
34
  end
33
35
  end
34
36
 
35
- def is_relevant?
36
- !is_void_return_value? && !@skip
37
+ def post_conversion
38
+ if has_post_conversion?
39
+ [ "#{post_converted_name} = #{post_convertor.conversion}" ]
40
+ else
41
+ []
42
+ end
37
43
  end
38
44
 
39
45
  private
40
46
 
41
- def has_conversion?
42
- is_closure || needs_outgoing_parameter_conversion? || needs_constructor_wrap?
47
+ def has_post_conversion?
48
+ is_closure || needs_constructor_wrap? ||
49
+ type_info.needs_conversion_for_functions?
43
50
  end
44
51
 
45
- def post_conversion
46
- if is_closure
47
- "GirFFI::ArgHelper::OBJECT_STORE[#{callarg}.address]"
48
- elsif needs_constructor_wrap?
49
- "self.constructor_wrap(#{callarg})"
50
- else
51
- outgoing_conversion callarg
52
- end
52
+ def post_convertor
53
+ @post_convertor ||= if is_closure
54
+ ClosureConvertor.new(capture_variable_name)
55
+ elsif needs_constructor_wrap?
56
+ ConstructorResultConvertor.new(capture_variable_name)
57
+ else
58
+ CToRubyConvertor.new(type_info,
59
+ capture_variable_name,
60
+ length_argument_name)
61
+ end
53
62
  end
54
63
 
55
- def retname
56
- @retname ||= @var_gen.new_var
64
+ def length_argument_name
65
+ length_arg && length_arg.post_converted_name
57
66
  end
58
67
 
59
68
  def needs_constructor_wrap?
60
- @is_constructor && [ :interface, :object ].include?(specialized_type_tag)
69
+ @is_constructor && specialized_type_tag == :object
61
70
  end
62
71
 
63
72
  def is_void_return_value?
@@ -0,0 +1,15 @@
1
+ class GirFFI::Builders::RubyToCConvertor
2
+ def initialize type_info, argument_name
3
+ @type_info = type_info
4
+ @argument_name = argument_name
5
+ end
6
+
7
+ def conversion
8
+ args = conversion_arguments @argument_name
9
+ "#{@type_info.argument_class_name}.from(#{args})"
10
+ end
11
+
12
+ def conversion_arguments name
13
+ @type_info.extra_conversion_arguments.map(&:inspect).push(name).join(", ")
14
+ end
15
+ end
@@ -1,82 +1,42 @@
1
1
  require 'gir_ffi/builders/base_type_builder'
2
2
  require 'gir_ffi/builders/mapping_method_builder'
3
+ require 'gir_ffi/receiver_type_info'
4
+ require 'gir_ffi/receiver_argument_info'
3
5
  require 'gir_ffi/signal_base'
6
+ require 'gir_ffi/user_data_type_info'
7
+ require 'gir_ffi/user_data_argument_info'
4
8
 
5
9
  module GirFFI
6
10
  module Builders
7
11
  # Implements the creation of a signal module for handling a particular
8
12
  # signal. The type will be attached to the appropriate class.
9
13
  class SignalBuilder < BaseTypeBuilder
10
- class SignalReceiverTypeInfo
11
- include InfoExt::ITypeInfo
12
-
13
- def initialize interface_info
14
- @interface_info = interface_info
15
- end
16
-
17
- def interface
18
- @interface_info
19
- end
20
-
21
- def tag
22
- :interface
23
- end
24
- end
25
-
26
- class SignalReceiverArgumentInfo
27
- attr_reader :argument_type
28
-
29
- def initialize type
30
- @argument_type = type
31
- end
32
-
33
- def closure
34
- -1
35
- end
36
- end
37
-
38
- class UserDataTypeInfo
39
- include InfoExt::ITypeInfo
40
-
41
- def tag
42
- :void
43
- end
44
-
45
- def pointer?
46
- true
47
- end
48
- end
49
-
50
- class UserDataArgumentInfo
51
- attr_reader :argument_type
52
- attr_reader :closure
53
- def initialize type, position
54
- @argument_type = type
55
- @closure = position
56
- end
57
- end
58
-
59
14
  def instantiate_class
60
- @klass ||= get_or_define_module container_class, @classname
61
15
  unless already_set_up
62
- @klass.extend SignalBase
16
+ klass.extend SignalBase
63
17
  setup_constants
64
- @klass.class_eval mapping_method_definition
18
+ klass.class_eval mapping_method_definition
65
19
  end
66
- @klass
20
+ klass
21
+ end
22
+
23
+ def klass
24
+ @klass ||= get_or_define_module container_class, @classname
67
25
  end
68
26
 
69
27
  def mapping_method_definition
70
28
  arg_infos = info.args
71
29
 
72
- container_type_info = SignalReceiverTypeInfo.new(container_info)
73
- arg_infos.unshift SignalReceiverArgumentInfo.new(container_type_info)
30
+ container_type_info = ReceiverTypeInfo.new(container_info)
31
+ receiver_info = ReceiverArgumentInfo.new(container_type_info)
74
32
 
75
33
  user_data_type_info = UserDataTypeInfo.new
76
- user_data_argument_info = UserDataArgumentInfo.new(user_data_type_info, arg_infos.length)
77
- arg_infos.push user_data_argument_info
34
+ user_data_argument_info = UserDataArgumentInfo.new(user_data_type_info)
78
35
 
79
- MappingMethodBuilder.new(arg_infos, info.return_type).method_definition
36
+ MappingMethodBuilder.for_signal(receiver_info,
37
+ arg_infos,
38
+ user_data_argument_info,
39
+ info.return_type).method_definition
80
40
  end
81
41
 
82
42
  def container_class
@@ -23,8 +23,7 @@ module GirFFI
23
23
 
24
24
  # FIXME: Private method only in subclass
25
25
  def layout_superclass
26
- # FIXME: Is this needed now that StructBase is a DataConverter?
27
- GirFFI::Struct
26
+ FFI::Struct
28
27
  end
29
28
 
30
29
  def superclass
@@ -7,6 +7,7 @@ require 'gir_ffi/builders/struct_builder'
7
7
  require 'gir_ffi/builders/signal_builder'
8
8
  require 'gir_ffi/builders/unintrospectable_builder'
9
9
  require 'gir_ffi/builders/union_builder'
10
+ require 'gir_ffi/builders/vfunc_builder'
10
11
 
11
12
  module GirFFI
12
13
  module Builders
@@ -7,13 +7,13 @@ module GirFFI
7
7
  # cast objects returned by a function that returns an interface.
8
8
  class UnintrospectableBuilder < ObjectBuilder
9
9
  def instantiate_class
10
- gtype = target_gtype
11
- TypeBuilder::CACHE[gtype] ||= Class.new(superclass)
12
- @klass = TypeBuilder::CACHE[gtype]
13
- @structklass = get_or_define_class @klass, :Struct, layout_superclass
14
10
  setup_class unless already_set_up
15
11
  end
16
12
 
13
+ def klass
14
+ @klass ||= TypeBuilder::CACHE[target_gtype] ||= Class.new(superclass)
15
+ end
16
+
17
17
  def setup_class
18
18
  setup_constants
19
19
  setup_layout
@@ -1,4 +1,5 @@
1
1
  require 'gir_ffi/builders/object_builder'
2
+ require 'gir_ffi/g_type'
2
3
 
3
4
  module GirFFI
4
5
  module Builders
@@ -9,25 +10,19 @@ module GirFFI
9
10
  end
10
11
 
11
12
  def instantiate_class
12
- @klass = @info.described_class
13
-
14
- parent_type = @klass.get_gtype
15
- @parent = gir.find_by_gtype(parent_type)
16
-
17
- query_result = GObject.type_query parent_type
18
- type_info = GObject::TypeInfo.new
19
- type_info.class_size = query_result.class_size
20
- type_info.instance_size = query_result.instance_size
21
- properties.each do
22
- type_info.instance_size += FFI.type_size(:int32)
13
+ if already_set_up
14
+ @gtype = klass.get_gtype
15
+ else
16
+ @gtype = GObject.type_register_static(parent_gtype.to_i,
17
+ info.g_name,
18
+ gobject_type_info, 0)
19
+ included_interfaces.each do |interface|
20
+ ifinfo = gobject_interface_info interface
21
+ GObject.type_add_interface_static @gtype, interface.get_gtype, ifinfo
22
+ end
23
+ setup_class
24
+ TypeBuilder::CACHE[@gtype] = klass
23
25
  end
24
-
25
- @gtype = GObject.type_register_static(parent_type, @klass.name,
26
- type_info, 0)
27
-
28
- @structklass = get_or_define_class @klass, :Struct, layout_superclass
29
- setup_class unless already_set_up
30
- TypeBuilder::CACHE[@gtype] = @klass
31
26
  end
32
27
 
33
28
  def setup_class
@@ -41,14 +36,143 @@ module GirFFI
41
36
  setup_constructor
42
37
  end
43
38
 
39
+ def gtype
40
+ @gtype
41
+ end
42
+
44
43
  private
45
44
 
45
+ # FIXME: Is this really used?
46
46
  def target_gtype
47
47
  @gtype
48
48
  end
49
49
 
50
50
  def parent
51
- @parent
51
+ @parent ||= gir.find_by_gtype(parent_gtype.to_i)
52
+ end
53
+
54
+ def parent_gtype
55
+ @parent_gtype ||= GType.new(klass.superclass.get_gtype)
56
+ end
57
+
58
+ def interface_gtypes
59
+ included_interfaces.map {|interface| GType.new(interface.get_gtype) }
60
+ end
61
+
62
+ def included_interfaces
63
+ klass.included_modules - Object.included_modules
64
+ end
65
+
66
+ def klass
67
+ @klass ||= @info.described_class
68
+ end
69
+
70
+ def gobject_type_info
71
+ GObject::TypeInfo.new.tap do |type_info|
72
+ type_info.class_size = class_size
73
+ type_info.instance_size = instance_size
74
+ type_info.class_init = class_init_proc
75
+ end
76
+ end
77
+
78
+ def gobject_interface_info interface
79
+ GObject::InterfaceInfo.new.tap do |interface_info|
80
+ interface_info.interface_init = interface_init_proc(interface)
81
+ end
82
+ end
83
+
84
+ def class_init_proc
85
+ proc do |object_class_ptr, data|
86
+ setup_properties object_class_ptr
87
+ setup_vfuncs object_class_ptr
88
+ end
89
+ end
90
+
91
+ def interface_init_proc interface
92
+ proc do |interface_ptr, data|
93
+ setup_interface_vfuncs interface, interface_ptr
94
+ end
95
+ end
96
+
97
+ def instance_size
98
+ size = parent_gtype.instance_size
99
+ properties.each do
100
+ size += FFI.type_size(:int32)
101
+ end
102
+ return size
103
+ end
104
+
105
+ def class_size
106
+ parent_gtype.class_size + interface_gtypes.map(&:class_size).inject(0, :+)
107
+ end
108
+
109
+ def setup_properties object_class_ptr
110
+ object_class = GObject::ObjectClass.wrap object_class_ptr
111
+
112
+ object_class.get_property = property_getter
113
+ object_class.set_property = property_setter
114
+
115
+ properties.each_with_index do |property, index|
116
+ object_class.install_property index + 1, property.param_spec
117
+ end
118
+ end
119
+
120
+ def property_getter
121
+ proc do |object, property_id, value, pspec|
122
+ value.set_value object.send(pspec.get_name)
123
+ end
124
+ end
125
+
126
+ def property_setter
127
+ proc do |object, property_id, value, pspec|
128
+ object.send("#{pspec.get_name}=", value.get_value)
129
+ end
130
+ end
131
+
132
+ def setup_vfuncs object_class_ptr
133
+ super_class_struct = superclass.gir_ffi_builder.object_class_struct::Struct.new(object_class_ptr)
134
+
135
+ info.vfunc_implementations.each do |impl|
136
+ setup_vfunc super_class_struct, impl
137
+ end
138
+ end
139
+
140
+ def setup_interface_vfuncs interface, interface_ptr
141
+ interface_builder = interface.gir_ffi_builder
142
+
143
+ interface_struct = interface_builder.interface_struct::Struct.new(interface_ptr)
144
+ interface_info = interface_builder.info
145
+
146
+ info.vfunc_implementations.each do |impl|
147
+ setup_interface_vfunc interface_info, interface_struct, impl
148
+ end
149
+ end
150
+
151
+ def setup_vfunc super_class_struct, impl
152
+ vfunc_name = impl.name
153
+ vfunc_info = parent.find_vfunc vfunc_name.to_s
154
+
155
+ if vfunc_info
156
+ install_vfunc super_class_struct, vfunc_name, vfunc_info, impl.implementation
157
+ end
158
+ end
159
+
160
+ def setup_interface_vfunc interface_info, interface_struct, impl
161
+ vfunc_name = impl.name
162
+ vfunc_info = interface_info.find_vfunc vfunc_name.to_s
163
+
164
+ if vfunc_info
165
+ install_vfunc interface_struct, vfunc_name, vfunc_info, impl.implementation
166
+ end
167
+ end
168
+
169
+ def install_vfunc container_struct, vfunc_name, vfunc_info, implementation
170
+ vfunc = VFuncBuilder.new(vfunc_info).build_class
171
+ # NOTE: This assigns a VFuncBase to a CallbackBase.
172
+ # This suggests that the two should be combined, but it seems
173
+ # CallbackBase will not cast the first argument correctly if used
174
+ # to map the implementation proc arguments.
175
+ container_struct[vfunc_name] = vfunc.from implementation
52
176
  end
53
177
 
54
178
  def properties
@@ -73,19 +197,20 @@ module GirFFI
73
197
  end
74
198
 
75
199
  def setup_accessors_for_param_info pinfo
200
+ field_name = pinfo.name
76
201
  code = <<-CODE
77
- def #{pinfo.name}
78
- @struct[:#{pinfo.name}]
202
+ def #{field_name}
203
+ @struct[:#{field_name}]
79
204
  end
80
- def #{pinfo.name}= val
81
- @struct[:#{pinfo.name}] = val
205
+ def #{field_name}= val
206
+ @struct[:#{field_name}] = val
82
207
  end
83
208
  CODE
84
209
 
85
- @klass.class_eval code
210
+ klass.class_eval code
86
211
  end
87
212
 
88
- def method_introspection_data method
213
+ def method_introspection_data _method
89
214
  nil
90
215
  end
91
216
 
@@ -96,7 +221,7 @@ module GirFFI
96
221
  self.wrap(gptr)
97
222
  end
98
223
  CODE
99
- @klass.class_eval code
224
+ klass.class_eval code
100
225
  end
101
226
  end
102
227
  end