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
@@ -37,13 +37,12 @@ module GObject
37
37
  return closure
38
38
  end
39
39
 
40
- def self.marshaller(closure, return_value, n_param_values,
41
- param_values, _invocation_hint, _marshal_data)
40
+ def self.marshaller(closure, return_value, param_values,
41
+ _invocation_hint, _marshal_data)
42
42
  rclosure = wrap(closure.to_ptr)
43
+ param_values ||= []
43
44
 
44
- args = n_param_values.times.map {|idx|
45
- Value.wrap(param_values.to_ptr + idx * Value::Struct.size).get_value
46
- }
45
+ args = param_values.map {|value| value.get_value }
47
46
 
48
47
  result = rclosure.invoke_block(*args)
49
48
 
@@ -77,6 +77,8 @@ module GObject
77
77
  TYPE_BOXED => :get_boxed,
78
78
  TYPE_CHAR => :get_char,
79
79
  TYPE_DOUBLE => :get_double,
80
+ TYPE_ENUM => :get_enum_enhanced,
81
+ TYPE_FLAGS => :get_flags,
80
82
  TYPE_FLOAT => :get_float,
81
83
  TYPE_GTYPE => :get_gtype,
82
84
  TYPE_INT64 => :get_int64,
@@ -105,11 +107,6 @@ module GObject
105
107
  send get_method
106
108
  end
107
109
 
108
- # @deprecated Compatibility function. Remove in 0.7.0.
109
- def ruby_value
110
- get_value
111
- end
112
-
113
110
  class << self
114
111
  # TODO: Give more generic name
115
112
  def wrap_ruby_value val
@@ -148,6 +145,11 @@ module GObject
148
145
  set_instance val
149
146
  end
150
147
 
148
+ def get_enum_enhanced
149
+ value = get_enum
150
+ GirFFI::Builder.build_by_gtype(current_gtype).wrap(value)
151
+ end
152
+
151
153
  def check_type_compatibility val
152
154
  if !GObject::Value.type_compatible(GObject.type_from_instance(val), current_gtype)
153
155
  raise ArgumentError, "#{val.class} is incompatible with #{current_gtype_name}"
@@ -1,7 +1,7 @@
1
1
  module GObjectIntrospection
2
2
  # Wraps a GIVFuncInfo struct.
3
3
  # Represents a virtual function.
4
- class IVFuncInfo < IBaseInfo
4
+ class IVFuncInfo < ICallableInfo
5
5
  def flags
6
6
  Lib.g_vfunc_info_get_flags @gobj
7
7
  end
@@ -1,8 +1,6 @@
1
1
  # This section contains code that is needed by GObjectIntrospection, but
2
2
  # belongs in modules that can only be created fully once GObjectIntrospection
3
3
  # is fully loaded.
4
- require 'gir_ffi-base/gir_ffi/library'
5
- require 'gir_ffi-base/gir_ffi/struct'
6
4
  require 'gir_ffi-base/glib/boolean'
7
5
  require 'gir_ffi-base/glib/strv'
8
6
  require 'gir_ffi-base/gobject'
@@ -1,5 +1,6 @@
1
1
  require 'gir_ffi-base/gobject/lib'
2
2
 
3
+ # The part of the GObject namespace that is needed by GObjectIntrospection.
3
4
  module GObject
4
5
  def self.type_init
5
6
  Lib::g_type_init
@@ -1,6 +1,6 @@
1
1
  module GObject
2
2
  module Lib
3
- extend GirFFI::Library
3
+ extend FFI::Library
4
4
  ffi_lib "gobject-2.0"
5
5
  attach_function :g_type_init, [], :void
6
6
  end
@@ -10,8 +10,10 @@ require 'gir_ffi/type_map'
10
10
  require 'gir_ffi/info_ext'
11
11
  require 'gir_ffi/in_pointer'
12
12
  require 'gir_ffi/in_out_pointer'
13
+ require 'gir_ffi/sized_array'
13
14
  require 'gir_ffi/zero_terminated'
14
15
  require 'gir_ffi/arg_helper'
16
+ require 'gir_ffi/user_defined_type_info'
15
17
  require 'gir_ffi/builder'
16
18
 
17
19
  module GirFFI
@@ -5,11 +5,6 @@ module GirFFI
5
5
  module ArgHelper
6
6
  OBJECT_STORE = {}
7
7
 
