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
@@ -32,12 +32,12 @@ module GirFFI
32
32
  end
33
33
 
34
34
  def setup_constants
35
- @klass.const_set :GIR_INFO, info
36
- @klass.const_set :GIR_FFI_BUILDER, self
35
+ klass.const_set :GIR_INFO, info
36
+ klass.const_set :GIR_FFI_BUILDER, self
37
37
  end
38
38
 
39
39
  def already_set_up
40
- const_defined_for @klass, :GIR_FFI_BUILDER
40
+ const_defined_for klass, :GIR_FFI_BUILDER
41
41
  end
42
42
 
43
43
  def gir
@@ -0,0 +1,34 @@
1
+ class GirFFI::Builders::CToRubyConvertor
2
+ def initialize type_info, argument_name, length_arg
3
+ @type_info = type_info
4
+ @argument_name = argument_name
5
+ @length_arg = length_arg
6
+ end
7
+
8
+ def conversion
9
+ case @type_info.flattened_tag
10
+ when :utf8, :filename
11
+ "#{@argument_name}.to_utf8"
12
+ else
13
+ "#{@type_info.argument_class_name}.wrap(#{conversion_arguments})"
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def conversion_arguments
20
+ if @type_info.flattened_tag == :c
21
+ "#{@type_info.element_type.inspect}, #{array_size}, #{@argument_name}"
22
+ else
23
+ @type_info.extra_conversion_arguments.map(&:inspect).push(@argument_name).join(", ")
24
+ end
25
+ end
26
+
27
+ def array_size
28
+ if @length_arg
29
+ @length_arg
30
+ else
31
+ @type_info.array_fixed_size
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,73 @@
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/null_convertor'
5
+
6
+ module GirFFI
7
+ module Builders
8
+ class CallbackArgumentBuilder < BaseArgumentBuilder
9
+ def method_argument_name
10
+ @method_argument_name ||= name || new_variable
11
+ end
12
+
13
+ def pre_converted_name
14
+ @pre_converted_name ||= new_variable
15
+ end
16
+
17
+ def call_argument_name
18
+ if direction == :in
19
+ pre_converted_name unless array_arg
20
+ end
21
+ end
22
+
23
+ def capture_variable_name
24
+ if direction == :out
25
+ @capture_variable_name ||= new_variable
26
+ end
27
+ end
28
+
29
+ def pre_conversion
30
+ case direction
31
+ when :in
32
+ [ "#{pre_converted_name} = #{pre_convertor.conversion}" ]
33
+ when :out
34
+ [ "#{pre_converted_name} = #{out_parameter_preparation}" ]
35
+ end
36
+ end
37
+
38
+ def post_conversion
39
+ if direction == :out
40
+ [ "#{pre_converted_name}.set_value #{capture_variable_name}" ]
41
+ else
42
+ []
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def pre_convertor
49
+ @pre_convertor ||= if is_closure
50
+ ClosureConvertor.new(method_argument_name)
51
+ elsif type_info.needs_conversion_for_callbacks?
52
+ CToRubyConvertor.new(type_info,
53
+ method_argument_name,
54
+ length_argument_name)
55
+ else
56
+ NullConvertor.new(method_argument_name)
57
+ end
58
+ end
59
+
60
+ def out_parameter_preparation
61
+ "GirFFI::InOutPointer.new(#{type_info.tag_or_class.inspect}, #{method_argument_name})"
62
+ end
63
+
64
+ def length_argument_name
65
+ length_arg && length_arg.pre_converted_name
66
+ end
67
+
68
+ def is_void_return_value?
69
+ specialized_type_tag == :void && !type_info.pointer?
70
+ end
71
+ end
72
+ end
73
+ end
@@ -9,17 +9,27 @@ module GirFFI
9
9
  # as a callback for FFI.
10
10
  class CallbackBuilder < BaseTypeBuilder
11
11
  def instantiate_class
12
- @klass ||= optionally_define_constant namespace_module, @classname do
13
- cb = lib.callback callback_sym, argument_types, return_type
14
- cb.instance_eval mapping_method_definition
15
- cb.extend CallbackBase
16
- cb
12
+ setup_class unless already_set_up
13
+ end
14
+
15
+ def setup_class
16
+ setup_callback
17
+ setup_constants
18
+ klass.class_eval mapping_method_definition
19
+ end
20
+
21
+ def setup_callback
22
+ optionally_define_constant klass, :Callback do
23
+ lib.callback callback_sym, argument_types, return_type
17
24
  end
