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
@@ -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