8
- # @deprecated Compatibility function. Remove in 0.7.0.
9
- def self.ptr_to_utf8 ptr
10
- ptr.to_utf8
11
- end
12
-
13
8
  def self.ptr_to_utf8_length ptr, len
14
9
  ptr.null? ? nil : ptr.read_string(len)
15
10
  end
@@ -29,11 +24,26 @@ module GirFFI
29
24
  case type
30
25
  when :utf8, :filename
31
26
  it.to_utf8
32
- when :gint32
27
+ when :gint32, :gint8
33
28
  cast_pointer_to_int32 it
34
- else
35
- # FIXME: Only handles symbolic types.
29
+ when Class
30
+ type.wrap it
31
+ when :guint32
36
32
  it.address
33
+ when Array
34
+ main_type, subtype = *type
35
+ raise "Unexpected main type #{main_type}" if main_type != :pointer
36
+ case subtype
37
+ when Array
38
+ container_type, *element_type = *subtype
39
+ raise "Unexpected container type #{container_type}" if container_type != :ghash
40
+ GLib::HashTable.wrap(element_type, it)
41
+ else
42
+ raise "Unexpected subtype #{subtype}"
43
+ end
44
+
45
+ else
46
+ raise "Don't know how to cast #{type}"
37
47
  end
38
48
  end
39
49
 
@@ -1,40 +1,55 @@
1
1
  require 'gir_ffi/builders/base_argument_builder'
2
+ require 'gir_ffi/builders/closure_to_pointer_convertor'
3
+ require 'gir_ffi/builders/c_to_ruby_convertor'
4
+ require 'gir_ffi/builders/ruby_to_c_convertor'
5
+ require 'gir_ffi/builders/null_convertor'
2
6
 
3
7
  module GirFFI
4
8
  module Builders
5
9
  # Implements building pre- and post-processing statements for arguments.
6
10
  class ArgumentBuilder < BaseArgumentBuilder
7
- def initialize var_gen, arginfo
8
- super var_gen, arginfo.name, arginfo.argument_type, arginfo.direction
9
- @arginfo = arginfo
10
- end
11
-
12
- def inarg
11
+ def method_argument_name
13
12
  if has_input_value? && !is_array_length_parameter?
14
- @name
13
+ name
15
14
  end
16
15
  end
17
16
 
18
- def retname
17
+ def post_converted_name
18
+ @post_converted_name ||= if has_post_conversion?
19
+ new_variable
20
+ else
21
+ callarg
22
+ end
23
+ end
24
+
25
+ def return_value_name
19
26
  if has_output_value?
20
- @retname ||= @var_gen.new_var
27
+ post_converted_name unless is_array_length_parameter?
21
28
  end
22
29
  end
23
30
 
24
- def pre
31
+ def pre_conversion
25
32
  pr = []
26
- if has_input_value?
33
+ case direction
34
+ when :in
27
35
  pr << fixed_array_size_check if needs_size_check?
28
36
  pr << array_length_assignment if is_array_length_parameter?
37
+ pr << "#{callarg} = #{ingoing_convertor.conversion}"
38
+ when :inout
39
+ pr << fixed_array_size_check if needs_size_check?
40
+ pr << array_length_assignment if is_array_length_parameter?
41
+ pr << out_parameter_preparation
42
+ pr << "#{callarg}.set_value #{ingoing_convertor.conversion}"
43
+ when :out
44
+ pr << out_parameter_preparation
29
45
  end
30
- pr << set_function_call_argument
31
46
  pr
32
47
  end
33
48
 
34
- def post
35
- if has_output_value?
49
+ def post_conversion
50
+ if has_post_conversion?
36
51
  value = output_value
37
- ["#{retname} = #{value}"]
52
+ ["#{post_converted_name} = #{value}"]
38
53
  else
39
54
  []
40
55
  end
@@ -42,19 +57,23 @@ module GirFFI
42
57
 
43
58
  private
44
59
 
60
+ def has_post_conversion?
61
+ has_output_value? && !is_caller_allocated_object?
62
+ end
63
+
45
64
  def output_value
46
- if is_caller_allocated_object?
47
- callarg
65
+ base = "#{callarg}.to_value"
66
+ if @type_info.needs_conversion_for_functions?
67
+ CToRubyConvertor.new(@type_info, base, length_argument_name).conversion
48
68
  else
49
- base = "#{callarg}.to_value"
50
- if needs_outgoing_parameter_conversion?
51
- outgoing_conversion base
52
- else
53
- base
54
- end
69
+ base
55
70
  end