18
- @klass
25
+ end
26
+
27
+ def klass
28
+ @klass ||= get_or_define_class namespace_module, @classname, CallbackBase
19
29
  end
20
30
 
21
31
  def mapping_method_definition
22
- MappingMethodBuilder.new(info.args, info.return_type).method_definition
32
+ MappingMethodBuilder.for_callback(info.args, info.return_type).method_definition
23
33
  end
24
34
 
25
35
  def callback_sym
@@ -27,11 +37,11 @@ module GirFFI
27
37
  end
28
38
 
29
39
  def argument_types
30
- @info.argument_ffi_types
40
+ @argument_types ||= @info.argument_ffi_types
31
41
  end
32
42
 
33
43
  def return_type
34
- @info.return_ffi_type
44
+ @return_type ||= @info.return_ffi_type
35
45
  end
36
46
  end
37
47
  end
@@ -0,0 +1,54 @@
1
+ require 'gir_ffi/builders/return_value_builder'
2
+ require 'gir_ffi/builders/ruby_to_c_convertor'
3
+
4
+ module GirFFI
5
+ module Builders
6
+ class CallbackReturnValueBuilder < BaseArgumentBuilder
7
+ def is_relevant?
8
+ !is_void_return_value? && !arginfo.skip?
9
+ end
10
+
11
+ def capture_variable_name
12
+ if is_relevant?
13
+ @capture_variable_name ||= new_variable
14
+ end
15
+ end
16
+
17
+ def post_converted_name
18
+ @post_converted_name ||= if has_post_conversion?
19
+ new_variable
20
+ else
21
+ capture_variable_name
22
+ end
23
+ end
24
+
25
+ def return_value_name
26
+ if is_relevant?
27
+ post_converted_name unless array_arg
28
+ end
29
+ end
30
+
31
+ def post_conversion
32
+ if has_post_conversion?
33
+ [ "#{post_converted_name} = #{post_convertor.conversion}" ]
34
+ else
35
+ []
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def has_post_conversion?
42
+ type_info.needs_conversion_for_callbacks?
43
+ end
44
+
45
+ def post_convertor
46
+ @post_convertor ||= RubyToCConvertor.new(type_info, capture_variable_name)
47
+ end
48
+
49
+ def is_void_return_value?
50
+ specialized_type_tag == :void && !type_info.pointer?
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,9 @@
1
+ class GirFFI::Builders::ClosureConvertor
2
+ def initialize argument_name
3
+ @argument_name = argument_name
4
+ end
5
+
6
+ def conversion
7
+ "GirFFI::ArgHelper::OBJECT_STORE[#{@argument_name}.address]"
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class GirFFI::Builders::ClosureToPointerConvertor
2
+ def initialize argument_name
3
+ @argument_name = argument_name
4
+ end
5
+
6
+ def conversion
7
+ "GirFFI::InPointer.from_closure_data(#{@argument_name})"
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class GirFFI::Builders::ConstructorResultConvertor
2
+ def initialize argument_name
3
+ @argument_name = argument_name
4
+ end
5
+
6
+ def conversion
7
+ "self.constructor_wrap(#{@argument_name})"
8
+ end
9
+ end
@@ -24,21 +24,26 @@ module GirFFI
24
24
  end
25
25
 
26
26
  def instantiate_class
27
- @klass = get_or_define_module namespace_module, @classname
28
- @enum = optionally_define_constant @klass, :Enum do
27
+ @enum = optionally_define_constant klass, :Enum do
29
28
  lib.enum(enum_sym, value_spec)
30
29
  end
31
- unless already_set_up
32
- @klass.extend superclass
33
- setup_constants
34
- setup_gtype_getter
35
- stub_methods
36
- setup_inspect
37
- end
30
+ setup_class unless already_set_up
31
+ end
32
+
33
+ def setup_class
34
+ klass.extend superclass
35
+ setup_constants
36
+ setup_gtype_getter
37
+ stub_methods
38
+ setup_inspect
39
+ end
40
+
41
+ def klass
42
+ @klass ||= get_or_define_module namespace_module, @classname
38
43
  end
39
44
 
40
45
  def setup_inspect
41
- @klass.instance_eval <<-EOS
46
+ klass.instance_eval <<-EOS
42
47
  def self.inspect
43
48
  "#{@namespace}::#{@classname}"
44
49
  end
@@ -46,17 +51,12 @@ module GirFFI
46
51
  end
47
52
 
48
53
  def already_set_up
49
- @klass.respond_to? :get_gtype
54
+ klass.respond_to? :get_gtype
50
55
  end
51
56
 
