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.
- checksums.yaml +7 -0
- data/{History.txt → Changelog.md} +93 -61
- data/{DESIGN.rdoc → DESIGN.md} +7 -7
- data/README.md +5 -7
- data/TODO.md +90 -0
- data/lib/ffi-glib.rb +0 -1
- data/lib/ffi-glib/array.rb +13 -29
- data/lib/ffi-glib/array_methods.rb +13 -0
- data/lib/ffi-glib/container_class_methods.rb +6 -1
- data/lib/ffi-glib/hash_table.rb +3 -2
- data/lib/ffi-glib/list.rb +3 -17
- data/lib/ffi-glib/list_methods.rb +22 -3
- data/lib/ffi-glib/ptr_array.rb +19 -19
- data/lib/ffi-glib/s_list.rb +3 -17
- data/lib/ffi-gobject.rb +10 -17
- data/lib/ffi-gobject/object.rb +19 -9
- data/lib/ffi-gobject/object_class.rb +14 -0
- data/lib/ffi-gobject/ruby_closure.rb +4 -5
- data/lib/ffi-gobject/value.rb +7 -5
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
- data/lib/gir_ffi-base.rb +0 -2
- data/lib/gir_ffi-base/gobject.rb +1 -0
- data/lib/gir_ffi-base/gobject/lib.rb +1 -1
- data/lib/gir_ffi.rb +2 -0
- data/lib/gir_ffi/arg_helper.rb +18 -8
- data/lib/gir_ffi/builders/argument_builder.rb +62 -55
- data/lib/gir_ffi/builders/base_argument_builder.rb +52 -106
- data/lib/gir_ffi/builders/base_type_builder.rb +3 -3
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +34 -0
- data/lib/gir_ffi/builders/callback_argument_builder.rb +73 -0
- data/lib/gir_ffi/builders/callback_builder.rb +19 -9
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +54 -0
- data/lib/gir_ffi/builders/closure_convertor.rb +9 -0
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +9 -0
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +9 -0
- data/lib/gir_ffi/builders/enum_builder.rb +16 -16
- data/lib/gir_ffi/builders/field_builder.rb +36 -15
- data/lib/gir_ffi/builders/function_builder.rb +32 -27
- data/lib/gir_ffi/builders/interface_builder.rb +14 -4
- data/lib/gir_ffi/builders/mapping_method_builder.rb +95 -43
- data/lib/gir_ffi/builders/module_builder.rb +22 -35
- data/lib/gir_ffi/builders/null_convertor.rb +9 -0
- data/lib/gir_ffi/builders/object_builder.rb +11 -14
- data/lib/gir_ffi/builders/property_builder.rb +107 -9
- data/lib/gir_ffi/builders/registered_type_builder.rb +2 -2
- data/lib/gir_ffi/builders/return_value_builder.rb +42 -33
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +15 -0
- data/lib/gir_ffi/builders/signal_builder.rb +18 -58
- data/lib/gir_ffi/builders/struct_builder.rb +1 -2
- data/lib/gir_ffi/builders/type_builder.rb +1 -0
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -4
- data/lib/gir_ffi/builders/user_defined_builder.rb +151 -26
- data/lib/gir_ffi/builders/vfunc_builder.rb +57 -0
- data/lib/gir_ffi/builders/with_layout.rb +10 -8
- data/lib/gir_ffi/builders/with_methods.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +42 -8
- data/lib/gir_ffi/class_base.rb +1 -2
- data/lib/gir_ffi/enum_base.rb +26 -4
- data/lib/gir_ffi/error_argument_info.rb +21 -0
- data/lib/gir_ffi/{setter_argument_info.rb → field_argument_info.rb} +2 -1
- data/lib/gir_ffi/g_type.rb +25 -0
- data/lib/gir_ffi/in_out_pointer.rb +3 -14
- data/lib/gir_ffi/in_pointer.rb +20 -21
- data/lib/gir_ffi/info_ext.rb +2 -0
- data/lib/gir_ffi/info_ext/i_callable_info.rb +0 -9
- data/lib/gir_ffi/info_ext/i_callback_info.rb +17 -0
- data/lib/gir_ffi/info_ext/i_function_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_property_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -0
- data/lib/gir_ffi/info_ext/i_signal_info.rb +14 -16
- data/lib/gir_ffi/info_ext/i_type_info.rb +72 -34
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +12 -0
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +3 -2
- data/lib/gir_ffi/interface_base.rb +8 -3
- data/lib/gir_ffi/module_base.rb +3 -5
- data/lib/gir_ffi/object_base.rb +8 -0
- data/lib/gir_ffi/receiver_argument_info.rb +21 -0
- data/lib/gir_ffi/receiver_type_info.rb +27 -0
- data/lib/gir_ffi/return_value_info.rb +23 -0
- data/lib/gir_ffi/signal_base.rb +1 -1
- data/lib/{ffi-glib → gir_ffi}/sized_array.rb +10 -6
- data/lib/gir_ffi/struct_base.rb +10 -9
- data/lib/gir_ffi/type_base.rb +1 -0
- data/lib/gir_ffi/type_map.rb +3 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +4 -1
- data/lib/gir_ffi/union_base.rb +4 -21
- data/lib/gir_ffi/user_data_argument_info.rb +21 -0
- data/lib/gir_ffi/user_data_type_info.rb +17 -0
- data/lib/gir_ffi/user_defined_type_info.rb +18 -4
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_base.rb +8 -0
- data/lib/gir_ffi/vfunc_implementation.rb +11 -0
- data/lib/gir_ffi/zero_terminated.rb +18 -24
- data/test/base_test_helper.rb +2 -3
- data/test/ffi-glib/array_test.rb +3 -3
- data/test/ffi-glib/ruby_closure_test.rb +3 -3
- data/test/ffi-gobject/value_test.rb +15 -1
- data/test/ffi-gobject_test.rb +2 -1
- data/test/gir_ffi/arg_helper_test.rb +21 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +213 -287
- data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
- data/test/gir_ffi/builders/callback_builder_test.rb +26 -8
- data/test/gir_ffi/builders/field_builder_test.rb +18 -3
- data/test/gir_ffi/builders/function_builder_test.rb +30 -12
- data/test/gir_ffi/builders/interface_builder_test.rb +9 -0
- data/test/gir_ffi/builders/module_builder_test.rb +0 -39
- data/test/gir_ffi/builders/object_builder_test.rb +27 -27
- data/test/gir_ffi/builders/property_builder_test.rb +110 -0
- data/test/gir_ffi/builders/return_value_builder_test.rb +168 -200
- data/test/gir_ffi/builders/signal_builder_test.rb +58 -14
- data/test/gir_ffi/builders/struct_builder_test.rb +2 -41
- data/test/gir_ffi/builders/user_defined_builder_test.rb +88 -20
- data/test/gir_ffi/builders/vfunc_builder_test.rb +44 -0
- data/test/gir_ffi/g_type_test.rb +29 -0
- data/test/gir_ffi/in_pointer_test.rb +28 -9
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -9
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +19 -0
- data/test/gir_ffi/info_ext/i_function_info_test.rb +9 -0
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -11
- data/test/gir_ffi/info_ext/i_type_info_test.rb +140 -16
- data/test/gir_ffi/interface_base_test.rb +9 -3
- data/test/gir_ffi/object_base_test.rb +1 -2
- data/test/{ffi-glib → gir_ffi}/sized_array_test.rb +28 -28
- data/test/gir_ffi/type_map_test.rb +1 -1
- data/test/gir_ffi/user_defined_type_info_test.rb +36 -4
- data/test/gir_ffi_test.rb +5 -5
- data/test/gir_ffi_test_helper.rb +4 -0
- data/test/integration/generated_gimarshallingtests_test.rb +163 -59
- data/test/integration/generated_gobject_test.rb +21 -8
- data/test/integration/generated_pango_test.rb +2 -2
- data/test/integration/generated_regress_test.rb +361 -101
- data/test/lib/autogen.sh +5 -1
- metadata +51 -35
- data/TODO.rdoc +0 -63
- data/lib/gir_ffi-base/gir_ffi/library.rb +0 -17
- 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,
|
41
|
-
|
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 =
|
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
|
|
data/lib/ffi-gobject/value.rb
CHANGED
@@ -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}"
|
data/lib/gir_ffi-base.rb
CHANGED
@@ -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'
|
data/lib/gir_ffi-base/gobject.rb
CHANGED
data/lib/gir_ffi.rb
CHANGED
@@ -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
|
data/lib/gir_ffi/arg_helper.rb
CHANGED
@@ -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
|
-
|
35
|
-
|
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
|
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
|
-
|
13
|
+
name
|
15
14
|
end
|
16
15
|
end
|
17
16
|
|
18
|
-
def
|
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
|
-
|
27
|
+
post_converted_name unless is_array_length_parameter?
|
21
28
|
end
|
22
29
|
end
|
23
30
|
|
24
|
-
def
|
31
|
+
def pre_conversion
|
25
32
|
pr = []
|
26
|
-
|
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
|
35
|
-
if
|
49
|
+
def post_conversion
|
50
|
+
if has_post_conversion?
|
36
51
|
value = output_value
|
37
|
-
["#{
|
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
|
-
|
47
|
-
|
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
|
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}, #{
|
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
|
-
(
|
96
|
+
(direction == :inout || direction == :out) && !skipped?
|
78
97
|
end
|
79
98
|
|
80
99
|
def has_input_value?
|
81
|
-
(
|
100
|
+
(direction == :inout || direction == :in) && !skipped?
|
82
101
|
end
|
83
102
|
|
84
103
|
def array_length_assignment
|
85
104
|
arrname = @array_arg.name
|
86
|
-
"#{
|
87
|
-
end
|
88
|
-
|
89
|
-
def
|
90
|
-
value = if
|
91
|
-
|
92
|
-
|
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
|
-
"
|
113
|
+
"#{argument_class_name}.new"
|
101
114
|
end
|
102
115
|
else
|
103
|
-
|
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
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
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
|
-
|
134
|
+
NullConvertor.new(name)
|
128
135
|
end
|
129
136
|
end
|
130
137
|
end
|
@@ -1,123 +1,69 @@
|
|
1
1
|
module GirFFI
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
58
|
-
|
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
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
def post
|
82
|
-
[]
|
83
|
-
end
|
31
|
+
def direction
|
32
|
+
@direction ||= arginfo.direction
|
33
|
+
end
|
84
34
|
|
85
|
-
|
86
|
-
|
87
|
-
|
35
|
+
def type_info
|
36
|
+
@type_info ||= arginfo.argument_type
|
37
|
+
end
|
88
38
|
|
89
|
-
|
90
|
-
|
91
|
-
|
39
|
+
def specialized_type_tag
|
40
|
+
type_info.flattened_tag
|
41
|
+
end
|
92
42
|
|
93
|
-
|
43
|
+
# TODO: Use class rather than class name
|
44
|
+
def argument_class_name
|
45
|
+
type_info.argument_class_name
|
46
|
+
end
|
94
47
|
|
95
|
-
|
96
|
-
|
97
|
-
|
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
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
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
|
-
|
112
|
-
|
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
|
-
|
120
|
-
|
64
|
+
def new_variable
|
65
|
+
@var_gen.new_var
|
66
|
+
end
|
121
67
|
end
|
122
68
|
end
|
123
69
|
end
|