56
71
  end
57
72
 
73
+ def length_argument_name
74
+ length_arg && length_arg.post_converted_name
75
+ end
76
+
58
77
  def is_array_length_parameter?
59
78
  @array_arg
60
79
  end
@@ -65,7 +84,7 @@ module GirFFI
65
84
 
66
85
  def fixed_array_size_check
67
86
  size = type_info.array_fixed_size
68
- "GirFFI::ArgHelper.check_fixed_array_size #{size}, #{@name}, \"#{@name}\""
87
+ "GirFFI::ArgHelper.check_fixed_array_size #{size}, #{name}, \"#{name}\""
69
88
  end
70
89
 
71
90
  def skipped?
@@ -74,33 +93,27 @@ module GirFFI
74
93
  end
75
94
 
76
95
  def has_output_value?
77
- (@direction == :inout || @direction == :out) && !skipped?
96
+ (direction == :inout || direction == :out) && !skipped?
78
97
  end
79
98
 
80
99
  def has_input_value?
81
- (@direction == :inout || @direction == :in) && !skipped?
100
+ (direction == :inout || direction == :in) && !skipped?
82
101
  end
83
102
 
84
103
  def array_length_assignment
85
104
  arrname = @array_arg.name
86
- "#{@name} = #{arrname}.nil? ? 0 : #{arrname}.length"
87
- end
88
-
89
- def set_function_call_argument
90
- value = if skipped?
91
- @direction == :in ? "0" : "nil"
92
- elsif !has_input_value?
93
- if is_caller_allocated_object?
94
- if specialized_type_tag == :array
95
- "#{argument_class_name}.new #{type_info.element_type.inspect}"
96
- else
97
- "#{argument_class_name}.new"
98
- end
105
+ "#{name} = #{arrname}.nil? ? 0 : #{arrname}.length"
106
+ end
107
+
108
+ def out_parameter_preparation
109
+ value = if is_caller_allocated_object?
110
+ if specialized_type_tag == :array
111
+ "#{argument_class_name}.new #{type_info.element_type.inspect}"
99
112
  else
100
- "GirFFI::InOutPointer.for #{type_info.tag_or_class.inspect}"
113
+ "#{argument_class_name}.new"
101
114
  end
102
115
  else
103
- ingoing_parameter_conversion
116
+ "GirFFI::InOutPointer.for #{type_info.tag_or_class.inspect}"
104
117
  end
105
118
  "#{callarg} = #{value}"
106
119
  end
@@ -110,21 +123,15 @@ module GirFFI
110
123
  @arginfo.caller_allocates?
111
124
  end
112
125
 
113
- def ingoing_parameter_conversion
114
- args = conversion_arguments @name
115
-
116
- base = case specialized_type_tag
117
- when :array, :c, :callback, :ghash, :glist, :gslist, :object, :ptr_array,
118
- :struct, :strv, :utf8, :void, :zero_terminated
119
- "#{argument_class_name}.from(#{args})"
120
- else
121
- args
122
- end
123
-
124
- if has_output_value?
125
- "GirFFI::InOutPointer.from #{type_info.tag_or_class.inspect}, #{base}"
126
+ def ingoing_convertor
127
+ if skipped?
128
+ NullConvertor.new("0")
129
+ elsif is_closure
130
+ ClosureToPointerConvertor.new(name)
131
+ elsif @type_info.needs_ruby_to_c_conversion_for_functions?
132
+ RubyToCConvertor.new(@type_info, name)
126
133
  else
127
- base
134
+ NullConvertor.new(name)
128
135
  end
129
136
  end
130
137
  end
@@ -1,123 +1,69 @@
1
1
  module GirFFI