52
57
  def superclass
53
58
  @superclass ||= EnumBase
54
59
  end
55
-
56
- # FIXME: Remove duplication with ModuleBuilder
57
- def get_or_define_module parent, name
58
- optionally_define_constant(parent, name) { ::Module.new }
59
- end
60
60
  end
61
61
  end
62
62
  end
@@ -1,7 +1,7 @@
1
1
  require 'gir_ffi/builders/argument_builder'
2
2
  require 'gir_ffi/builders/return_value_builder'
3
3
  require 'gir_ffi/variable_name_generator'
4
- require 'gir_ffi/setter_argument_info'
4
+ require 'gir_ffi/field_argument_info'
5
5
 
6
6
  module GirFFI
7
7
  module Builders
@@ -14,10 +14,24 @@ module GirFFI
14
14
  end
15
15
 
16
16
  def build
17
- unless container_info.find_instance_method info.name
18
- container_class.class_eval getter_def
19
- end
20
- container_class.class_eval setter_def if info.writable?
17
+ setup_getter
18
+ setup_setter
19
+ end
20
+
21
+ def setup_getter
22
+ container_class.class_eval getter_def unless container_defines_getter_method?
23
+ end
24
+
25
+ def container_defines_getter_method?
26
+ container_info.find_instance_method info.name
27
+ end
28
+
29
+ def setup_setter
30
+ container_class.class_eval setter_def if is_writable_field?
31
+ end
32
+
33
+ def is_writable_field?
34
+ info.writable?
21
35
  end
22
36
 
23
37
  def getter_def
@@ -30,9 +44,9 @@ module GirFFI
30
44
  def #{info.name}
31
45
  #{field_ptr} = @struct.to_ptr + #{info.offset}
32
46
  #{typed_ptr} = GirFFI::InOutPointer.new(#{field_type_tag_or_class.inspect}, #{field_ptr})
33
- #{builder.callarg} = #{typed_ptr}.to_value
34
- #{builder.post.join("\n")}
35
- #{builder.retval}
47
+ #{builder.capture_variable_name} = #{typed_ptr}.to_value
48
+ #{builder.post_conversion.join("\n")}
49
+ #{builder.return_value_name}
36
50
  end
37
51
  CODE
38
52
  end
@@ -44,10 +58,10 @@ module GirFFI
44
58
  typed_ptr = builder.new_variable
45
59
 
46
60
  return <<-CODE.reset_indentation
47
- def #{info.name}= #{builder.inarg}
61
+ def #{info.name}= #{builder.method_argument_name}
48
62
  #{field_ptr} = @struct.to_ptr + #{info.offset}
49
63
  #{typed_ptr} = GirFFI::InOutPointer.new(#{field_type_tag_or_class.inspect}, #{field_ptr})
50
- #{builder.pre.join("\n ")}
64
+ #{builder.pre_conversion.join("\n ")}
51
65
  #{typed_ptr}.set_value #{builder.callarg}
52
66
  end
53
67
  CODE
@@ -79,15 +93,22 @@ module GirFFI
79
93
  @info.name.to_sym
80
94
  end
81
95
 
96
+ def field_type
97
+ @field_type ||= @info.field_type
98
+ end
99
+
100
+ def field_argument_info
101
+ @field_argument_info ||= FieldArgumentInfo.new "value", field_type
102
+ end
103
+
82
104
  def return_value_builder
83
- vargen = VariableNameGenerator.new
84
- @rv_builder ||= ReturnValueBuilder.new vargen, @info.field_type
105
+ @rv_builder ||= ReturnValueBuilder.new(VariableNameGenerator.new,
106
+ field_argument_info)
85
107
  end
86
108
 
87
109
  def setter_builder
88
- vargen = VariableNameGenerator.new
89
- argument_info = SetterArgumentInfo.new "value", @info.field_type
90
- ArgumentBuilder.new vargen, argument_info
110
+ @setter_builder ||= ArgumentBuilder.new(VariableNameGenerator.new,
111
+ field_argument_info)
91
112
  end
92
113
  end
93
114
  end
@@ -1,4 +1,6 @@
1
1
  require 'gir_ffi/builders/argument_builder'
2
+ require 'gir_ffi/return_value_info'
3
+ require 'gir_ffi/error_argument_info'
2
4
  require 'gir_ffi/builders/return_value_builder'
3
5
  require 'gir_ffi/builders/error_argument_builder'
4
6
  require 'gir_ffi/builders/null_argument_builder'
@@ -17,37 +19,44 @@ module GirFFI
17
19
  vargen = GirFFI::VariableNameGenerator.new