2
- # Abstract parent class of the argument building classes. These
3
- # classes are used by FunctionBuilder to create the code that
4
- # processes each argument before and after the actual function call.
5
- class BaseArgumentBuilder
6
- KEYWORDS = [
7
- "alias", "and", "begin", "break", "case", "class", "def", "do",
8
- "else", "elsif", "end", "ensure", "false", "for", "if", "in",
9
- "module", "next", "nil", "not", "or", "redo", "rescue", "retry",
10
- "return", "self", "super", "then", "true", "undef", "unless",
11
- "until", "when", "while", "yield"
12
- ]
13
-
14
- attr_reader :name, :retname
15
-
16
- attr_accessor :length_arg, :array_arg
17
-
18
- attr_accessor :is_closure
19
-
20
- def initialize var_gen, name, typeinfo, direction
21
- @var_gen = var_gen
22
-
23
- @typeinfo = typeinfo
24
- @direction = direction
25
- @name = safe(name)
26
-
27
- @inarg = nil
28
- @retname = nil
29
-
30
- @length_arg = nil
31
- @array_arg = nil
32
-
33
- @is_closure = false
34
- end
35
-
36
- def type_info
37
- @typeinfo
38
- end
39
-
40
- def specialized_type_tag
41
- type_info.flattened_tag
42
- end
43
-
44
- # TODO: Use class rather than class name
45
- def argument_class_name
46
- type_info.argument_class_name
47
- end
48
-
49
- def array_size
50
- if @length_arg
51
- @length_arg.retname
52
- else
53
- type_info.array_fixed_size
2
+ module Builders
3
+ # Abstract parent class of the argument building classes. These
4
+ # classes are used by FunctionBuilder to create the code that
5
+ # processes each argument before and after the actual function call.
6
+ class BaseArgumentBuilder
7
+ KEYWORDS = [
8
+ "alias", "and", "begin", "break", "case", "class", "def", "do",
9
+ "else", "elsif", "end", "ensure", "false", "for", "if", "in",
10
+ "module", "next", "nil", "not", "or", "redo", "rescue", "retry",
11
+ "return", "self", "super", "then", "true", "undef", "unless",
12
+ "until", "when", "while", "yield"
13
+ ]
14
+
15
+ attr_reader :arginfo
16
+ attr_accessor :length_arg, :array_arg
17
+ attr_accessor :is_closure
18
+
19
+ def initialize var_gen, arginfo
20
+ @var_gen = var_gen
21
+ @arginfo = arginfo
22
+ @length_arg = nil
23
+ @array_arg = nil
24
+ @is_closure = false
54
25
  end
55
- end
56
26
 
57
- def safe name
58
- if KEYWORDS.include? name
59
- "#{name}_"
60
- else
61
- name
27
+ def name
28
+ @name ||= safe(arginfo.name)
62
29
  end
63
- end
64
-
65
- def inarg
66
- @array_arg.nil? ? @inarg : nil
67
- end
68
-
69
- def retval
70
- @array_arg.nil? ? retname : nil
71
- end
72
-
73
- def callarg
74
- @callarg ||= @var_gen.new_var
75
- end
76
30
 
77
- def pre
78
- []
79
- end
80
-
81
- def post
82
- []
83
- end
31
+ def direction
32
+ @direction ||= arginfo.direction
33
+ end
84
34
 
85
- def cleanup
86
- []
87
- end
35
+ def type_info
36
+ @type_info ||= arginfo.argument_type
37
+ end
88
38
 
89
- def new_variable
90
- @var_gen.new_var
91
- end
39
+ def specialized_type_tag
40
+ type_info.flattened_tag
41
+ end
92
42
 
93
- private
43
+ # TODO: Use class rather than class name
44
+ def argument_class_name
45
+ type_info.argument_class_name
46
+ end
94
47
 
95
- def needs_outgoing_parameter_conversion?
96
- [ :array, :byte_array, :c, :error, :filename, :ghash, :glist,
97
- :gslist, :interface, :object, :ptr_array, :struct, :strv, :union,
98
- :utf8, :zero_terminated ].include?(specialized_type_tag)
99
- end
48
+ def array_length_idx
49
+ type_info.array_length
50
+ end
100
51
 
101
- def outgoing_conversion base
102
- args = output_conversion_arguments base
103
- case specialized_type_tag
104
- when :utf8, :filename
105
- "#{base}.to_utf8"
106
- else
107
- "#{argument_class_name}.wrap(#{args})"
52
+ def safe name
53
+ if KEYWORDS.include? name
54
+ "#{name}_"
55
+ else
56
+ name
57
+ end
108
58
  end
109
- end
110
59
 
111
- def output_conversion_arguments arg
112
- if specialized_type_tag == :c
113
- "#{type_info.subtype_tag_or_class.inspect}, #{array_size}, #{arg}"
114
- else
115
- conversion_arguments arg
60
+ def callarg
61
+ @callarg ||= new_variable
116
62
  end
117
- end
118
63
 
119
- def conversion_arguments name
120
- type_info.extra_conversion_arguments.map(&:inspect).push(name).join(", ")
64
+ def new_variable
65
+ @var_gen.new_var
66
+ end
121
67
  end
122
68
  end
123
69
  end