18
20
  @argument_builders = @info.args.map {|arg| ArgumentBuilder.new vargen, arg }
19
21
  @return_value_builder = ReturnValueBuilder.new(vargen,
20
- @info.return_type,
21
- @info.constructor?,
22
- @info.skip_return?)
22
+ ReturnValueInfo.new(@info.return_type, @info.skip_return?),
23
+ @info.constructor?)
23
24
 
24
- link_array_length_arguments
25
+ set_up_argument_relations
25
26
  setup_error_argument vargen
26
27
  return filled_out_template
27
28
  end
28
29
 
29
30
  private
30
31
 
31
- def libmodule
32
- Object.const_get(@info.safe_namespace)::Lib
32
+ def lib_module_name
33
+ "#{@info.safe_namespace}::Lib"
33
34
  end
34
35
 
35
- def link_array_length_arguments
36
+ def set_up_argument_relations
36
37
  alldata = @argument_builders.dup << @return_value_builder
37
38
 
38
- alldata.each {|data|
39
- idx = data.type_info.array_length
40
- if idx > -1
39
+ alldata.each do |data|
40
+ if (idx = data.array_length_idx) >= 0
41
41
  other_data = @argument_builders[idx]
42
42
  data.length_arg = other_data
43
43
  other_data.array_arg = data
44
44
  end
45
- }
45
+ end
46
+
47
+ @argument_builders.each do |data|
48
+ if (idx = data.arginfo.closure) >= 0
49
+ @argument_builders[idx].is_closure = true
50
+ end
51
+ end
46
52
  end
47
53
 
48
54
  def setup_error_argument vargen
49
- klass = @info.throws? ? ErrorArgumentBuilder : NullArgumentBuilder
50
- @errarg = klass.new vargen, nil, nil, :error
55
+ @errarg = if @info.throws?
56
+ ErrorArgumentBuilder.new vargen, ErrorArgumentInfo.new
57
+ else
58
+ NullArgumentBuilder.new
59
+ end
51
60
  end
52
61
 
53
62
  def filled_out_template
@@ -59,17 +68,17 @@ module GirFFI
59
68
  end
60
69
 
61
70
  def method_body
62
- lines = preparation << function_call << post_processing << cleanup
71
+ lines = preparation << function_call << post_processing
63
72
  lines << "return #{return_values.join(', ')}" if has_return_values?
64
73
  lines.flatten.join("\n").indent
65
74
  end
66
75
 
67
76
  def function_call
68
- "#{capture}#{libmodule}.#{@info.symbol} #{function_call_arguments.join(', ')}"
77
+ "#{capture}#{lib_module_name}.#{@info.symbol} #{function_call_arguments.join(', ')}"
69
78
  end
70
79
 
71
80
  def method_arguments
72
- @argument_builders.map(&:inarg).compact
81
+ @argument_builders.map(&:method_argument_name).compact
73
82
  end
74
83
 
75
84
  def function_call_arguments
@@ -80,14 +89,14 @@ module GirFFI
80
89
  end
81
90
 
82
91
  def preparation
83
- pr = @argument_builders.map(&:pre)
92
+ pr = @argument_builders.map(&:pre_conversion)
84
93
  pr << @errarg.pre
85
94
  pr.flatten
86
95
  end
87
96
 
88
97
  def capture
89
98
  if has_capture?
90
- "#{@return_value_builder.callarg} = "
99
+ "#{@return_value_builder.capture_variable_name} = "
91
100
  else
92
101
  ""
93
102
  end
@@ -96,19 +105,15 @@ module GirFFI
96
105
  def post_processing
97
106
  # FIXME: Sorting knows too much about internals of ArgumentBuilder.
98
107
  args = @argument_builders.sort_by {|arg| arg.type_info.array_length}
99
- args << @return_value_builder
100
- args.unshift @errarg
101
-
102
- args.map {|arg| arg.post}
103
- end
104
108
 
105
- def cleanup
106
- @argument_builders.map {|item| item.cleanup}
109
+ result = args.map {|arg| arg.post_conversion}
110
+ result.unshift @errarg.post
111
+ result << @return_value_builder.post_conversion
107
112
  end
108
113
 
109
114
  def return_values
110
- @return_values ||= ([@return_value_builder.retval] +
111
- @argument_builders.map(&:retval)).compact
115
+ @return_values ||= ([@return_value_builder.return_value_name] +
116
+ @argument_builders.map(&:return_value_name)).compact
112
117
  end
113
118
 
114
119
  def has_return_values?